我有我的AlarmManager
,在任何时间后都会导致我的BroadcastReceiver
. 所以当然设备可以处于空闲(睡眠)模式,包括密码锁定。我想知道使用https://developer.android.com/training/scheduling/wakelock.html#javaPowerManager
是否是
好的做法和
必要性
“创建和保持唤醒锁会对主机设备的电池寿命产生巨大影响。因此,您应该仅在绝对必要时使用唤醒锁,并尽可能短地保持它们。例如,您永远不需要使用唤醒锁锁定活动。如上所述,如果您想在活动中保持屏幕开启,请使用 FLAG_KEEP_SCREEN_ON。
为了更好地理解:最后它应该是默认 Android 闹钟的副本。
显现:
<receiver android:name=".AlarmReceiver">
<intent-filter>
<category
android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<activity android:name=".RingtoneAlarm">
</activity>
广播接收器:
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyApp::MyWakelockTag");
wakeLock.acquire(10*60*1000L /*10 minutes*/);
intent.setClassName(context, "com.example.myName.myWork.RingtoneAlarm");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
意图打开的活动:
public class RingtoneAlarm extends AnyOfMyActivitynamesIGuess{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ringtonealarm);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
|WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
|WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
//(setShowWhenLocked(true);setTurnScreenOn(true); My sidenote: both methods are too new for most required API levels)
//Remember to implement: PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyApp::MyWakelockTag"); wakeLock.release();
[...]
}
}
这是我可以让设备在手机处于空闲(睡眠)模式并使用密码锁定的确切时间唤醒的唯一方法。如果我将它PowerManager
放入 RingtoneAlarm Activity 它不起作用,因为没有创建 Activity,因此getWindow().addFlags(....);
没有激活。我找不到让它工作的方法PowerManager
(如前所述:文档说这不是好的做法)。更重要的是,它感觉PowerManager
只是一种解决方法,因为我只需要在BroadcastReceiver
RingtoneAlarm 活动创建之间的那一小段时间里使用它,而且它可能会在未来被弃用,就像FLAG_TURN_SCREEN_ON
.
那么在wakeLock.acquire(X)中应该是多少秒;在广播接收器中?3 秒太短而且不起作用,10 分钟可能有点过头了……或者没有 PowerManager 有更好的解决方案吗?