即使屏幕被锁定,如何在设备上启动活动。我尝试如下,但它不起作用。
广播接收器:
Intent alarmIntent = new Intent("android.intent.action.MAIN");
alarmIntent.setClass(context, Alarm.class);
alarmIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
alarmIntent.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED +
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD +
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON +
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
context.startActivity(alarmIntent);
答案 0 :(得分:15)
您可以通过两种方式实现这一目标:
使用唤醒锁,正如@Yup在这篇文章中所解释的那样。
使用窗口标志。
使用窗口标记:
打开要在onReceive(...)
中启动的活动A.将其粘贴到该活动A的onCreate()
final Window win= getWindow();
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
确保在setContentView(...)
之前没有粘贴它: - )
答案 1 :(得分:13)
您需要AndroidManifest.xml
文件中的以下权限:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
答案 2 :(得分:3)
将此内容粘贴到要锁定屏幕时要打开的活动的 onCreate 方法中,在setContentView()之后
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD|
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
答案 3 :(得分:1)
答案 4 :(得分:0)
答案 5 :(得分:0)
从Android版本10(SDK版本29)开始,如果应用程序在后台(例如,在BroadcastReceiver
中运行,则其他答案将不再起作用。
为了使其能够在Android 10及更高版本上运行,如果您确实需要从后台[source]开始活动,则应使用全屏意图:
Android 10(API级别29)和更高的位置限制,说明当应用程序在后台运行时应用程序何时才能启动活动。这些限制有助于最大程度地减少对用户的干扰,并使用户更好地控制其屏幕上显示的内容。
在几乎所有情况下,后台应用都应显示对时间敏感的通知,以向用户提供紧急信息,而不是直接启动活动。何时使用此类通知的示例包括处理传入的电话或活动的闹钟。
可以通过以下[source]实现:
val fullScreenIntent = Intent(this, CallActivity::class.java)
val fullScreenPendingIntent = PendingIntent.getActivity(this, 0,
fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT)
val notificationBuilder =
NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("Incoming call")
.setContentText("(919) 555-1234")
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_CALL)
// Use a full-screen intent only for the highest-priority alerts where you
// have an associated activity that you would like to launch after the user
// interacts with the notification. Also, if your app targets Android 10
// or higher, you need to request the USE_FULL_SCREEN_INTENT permission in
// order for the platform to invoke this notification.
.setFullScreenIntent(fullScreenPendingIntent, true)
val incomingCallNotification = notificationBuilder.build()
此答案的部分内容是根据shared by the Android Open Source Project中描述的术语复制和Creative Commons 2.5 Attribution License创建的作品中使用的。