15

即使屏幕被锁定,如何在设备上启动 Activity。我尝试如下,但它不工作。

广播接收器:

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);
4

7 回答 7

22

You can achieve this in two ways:

  1. using wake lock as explained by @Yup in this post.

  2. using window flags.

Using window flags:

Open the Activity A which you want to start in onReceive(...). Paste this in onCreate() of that Activity A

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);

Make sure you're not pasting it before setContentView(...) :-)

于 2015-08-02T13:58:59.927 回答
21

您需要在AndroidManifest.xml文件中具有以下权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

在此处查看清单详细信息。您可以在查询时查看此链接

于 2013-11-21T05:46:41.113 回答
10

将此粘贴到您要在屏幕锁定时打开的活动的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); 
于 2019-04-29T10:50:40.447 回答
1

您可以在此处查看屏幕是锁定还是解锁。

然后,您可以使用唤醒锁定和电源管理选项来保持屏幕不被锁定。你可以在这里找到帮助

于 2013-11-21T05:47:14.850 回答
1

从 Android 版本 10(SDK 版本 29)开始,如果应用程序在后台运行,其他答案将不再有效,例如在BroadcastReceiver.

为了使其在 Android 10 及更高版本上运行,如果您确实需要从后台启动 Activity [来源],则应使用全屏 Intent:

Android 10(API 级别 29)及更高版本对应用在后台运行时何时启动 Activity 施加了限制。这些限制有助于最大限度地减少对用户的干扰,并使用户更好地控制屏幕上显示的内容。

在几乎所有情况下,后台应用程序都应该显示时间敏感的通知,以向用户提供紧急信息,而不是直接启动活动。何时使用此类通知的示例包括处理来电或活动闹钟。

这可以通过以下方式实现[来源]:

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()

此答案的部分内容是从Android 开源项目创建和共享的作品中复制而来,并根据Creative Commons 2.5 Attribution License中描述的条款使用。

于 2020-05-04T22:19:39.177 回答
0
  1. 清单文件授予权限 uses-permission android:name="android.permission.WAKE_LOCK" 然后在您的需求活动 onCreate() 中编写代码
  2. 最终窗口 win= getWindow(); win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
于 2018-02-22T11:06:50.803 回答
0

对于某些 Android 8,9,

您需要SYSTME_ALERT_WINDOW在 Manifest 中使用权限并将 Flags 添加到 Start Activity Intent .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

像这样

 val i = Intent(context, AlarmActivity::class.java)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
 it.startActivity(i)

这是在科特林

适用于 Android 10+ 设备

您需要使用带有待处理意图的全屏意图通知来启动您想要的活动。

详细了解全屏意图

全屏意图示例

于 2022-01-19T10:37:16.440 回答