【发布时间】:2018-12-29 03:29:02
【问题描述】:
在 Android 7.1 (Lollipop) 及更低版本中使用AlarmManager 并关闭应用程序时,PendingIntents 与Services 以及BroadcastReceivers 的执行相同。在 Android 8 (Oreo) 及更高版本中,应用关闭时仅执行广播接收器。
这是一个例子:
活动
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
而在奥利奥上,会发生这种情况:
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 使用 Services 在 Oreo 中的行为与以前不同?
【问题讨论】:
标签: android android-service alarmmanager android-broadcastreceiver