Подтвердить что ты не робот

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 }

Любые идеи, почему журнал говорит, что активность запущена, но ничего не происходит?

4b9b3361

Ответ 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

От Документы:

Не запускайте действия из широковещательных приемников, потому что пользовательский процесс раздражает; особенно если имеется более одного приемника. Вместо этого рассмотрите возможность отображения уведомления.