在Android Oreo及以上版本中,由于后台限制的加强,使用AlarmManager和BroadcastReceiver需要进行一些特殊处理。以下是解决方法的示例代码:
...
...
public class YourBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 在此处处理AlarmManager触发的操作
}
}
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, YourBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, pendingIntent);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, pendingIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, pendingIntent);
}
public class YourActivity extends AppCompatActivity {
private YourBroadcastReceiver broadcastReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
broadcastReceiver = new YourBroadcastReceiver();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
registerReceiver(broadcastReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
} else {
registerReceiver(broadcastReceiver, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(broadcastReceiver);
}
}
通过以上步骤,你应该能够在Android Oreo及以上版本中正确使用AlarmManager和BroadcastReceiver。
上一篇:Android Oreo 崩溃信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR)
下一篇:Android Oreo: 当使用Intent.createChooser包装时,ACTION_GET_CONTENT的URI未被授予FLAG_GRANT_READ_URI_PERMISSION权限。