5

Şu anda özel bir "Kiosk Modu" uygulamayı amaçlayan özel bir ROM üzerinde (CyanogenMod 11.0 tabanlı) çalışıyorum. Bunu yapmak için, bir uygulamada üç bileşenim var (sistem ayrıcalıklarına sahip): Durum/gezinme çubuğuna yapılan değişiklikleri işleyen ve güç anahtarını devre dışı bırakan servis. BOOT_COMPLETED sinyalinden sonra sadece hizmeti başlatan alıcı alınır. HomeIntentWrapper başlatıcı olarak çalışır ve yalnızca bir özel etkinlik başlatır.Android Özel Launcher startActivity() blokları BOOT_COMPLETED amacı

Şu anda karşı karşıya olduğum sorun, HomeIntentWrapper'daki startActivity(...) komutunun bir şekilde sistemin daha fazla önyükleme yapmasını engelliyor olmasıdır ve BOOT_COMPLETED niyeti asla gönderilmez.

mStartedUsers: 
    User #0: mState=BOOTING 

Ayrıca şimdiye kadar gönderilen BOOT_COMPLETED yayını göstermiyor:

Ben söylüyor adb shell dumpsys activity komutuyla, bu onaylanabilir. kullanıcı Ev-Düğmesi basarsa

Şimdi, BOOT_COMPLETED niyet gönderilir ve mState anahtarları RUNNING etmektir.

HomeIntentWrapper'da bir etkinlik başlatmazsam, niyet gönderilir. Burada neyi yanlış yapıyorum?

AndroidManifest.xml:

<manifest coreApp="true"> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />  

    <application android:allowBackup="true" 
       android:persistent="true" > 

     <service android:name="Service" 
       android:process=":service" > 
      </intent-filter> 
     </service> 

     <receiver android:name="Receiver" 
        android:process=":receiver" > 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
     </receiver> 

     <activity android:name="HomeIntentWrapper" 
        android:process=":launcher" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.HOME" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

Alıcı:

public class Receiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     context.startService(new Intent(context, Service.class)); 
    } 
} 

HomeIntentWrapper:

public class HomeIntentWrapper extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     startApp(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     startApp(); 
    } 

    private void startApp() { 
     SharedPreferences sharedPrefs = getSharedPreferences(getString(R.string.settings_file), Context.MODE_MULTI_PROCESS); 
     String customAppIntentString = sharedPrefs.getString(getString(R.string.settings_custom_intent), ""); 

     if(customAppIntentString.equals("") == false) { 
      try { 
       Intent intent = Intent.getIntent(customAppIntentString); 
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       startActivity(intent); 
      } catch(java.net.URISyntaxException e) { 
       // Intentionally 
      } 
     } 
    } 
} 

cevap

3

Temel neden: Ev Aktivite üstünde olmadığı için finishBooting() çağrılmaz yığını.

http://androidxref.com/4.4.4_r1/xref/frameworks/base/services/java/com/android/server/am/ActivityStackSupervisor.java

Hattı: 1811 Satır: 1883-1886 Satır: 1934-1940

Çözüm:

Boot_Completed alındığında kadar Aktivite başlatmak deme.

+0

Belki bana yardım edebilirsin. ActivityManagerService # finishBooting() öğesinin çağrılmadığı bu duruma sahibim (BOOT_COMPLETED gönderilmiyor) çünkü ActivityManagerService # systemReady() bazen ActivityStackSupervisor # activityIdleInternalLocked() öğesinden sonra çağrılır. Şimdi, systemReady() mBooting = true değerini ayarlar ve eventIdleInternalLocked(), finishBooting() öğesini çağırmak için kontrol etmeden önce true değerine ayarlanması gerekir. Görünüşe göre bir yarış durumu devam ediyor, çünkü bazen işe yarıyor ve bazen değil. Neler olabileceği hakkında bir fikrin var mı? – JohnyTex