AlarmManager срабатывает при закрытии приложения в Oreo и выше - PullRequest
0 голосов
/ 28 декабря 2018

При использовании AlarmManager в Android 7.1 (Lollipop), а также при закрытии и закрытии приложения выполняются PendingIntent s с Service s, а также с BroadcastReceiver s.В Android 8 (Oreo) и более поздних версиях только BroadcastReceivers выполняются при закрытии приложения.

Вот пример:

Активность

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        long currentTimeMillis = System.currentTimeMillis();
        for (long i = currentTimeMillis; i < currentTimeMillis + 60000; i += 10000) {
            Intent serviceIntent = new Intent(getApplicationContext(), TestService.class);
            PendingIntent servicePendingIntent = PendingIntent.getService(getApplicationContext(), (int) i, serviceIntent, PendingIntent.FLAG_ONE_SHOT);

            Intent receiverIntent = new Intent(getApplicationContext(), TestReceiver.class);
            PendingIntent receiverPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), (int) i, receiverIntent, PendingIntent.FLAG_ONE_SHOT);

            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            alarmManager.set(AlarmManager.RTC_WAKEUP, i, servicePendingIntent);
            alarmManager.set(AlarmManager.RTC_WAKEUP, i, receiverPendingIntent);
        }
    }
}

Служба

public class TestService extends IntentService {
    public TestService() {
        super("TestService");
    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        System.out.println("Service");
    }
}

Получатель

public class TestReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("Receiver");
    }
}

Манифест

<service android:name=".TestService" />
<receiver android:name=".TestReceiver" />

При выполнении этого на Lollipop все ведет себя как ожидалось:

I/System.out: Receiver
I/System.out: Service
I/System.out: Receiver
I/System.out: Service
I/System.out: Receiver
I/System.out: Service
*App closed here*
I/System.out: Receiver
I/System.out: Service
I/System.out: Service
I/System.out: Receiver
I/System.out: Receiver
I/System.out: Service

В то время как на Oreo это происходит:

I/System.out: Service
I/System.out: Receiver
I/System.out: Service
I/System.out: Receiver
*App closed here*
I/System.out: Receiver
I/System.out: Receiver
I/System.out: Receiver
I/System.out: Receiver

Почему AlarmManager с использованием Service s ведет себя по-разному в Oreoчем раньше?

1 Ответ

0 голосов
/ 28 декабря 2018

Android Oreo ограничивает возможность создания фоновых сервисов.См. здесь для получения дополнительной информации.Вам придется кодировать его, используя JobIntentService или подобное.

...