Ударность () от Broadcastreceiver
-
27-09-2019 - |
Вопрос
Я пытаюсь AutoStart My NightClock приложение на зарядку, используя следующий широковетитель, реализованный в методе 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 }
Любые идеи, почему журнал говорит, что деятельность начинается, но ничего не происходит?
Решение
Если ваша цель в том, что вы хотите 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()
.
Помните, что пользователи, вероятно, не хотят, чтобы вы делали это. Есть много других случаев для подключения телефона к власти, кроме начала «ночных часов». Я смиренно предлагаю вам просто позволять пользователям начать свою деятельность через домашний экран.
Другие советы
У вас есть контекст, пройденный в качестве параметра на 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);
}
Это работает, конечно, вы должны изменить имя класса пакетов и занятий самостоятельно.
От Документы:
Не начинайте мероприятия из широковещательных приемников, потому что пользовательский опыт является Jarring; Особенно, если есть более одного приемника. Вместо этого рассмотрите возможность отображения уведомления.