我在android中有一个非常简单的应用程序,第一页有一个按钮,当你在几秒钟后点击它时,它会打开另一个活动,但我想在设备锁定在android 8、9和10中时显示第二个活动什么是最好的解决方案?
理论上,当屏幕关闭时,您应该能够添加一个BroadcastReceiver
来监视ACTION_SCREEN_OFF
被触发,然后启动该活动。
来自文档:
广播操作:当设备进入睡眠状态并变得非交互式时发送。
由于历史原因,此广播动作的名称指的是屏幕的电源状态,但它实际上是响应于设备的整体交互状态的变化而发送的。
此广播是在设备变得非交互式时发送的,这可能与屏幕关闭无关。要确定屏幕的实际状态,请使用Display.getState((.
您需要首先创建一个接收器类:
public class SomeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
.
.
.
然后注册:
class MainActivity : AppCompatActivity() {
private val someReceiver = SomeReceiver()
override fun onStart() {
super.onStart()
val intentFilter = IntentFilter();
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(someReceiver, intentFilter)
}
override fun onDestroy() {
unregisterReceiver(someReceiver)
super.onDestroy()
}
}
请记住新的后台执行限制,这很可能不是用户想要的。相反,考虑安排一个JobIntentService
来做一系列工作。
编辑
由于Android 7和8的变化,以及与后台执行限制相关的变化,以API 26级或更高级别为目标的应用程序无法再在其清单中注册隐式广播的广播接收器。有一些例外,你可以在这里找到
这是我的解决方案,但它不适用于android 10设备
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
KeyguardManager kgm = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
assert kgm != null;
kgm.requestDismissKeyguard(ScreenLock.this, null);
setShowWhenLocked(true);
setTurnScreenOn(true);
}
else
{
final Window win = getWindow();
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
}