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