При использовании 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чем раньше?