В настоящее время я работаю над пользовательским ROM (на основе CyanogenMod 11.0), целью которого является реализация пользовательского «режима киоска». Для этого у меня есть три компонента в одном приложении (с системными привилегиями): служба, которая обрабатывает изменения в статусе/навигационной панели и отключает ключ питания. Приемник, который только запускает услугу после приема сигнала BOOT_COMPLETED
. HomeIntentWrapper
работает как пусковая установка и запускает только одно пользовательское действие.Android Custom Launcher startActivity() blocks BOOT_COMPLETED намерение
Проблема, с которой я столкнулся сейчас, заключается в том, что команда startActivity(...)
в HomeIntentWrapper
каким-то образом блокирует систему от загрузки в дальнейшем, а намерение BOOT_COMPLETED
никогда не отправляется.
Я verifed это с adb shell dumpsys activity
командой, которая говорит мне:
mStartedUsers:
User #0: mState=BOOTING
Он также не показывает BOOT_COMPLETED
трансляцию когда-либо отправлены.
Теперь, если пользователь нажимает кнопку «Главная», отправляется намерение BOOT_COMPLETED
, а mState
переключается на RUNNING
.
Если я не начну свою деятельность в HomeIntentWrapper
, цель будет отправлена. Что я здесь делаю неправильно?
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>
Приемник:
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
}
}
}
}
Возможно, вы можете мне помочь. У меня есть такая ситуация, когда ActivityManagerService # finishBooting() не вызывается (делая BOOT_COMPLETED не отправленным), потому что ActivityManagerService # systemReady() иногда вызывается после ActivityStackSupervisor # activityIdleInternalLocked(). Теперь systemReady() устанавливает mBooting = true, и его нужно установить в true до того, как activityIdleInternalLocked() проверит его, чтобы вызвать функцию finishBooting(). Кажется, что происходит гонка, потому что иногда она работает, а иногда нет. Вы хоть представляете, что может быть? – JohnyTex