我想在锁屏推送通知上启动我的活动而不改变锁屏。
那个活动需要特殊权限吗?
我想在锁屏推送通知上启动我的活动而不改变锁屏。
那个活动需要特殊权限吗?
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1)
{
setShowWhenLocked(true);
setTurnScreenOn(true);
KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
if(keyguardManager!=null)
keyguardManager.requestDismissKeyguard(this, null);
}
else
{
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}
keyguardManager.requestDismissKeyguard(this, null);
?它实际上会导致内存泄漏。 - beginner<activity
android:name=".yourActivityName"
android:showOnLockScreen="true"
android:screenOrientation="sensorPortrait" >
或者在调用setContentView()
之前,在onCreate()方法中编写以下代码:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
android:showOnLockScreen
已被弃用。 - Michał Dobi Dobrzański其他答案可能包含您可能需要或不需要的额外功能。
允许您的活动在锁定屏幕上显示的最少代码是:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= 27)
setShowWhenLocked(true);
else
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
// setContentView etc
}
如果您希望您的活动可以打开屏幕(因为它可能会关闭)或解锁键盘,那么请参阅Vladimir Demirev的回答。
Window window = this.getWindow();
window.addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);
window.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);
window.addFlags(LayoutParams.FLAG_TURN_SCREEN_ON);
显示锁定屏幕上的活动:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
setShowWhenLocked(true)
setTurnScreenOn(true)
} else {
window.addFlags(
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
or WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
)
}
setContentView(binding.root)
...
}
private fun handleButtonClickWhenLocked(clickAction: () -> Unit) {
val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
if (!keyguardManager.isKeyguardLocked) {
clickAction.invoke()
} else {
val keyguardDismissCallback = object : KeyguardManager.KeyguardDismissCallback() {
override fun onDismissSucceeded() {
clickAction.invoke()
}
}
keyguardManager.requestDismissKeyguard(this, keyguardDismissCallback)
}
}