我正在尝试从我已经获得锁定的服务开始一项活动,如下所示:
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答案更改清单中的标志和值:
请注意,我的主题不是对话框,而是全屏活动。
还有其他想法吗?
答案 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调用等通知发生来打开特定屏幕,则可以实现此目的。