Obecnie pracuję nad niestandardową pamięcią ROM (opartą na CyanogenMod 11.0), która ma na celu zaimplementowanie niestandardowego "trybu Kiosk". Aby to zrobić, mam trzy komponenty w jednej aplikacji (z uprawnieniami systemowymi): usługa, która obsługuje modyfikacje statusu/paska nawigacyjnego i wyłącza klawisz zasilania. Odbiornik, który uruchamia usługę po sygnale BOOT_COMPLETED
, jest odbierany. HomeIntentWrapper
działa jako program uruchamiający i uruchamia tylko jedną niestandardową aktywność.Android Custom Launcher startActivity() blokuje intencję BOOT_COMPLETED
Problem Jestem obecnie stoi to, że polecenie startActivity(...)
w HomeIntentWrapper
jakoś blokuje układ z uruchomieniem dalej, a BOOT_COMPLETED
intencją nigdy nie zostanie wysłana.
I verifed to z polecenia adb shell dumpsys activity
, który mi mówi:
mStartedUsers:
User #0: mState=BOOTING
również nie pokazuje BOOT_COMPLETED
transmisję kiedykolwiek wysłana.
Teraz, jeśli użytkownik naciśnie przycisk Home, zostanie wysłana zamiana BOOT_COMPLETED
, a mState
zmieni się na RUNNING
.
Jeśli nie rozpocznę aktywności w HomeIntentWrapper
, zostanie wysłane zamiar. Co ja tu robię źle?
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>
Odbiornik:
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
}
}
}
}
Może możesz mi pomóc. Mam tę sytuację, w której ActivityManagerService # finishBooting() nie jest wywoływana (uniemożliwia wysyłanie BOOT_COMPLETED), ponieważ ActivityManagerService # systemReady() jest czasami wywoływana po ActivityStackSupervisor # activityIdleInternalLocked(). Teraz systemReady() ustawia mBooting = true i musi być ustawione na true, zanim activityIdleInternalLocked() sprawdzi to, aby wywołać finishBooting(). Wygląda na to, że dzieje się wyścig, ponieważ czasami działa, a czasami nie. Czy masz pojęcie, co może się dziać? – JohnyTex