Jim*_*nts 6 android android-wake-lock kotlin
我编写了一种方法来禁用Android锁定屏幕,并使屏幕从待机状态(用于拨号)打开。此方法可正常工作30秒,但随后会触发待机屏幕,该屏幕短暂闪烁。这会触发onPause,onStop,onResume。这不应该发生。哪个标志不正确?实施必须从最新的Android版本开始,直到API 19。
此错误仅在<8.0以下的Android设备上发生。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
disableLockScreen(this)
setContentView(R.layout.activity_main)
Log.i("AppLifecycleTest", "onCreate")
}
override fun onResume() {
super.onResume()
Log.i("AppLifecycleTest", "onResume")
}
override fun onPause() {
super.onPause()
Log.i("AppLifecycleTest", "onPause")
}
override fun onStop() {
super.onStop()
Log.i("AppLifecycleTest", "onStop")
}
override fun onDestroy() {
super.onDestroy()
Log.i("AppLifecycleTest", "onDestroy")
}
@Suppress("DEPRECATION")
private fun disableLockScreen(activity: Activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
activity.setShowWhenLocked(true)
activity.setTurnScreenOn(true)
}
val lock =
(activity.getSystemService(Activity.KEYGUARD_SERVICE) as KeyguardManager).newKeyguardLock(Context.KEYGUARD_SERVICE)
val powerManager = activity.getSystemService(Context.POWER_SERVICE) as PowerManager
val wake = powerManager.newWakeLock(
PowerManager.FULL_WAKE_LOCK or
PowerManager.ACQUIRE_CAUSES_WAKEUP or
PowerManager.ON_AFTER_RELEASE,
"Beterdichtbij:BusSnoozeAlarm"
)
lock.disableKeyguard()
// This timeout doesn't seem to do anything
wake.acquire(6 * 1000L)
activity.window.addFlags(
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
or WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
or WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
or WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
or WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
)
}
Run Code Online (Sandbox Code Playgroud)
启动条件:从内存中删除App并启动,以使屏幕处于活动状态。
LGE Nexus 5X:(Android 7.0,API 24)恰好30秒后屏幕快速闪烁并显示待机菜单,并且切换按钮消失。这会触发onPause,onStop,onResume。这不应该发生。
2019-05-07 10:14:40.613 AppLifecycleTest: onCreate
2019-05-07 10:14:40.616 AppLifecycleTest: onResume
2019-05-07 10:15:10.851 AppLifecycleTest: onPause
2019-05-07 10:15:10.891 AppLifecycleTest: onStop
2019-05-07 10:15:10.994 AppLifecycleTest: onResume
Run Code Online (Sandbox Code Playgroud)
三星Galaxy S8:(Android 8.0,API 26)在不与屏幕互动30秒后,切换按钮消失,但没有触发应用程序生命周期,也没有快速闪烁待机屏幕。这是对的。
2019-05-07 10:23:22.654 AppLifecycleTest: onCreate
2019-05-07 10:23:22.717 AppLifecycleTest: onResume
Run Code Online (Sandbox Code Playgroud)
这个SO线程也有同样的问题,onStop在30秒后触发。
这是我的解决方法,可以解决但不符合文档的要求:
// add to onCreate
private fun initTimer() {
timer = Timer()
timer.schedule(25000L) {
activity.runOnUiThread {
disableLockScreen(activity)
initTimer()
Log.i("AppLifecycleTest", "reset every 25 Seconds")
}
}
}
Run Code Online (Sandbox Code Playgroud)
您只需在activity_main.xml文件中写入即可使屏幕始终保持打开状态。
android:keepScreenOn="true"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
112 次 |
| 最近记录: |