5

Attualmente sto lavorando su una ROM personalizzata (basata su CyanogenMod 11.0), che mira a implementare una "Modalità chiosco" personalizzata. Per fare questo, ho tre componenti in un'unica applicazione (con privilegi di sistema): Il servizio, che gestisce le modifiche allo stato/barra di navigazione e disabilita il tasto di accensione. Il ricevitore, che avvia il servizio solo dopo aver ricevuto il segnale BOOT_COMPLETED. Il HomeIntentWrapper funziona come il programma di avvio e avvia solo un'attività personalizzata.Avvio personalizzato Android startActivity() blocchi BOOT_COMPLETED intento

Il problema che sto affrontando attualmente è che il comando startActivity(...) nel HomeIntentWrapper in qualche modo impedisce al sistema di avviarsi ulteriormente e l'intento BOOT_COMPLETED non viene mai inviato.

ho verifed questo con il comando adb shell dumpsys activity, che mi dice:

mStartedUsers: 
    User #0: mState=BOOTING 

Inoltre non mostra l'BOOT_COMPLETED trasmissione mai inviato.

Ora, se l'utente preme il tasto Home, viene inviato l'intento BOOT_COMPLETED e mState passa a RUNNING.

Se non avvio un'attività nel HomeIntentWrapper, l'intento viene inviato. Cosa sto facendo di sbagliato qui?

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> 

Ricevitore:

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 
      } 
     } 
    } 
} 

risposta

3

Causa principale: finishBooting() non è chiamato perché Inizio Attività, non è in cima pila.

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

Linea: 1811 Linea: 1883-1886 Linea: 1934-1940

Soluzione:

Non chiamare avviare attività fino a quando Boot_Completed ricevuto.

+0

Forse puoi aiutarmi. Ho questa situazione in cui ActivityManagerService # finishBooting() non viene chiamato (rendendo BOOT_COMPLETED non inviato) perché ActivityManagerService # systemReady() viene talvolta chiamato dopo ActivityStackSupervisor # activityIdleInternalLocked(). Ora, systemReady() imposta mBooting = true, e deve essere impostato su true prima che activityIdleInternalLocked() lo controlli per chiamare finishBooting(). Sembra che ci sia una condizione di competizione in corso perché a volte funziona e altre volte no. Hai idea di cosa potrebbe succedere? – JohnyTex