Java 应使用PowerManager唤醒设备多长时间,以确保显示使用BroadcastReceiver创建的活动?
我有我的Java 应使用PowerManager唤醒设备多长时间,以确保显示使用BroadcastReceiver创建的活动?,java,android,broadcastreceiver,alarmmanager,powermanager,Java,Android,Broadcastreceiver,Alarmmanager,Powermanager,我有我的AlarmManager,它在任何时间后都会指向我的BroadcastReceiver。因此,设备当然可以处于空闲(睡眠)模式,包括密码锁定。我想知道使用PowerManager是否是良好的实践和必要的,因为 说 “创建和保持尾流锁会对 主机设备的电池寿命。因此,只有在 绝对必要,并尽可能短时间持有。对于 例如,您不应该在活动中使用唤醒锁 如上所述,如果您想在活动中保持屏幕打开, 使用“保持屏幕打开”标志。“ 为了更好地理解:最终它应该是默认Android闹钟的副本 舱单: &l
AlarmManager
,它在任何时间后都会指向我的BroadcastReceiver
。因此,设备当然可以处于空闲(睡眠)模式,包括密码锁定。我想知道使用PowerManager
是否是良好的实践和必要的,因为
说
“创建和保持尾流锁会对
主机设备的电池寿命。因此,只有在
绝对必要,并尽可能短时间持有。对于
例如,您不应该在活动中使用唤醒锁
如上所述,如果您想在活动中保持屏幕打开,
使用“保持屏幕打开”标志。“
为了更好地理解:最终它应该是默认Android闹钟的副本
舱单:
<receiver android:name=".AlarmReceiver">
<intent-filter>
<category
android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<activity android:name=".RingtoneAlarm">
</activity>
意图开启的活动:
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活动中,它将不工作,因为该活动未创建,因此getWindow().addFlags(…)代码>未激活。如果没有PowerManager,我无法找到一种方法使其工作(如前所述:文档称这不是一种好的做法)。更重要的是,PowerManager
只是一个解决办法,因为我只需要在BroadcastReceiver
和创建RingtoneAlarm活动之间的一小段时间使用它,将来可能会像FLAG\u TURN\u SCREEN\u ON
一样被弃用
那么它在wakeLock中应该有多少秒;在收音机里?3秒太短了,不起作用,10分钟可能有点过分了。。。或者没有PowerManager还有更好的解决方案吗?根据,在Android Q(API 29)及更高版本设备上运行时,根本不允许从后台启动活动
如中所述:
在几乎所有情况下,后台应用程序都应该向用户提供信息,而不是直接启动活动
在特定情况下,您的应用程序可能需要紧急引起用户的注意,例如持续报警或来电。您以前可能已将应用程序配置为为此目的启动后台活动
他们的默认闹钟实际上早在API 11添加API时就已经完成了这项工作(该API在中也可用)。这允许您在通知中添加一个意图,在设备屏幕关闭时自动启动活动,这是闹钟应用程序的推荐做法。当然不推荐使用。是什么给了你这样的印象?请注意,在Android 10上禁止从后台启动活动。请使用全屏显示的高优先级通知。@ianhanniballake对不起,我的意思是FLAG\u TURN\u screen\u ON
。编辑的itI是编程新手:所以我应该忘记PowerManager和getWindow().addFlags(WindowManager.LayoutParams.FLAG_保持屏幕打开| WindowManager.LayoutParams.FLAG_锁定时显示| WindowManager.LayoutParams.FLAG_打开屏幕|代码>对于29岁以下的API,是否为偶数?我更愿意使用setFullScreenIntent
和高于11的每个API的通知来构建它,对吗?@ThomasR-您当然不需要FLAG\u TURN\u SCREEN\u ON
-系统会在使用setFullScreenIntent()时为您打开屏幕
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();
[...]
}
}