ich zur Zeit auf einem benutzerdefinierten ROM arbeite (basierend auf CyanogenMod 11.0), die einen benutzerdefinierten „Kiosk-Modus“ implementieren soll. Um dies zu tun, ich habe drei Komponenten in einer Anwendung (mit Systemprivilegien): Der Dienst, die Änderungen am Status/navigationbar Griffe und deaktiviert die Power-Taste. Der Empfänger, der den Dienst nur startet, nachdem das Signal BOOT_COMPLETED
empfangen wurde. Die HomeIntentWrapper
fungiert als Startprogramm und startet nur eine benutzerdefinierte Aktivität.Android Individuelle Launcher startActivity() blockiert BOOT_COMPLETED Absicht
Das Problem, mit dem ich derzeit konfrontiert ist, ist, dass die startActivity(...)
Befehl in der HomeIntentWrapper
irgendwie blockiert das System vom Booten weiter, und die BOOT_COMPLETED
Absicht wird nie gesendet.
ich verifed dies mit dem adb shell dumpsys activity
Befehl, der mir sagt:
mStartedUsers:
User #0: mState=BOOTING
Es zeigt auch nicht die BOOT_COMPLETED
Sendung jemals gesendet.
Wenn jetzt der Benutzer die Home-Taste drückt, wird die BOOT_COMPLETED
Absicht gesendet, und die mState
wechselt zu RUNNING
.
Wenn ich schickt keine Aktivität in den HomeIntentWrapper
wird die Absicht starten. Was mache ich hier falsch?
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>
Empfänger:
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
}
}
}
}
Vielleicht können Sie mir helfen. Ich habe diese Situation, in ActivityManagerService # finishBooting() nicht (was BOOT_COMPLETED nicht gesendet) genannt, weil ActivityManagerService # systemReady() manchmal nach ActivityStackSupervisor # activityIdleInternalLocked() aufgerufen wird. Nun systemReady() setzt mBooting = true, und es muss auf true gesetzt werden, bevor activityIdleInternalLocked() überprüft es, um finishBooting() aufrufen. Sieht so aus, als gäbe es eine race-condition, denn manchmal funktioniert es und manchmal nicht. Hast du eine Idee was passieren könnte? – JohnyTex