BroadcastReceiver для SCREEN_ON и SCREEN_OFF даже после выхода из приложения

Обратите внимание на назначение:

ipp = &ip1;

результатов ipp, чтобы указать на ip1.

, поэтому для ipp, чтобы указать на ip2, мы должны изменить аналогичным образом

ipp = &ip2;

, чего мы явно не делаем. Вместо этого мы меняем значение по адресу, указанному в ipp. Выполняя следующее

*ipp = ip2;

, мы просто заменяем значение, сохраненное в ip1.

ipp = &ip1 означает *ipp = ip1 = &i, Now, *ipp = ip2 = &j. Таким образом, *ipp = ip2 по существу такой же, как ip1 = ip2.

0
задан plsz 13 July 2018 в 12:06
поделиться

3 ответа

Вместо создания новой службы для широковещательного приемника вы можете напрямую создать класс вещательного приемника, который будет прослушивать системные трансляции, даже если приложение не работает. Создайте новый класс, который расширяет BroadcastReceiver.

public class YourReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        //Do your stuff
    }
}

И зарегистрируйте его в манифесте.

<receiver
    android:name=".YourReceiver"
    android:enabled="true"
    android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.ACTION_SCREEN_ON" />
            <action android:name="android.intent.action. ACTION_SCREEN_OFF" />
            <category android:name="android.intent.category.DEFAUL" />
        </intent-filter>
</receiver>

Читайте об Manifest-declared receivers здесь .

Выше решение не будет работать, здесь является причиной. Проблема в том, что ваша служба убивается, когда приложение убито, поэтому экземпляр вашего приемника удаляется из памяти. Здесь - это небольшой трюк, чтобы повторно запустить службу в фоновом режиме. Добавьте следующий код в свою службу.

@Override
public void onTaskRemoved(Intent rootIntent){
    Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass());
    restartServiceIntent.setPackage(getPackageName());

    PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
    AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    alarmService.set(
    AlarmManager.ELAPSED_REALTIME,
    SystemClock.elapsedRealtime() + 1000,
    restartServicePendingIntent);

    super.onTaskRemoved(rootIntent);
 }

Хотя это неправильный способ сделать это. Также в Android 26+ вы не сможете это сделать, и вы поедете на службу переднего плана . https://developer.android.com/about/versions/oreo/background

0
ответ дан Ranjan 17 August 2018 в 12:58
поделиться
  • 1
    Функция onReceive не вызывается. Я запустил приложение на эмуляторе с уровнем api 23. – jelson_jacob 13 July 2018 в 14:02
  • 2
    Добавление последнего кода с использованием существующего кода работало над API 24. – Ranjan 14 July 2018 в 00:16
1
ответ дан Ankit Kumar Singh 29 October 2018 в 15:51
поделиться
0
ответ дан KrisG 29 October 2018 в 15:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: