【问题标题】:AlarmManager firing when app closed in Oreo and higher当应用程序在 Oreo 及更高版本中关闭时,AlarmManager 会触发
【发布时间】: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


    【解决方案1】:

    Android Oreo 限制了创建后台服务的能力。有关更多信息,请参阅here。您将不得不使用 JobIntentService 或类似方法围绕它编写代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多