即使屏幕在Android中被锁定,也会启动活动屏幕

时间:2013-11-21 05:26:03

标签: android android-activity broadcastreceiver screen-lock

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

广播接收器:

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

6 个答案:

答案 0 :(得分:15)

您可以通过两种方式实现这一目标:

  1. 使用唤醒锁,正如@Yup在这篇文章中所解释的那样。

  2. 使用窗口标志。

  3. 使用窗口标记:

    打开要在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" />

检查清单详细信息here。您可以在查询时查看此link

答案 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)

您可以检查here屏幕是锁定还是解锁。

然后,您可以使用唤醒锁定和电源管理选项来维护屏幕而不会被锁定。你可以找到帮助here

答案 4 :(得分:0)

  1. 清单文件授予权限 uses-permission android:name =“android.permission.WAKE_LOCK” 然后在您的需求活动onCreate()
  2. 中编写代码
  3. final Window win = getWindow(); win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

答案 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创建的作品中使用的。