Запуск приемника, даже если приложение не открыто

Ну, несколько месяцев назад я изучил основы андроида, и теперь я пытаюсь попрактиковаться, чтобы вспомнить, что я изучил. Так что проблема в том, что я делаю приложение, которое, когда оно улавливает изменение состояния экрана (экран включен / выключен), делает что-то. Я хочу, чтобы, когда приложение не запущено (потому что пользователь убил его нажатием кнопки "Домой" или что-то в этом роде), оно все равно делает то, что я хочу. Я решил использовать приемник, но не знаю, правильный ли это вариант.

Если приложение свернуто, оно работает, но проблема заключается в том, что пользователь нажимает кнопку "последние приложения" и перемещает приложение. Тогда получатель ничего не ловит.

В манифесте я заявил:

<receiver android:name=".MyReceiver" android:enabled="true">
    <intent-filter>
       <action android:name="android.intent.action.SCREEN_ON"/>
       <action android:name="android.intent.action.SCREEN_OFF"/>
    </intent-filter>
</receiver>

Моя основная деятельность (может быть, у меня там что-то не так):

public class MainActivity extends Activity {

    private MyReceiver myReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        myReceiver = new MyReceiver();
        registerReceiver(myReceiver, filter);
    }


   @Override
   protected void onDestroy() {
       if (myReceiver != null) {
          unregisterReceiver(myReceiver);
          myReceiver = null;
       }
       super.onDestroy();

   }
}

и мой приемник:

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
       String action = intent.getAction();
       if (action.equals("android.intent.action.SCREEN_OFF")) {
          Log.e("In on receive", "In Method: ACTION_SCREEN_OFF");
          Toast.makeText(context, "DO SOMETHING",Toast.LENGTH_LONG).show();
       }
       else if (action.equals("android.intent.action.SCREEN_ON")) {
          Log.e("In on receive", "In Method: ACTION_SCREEN_ON");
          Toast.makeText(context, "DO SOMETHING2",Toast.LENGTH_LONG).show();
       }
    }
}

Действительно ценю, если вы могли бы посмотреть:D.
Спасибо

1 ответ

Решение

Вы зарегистрировали получателя в манифесте. Так что не регистрируйте и не регистрируйте его в MainActivity. Это проблема. Так что, как только приложение будет убито, onDestroy() Вам позвонят, и ваш получатель не зарегистрирован и больше не будет слушать.

Объявление получателя в манифесте означает, что ваше приложение всегда будет слушать трансляции. И это именно то, что вы хотите. Поэтому удалите часть регистрации / отмены регистрации из MainActivity.

ОБНОВЛЕНИЕ: кажется, что SCREEN_ON и SCREEN_OFF не могут быть зарегистрированы через манифест. Это может быть по соображениям безопасности. Так что в этом случае вы должны зарегистрировать это с помощью кода. Но проблема здесь в том, что, как только вы выходите из приложения, вызывается onDestroy(), и вы больше не слушаете. Если вы действительно нуждаетесь в этой функции, вам необходимо создать службу, которая будет постоянно работать в фоновом режиме. Вы можете использовать это для прослушивания трансляции.

Другие вопросы по тегам