StartActivity() из BroadcastReceiver
Я пытаюсь автозапускать приложение для ночного разряда при зарядке с использованием следующего BroadcastReceiver, реализованного в методе onPause():
BroadcastReceiver test = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
unregisterReceiver(this);
Intent i = new Intent(context, NightClock.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
};
registerReceiver(test, new IntentFilter(Intent.ACTION_POWER_CONNECTED));
Метод onReceive() запускается, когда USB-кабель подключен, но действие не запускается. Однако журнал показывает это:
I/ActivityManager( 79): Starting activity: Intent { flg=0x10000000 cmp=com.meins.nightclock/.NightClock }
Любые идеи, почему журнал говорит, что активность запущена, но ничего не происходит?
Ответы
Ответ 1
Если ваша цель состоит в том, что вы хотите, чтобы NightClock
запускался всякий раз, когда передавалась передача ACTION_POWER_CONNECTED
, ваш подход к использованию BroadcastReceiver
в порядке. Однако не регистрируйте его из активности. Скорее, зарегистрируйте его в манифесте:
<receiver android:name=".OnPowerReceiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
</intent-filter>
</receiver>
Затем создайте BroadcastReceiver
как общедоступный Java-класс (здесь он называется OnPowerReceiver
, хотя вы можете называть его так, как хотите) и вызвать его startActivity()
.
Имейте в виду, что пользователи, вероятно, не хотят, чтобы вы это делали. Есть много других случаев для подключения телефона к власти, кроме запуска "ночных часов". Я смиренно предлагаю вам просто позволить пользователям начать свою деятельность с помощью главного экрана.
Ответ 2
У вас есть контекст, переданный как параметр в метод onRecieve(), поэтому просто используйте:
@Override
public void onReceive(Context context, Intent intent) {
//start activity
Intent i = new Intent();
i.setClassName("com.test", "com.test.MainActivity");
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
Это работает, конечно, вы должны изменить имя класса пакета и класса активности на свой собственный.
Ответ 3
От Документы:
Не запускайте действия из широковещательных приемников, потому что пользовательский процесс раздражает; особенно если имеется более одного приемника. Вместо этого рассмотрите возможность отображения уведомления.