锁定屏幕上的服务启动活动会打开屏幕,但不会显示活动本身

时间:2013-12-26 13:20:02

标签: android android-activity

我正在尝试从我已经获得锁定的服务开始一项活动,如下所示:

Intent i = new Intent(context, MyActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_USER_ACTION);
startActivity(i);

活动清单声明如下:

<activity
        android:name=".MyActivity"
        android:configChanges="orientation|screenSize|keyboardHidden|keyboard|navigation"
        android:excludeFromRecents="true"
        android:launchMode="singleInstance"
        android:screenOrientation="nosensor"
        android:showOnLockScreen="true"
        android:taskAffinity=""
        android:theme="@style/MyTheme" />

最后,在onCreate()onAttachedToWindow()上(我尝试了两者),我添加了以下标志:

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
            | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);

问题是我第一次从我的服务中调用startActivity()时,屏幕会亮起,但活动本身并没有显示出来。它显示锁定屏幕。 startActivity()的每次后续调用都能正常工作,但我找不到这种奇怪行为的原因。

我已经尝试过获取完整的唤醒锁而不是部分的建议,根据以下SO答案更改清单中的标志和值:

请注意,我的主题不是对话框,而是全屏活动。

还有其他想法吗?

3 个答案:

答案 0 :(得分:9)

我遇到了同样的问题,经过大量搜索和google后,发现this解锁了屏幕并弹出了我的活动,但它只适用于应用程序运行时(前景/背景)

import android.view.Window;
import android.view.WindowManager.LayoutParams;


Window window = this.getWindow();
window.addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);
window.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);
window.addFlags(LayoutParams.FLAG_TURN_SCREEN_ON);

我正在尝试在应用关闭时开始激活...(使用广播接收器)

文档中的

(例如here)以及SO上的大部分答案都是这样添加的:

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 

但是当我尝试它的方式时,就像在示例中一样,它解锁了屏幕而不是仅仅打开屏幕。

希望这有帮助。它仍然没有完全解决我的问题。

编辑:

发现this帖子解决了我的问题。

那里有一条评论没有使用对话框主题为我解决了它

答案 1 :(得分:0)

由于我的应用程序已包含Service,这就是我所做的:if the screen is locked,我注册了一个广播接收器(比this one简单一点,因为它只对解锁做出反应)一旦屏幕解锁,starts the Activity即可。

答案 2 :(得分:0)

Step 1: Add below code in your activity before
setContentView(R.layout.activity_about_us);

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

Step 2: Lock your mobile than you will see activity in which you have added this code.

如果您想通过skype调用等通知发生来打开特定屏幕,则可以实现此目的。