首先,不是直接調用AlarmManager
中的服務,而是調用廣播接收器,然後調用該服務。
廣播接收機應擴展WakefulBroadcastReceiver
而不是常規BroadcastReceiver
。
,然後讓廣播接收機安排新的警報,使用startWakefulService()
代替startService()
public class MyAwesomeReceiver extends WakefulBroadcastReceiver {
int interval=2*60*60*1000;
@Override
public void onReceive(Context context, Intent intent) {
Intent serviceIntent = new Intent(context, MyAwesomeService.class);
Intent receiverIntent = new Intent(context, MyAwesomeReceiver.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 11, receiverIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+interval,alarmIntent);
startWakefulService(context, serviceIntent);
}
}
的WakefulBroadcastReceiver
和startWakefulService()
將讓您的應用程序10秒作爲一個窗口,讓做什麼就需要啓動服務做。
此外,
您可以隨時詢問用戶,讓您的應用程序忽略電池優化功能using-即使不
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
Intent intent=new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
if (powerManager.isIgnoringBatteryOptimizations(getPackageName())) {
intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
}
else {
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
}
,並在清單
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"></uses-permission>
這很好經Google Play批准。是FCM高優先級消息設備可以從Doze中喚醒多久?我已經實現了這一點。上面的代碼來自應用程序列表。我如何確認? – Sri
@srikanth代碼在運行時要求「ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS」權限。如果你在這裏閱讀:https://developer.android.com/training/monitoring-device-state/doze-standby.html#support_for_other_use_cases,你會看到他們的文檔說,它允許你再次訪問部分喚醒鎖,你的應用程序是缺少 – mehulmpt
這不起作用。 :( – Sri