我有前台服务。
清单包含此权限:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />在Splash活动中,我请求此权限一次:
Intent intent = new Intent();
String packageName = context.getPackageName();
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (!pm.isIgnoringBatteryOptimizations(packageName)) {
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
}
context.startActivity(intent);在onCreate服务方法中,我调用createAlarm方法:
private void createAlarm() {
wakeupIntent = PendingIntent.getBroadcast(getBaseContext(), 0, new Intent("com.android.internal.location.ALARM_WAKEUP"), 0);
powerManager = (PowerManager) getSystemService(POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getPackageName() + ":TrackService");
wakeLock.acquire();
dozeHandler = new Handler();
Runnable heartbeat = new Runnable() {
@Override
public void run() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
try {
if (powerManager != null && powerManager.isDeviceIdleMode()) {
try {
Log.d("MainService", "In IDLE MODE");
wakeupIntent.send();
} catch (SecurityException | PendingIntent.CanceledException e) {
Log.d("MainService", "Heartbeat location manager keep-alive failed", e);
}
} else if (!powerManager.isDeviceIdleMode()) {
Log.d("MainService", "Device alive");
}
} finally {
if (dozeHandler != null)
dozeHandler.postDelayed(this, 5000);
}
}
};
heartbeat.run();
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, MyWakefulReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
if (Build.VERSION.SDK_INT >= 23) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, 30000, pendingIntent);
} else {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, 30000, pendingIntent);
}
}并且在调用setWakeLock的所有初始化之后:
@SuppressLint("WakelockTimeout")
public void setWakeMode(Context context, int mode) {
boolean wasHeld = false;
if (wakeLock != null) {
if (wakeLock.isHeld()) {
wasHeld = true;
wakeLock.release();
}
wakeLock = null;
}
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(mode | PowerManager.ON_AFTER_RELEASE, MainService.class.getName());
wakeLock.setReferenceCounted(false);
if (wasHeld) {
wakeLock.acquire();
}
}我对这些功能感到困惑,因此我没有得到唤醒,请帮助我。
发布于 2020-05-01 07:05:54
boolean wasHeld = false;
if (wakeLock != null) {
if (wakeLock.isHeld()) {
wasHeld = true;
wakeLock.release();
}
wakeLock = null;
}仅当'wakeLock.isHeld()‘时,才将'wasHeld’设置为true。仅当'wasHeld‘为true时才调用acquire:
if (wasHeld) {
wakeLock.acquire();
}去掉'if (wasHeld)...‘不管怎样,只要调用acquire,我猜wasHeld总是为false,所以acquire永远不会被调用。
如果它仍然不能工作,根据AndroidStudio文档,您可以:
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
"MyApp::MyWakelockTag");
wakeLock.acquire();并调用
wakeLock.release();完成后。
https://stackoverflow.com/questions/61315787
复制相似问题