如何在锁定屏幕上显示Activity或Dialog显示?
通过在Activity.onCreate()方法中设置各种窗口类型,我已经尝试在屏幕打开时显示我的锁定活动:
TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_KEYGUARD
和其他人一起SYSTEM_ALERT_WINDOW和INTERNAL_SYSTEM_WINDOW权限.
解锁设备后,我的活动可见.
更新:
我实际上已经设法显示我自己的Activity而不是默认锁定屏幕.除非您使用HOME按钮,否则它可以完美运行
android dialog lockscreen android-windowmanager android-activity
我正在尝试从已经获得锁定的服务开始活动,如下所示:
Intent i = new Intent(context, MyActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_USER_ACTION);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)
活动清单声明如下:
<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" />
Run Code Online (Sandbox Code Playgroud)
最后,on onCreate()或on 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);
Run Code Online (Sandbox Code Playgroud)
问题是我第一次startActivity()从我的服务中调用时,屏幕会亮起,但活动本身并没有显示出来.它显示锁定屏幕.每次后续调用startActivity()工作正常,但我找不到这种奇怪行为的原因.
我已经尝试过建议获取完整的唤醒锁而不是部分,根据以下SO答案更改清单中的标志和值:
请注意,我的主题不是对话框,而是全屏活动.
还有其他想法吗?
屏幕锁定时,我收到了传入的C2DM通知.我想唤醒屏幕并使用活动在锁定屏幕顶部显示通知消息.我正在从我的C2DM BroadcastReceiver启动通知活动,如下所示:
Intent new_intent= new Intent().setClass( context, EIAlertDialog.class );
new_intent.addFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP );
new_intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
context.startActivity( new_intent );
Run Code Online (Sandbox Code Playgroud)
在通知Activity的onCreate方法中,我按如下方式唤醒屏幕:
PowerManager powerManager= (PowerManager)getSystemService( Context.POWER_SERVICE );
if (!powerManager.isScreenOn()) {
mWakeLock= powerManager.newWakeLock(
PowerManager.FULL_WAKE_LOCK |
PowerManager.ACQUIRE_CAUSES_WAKEUP,
"My Tag" )
mWakeLock.acquire();
}
Run Code Online (Sandbox Code Playgroud)
屏幕被唤醒,但在我解锁屏幕之前,通知活动不可见.
我意识到我可以使用下面的代码来避开锁定屏幕,但这是不可取的.我希望用户解锁手机,只要他/她有兴趣阅读/回复通知.
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
);
Run Code Online (Sandbox Code Playgroud) 我目前很难在全屏模式下显示TYPE_SYSTEM_ALERT窗口.我想这样做是为了在状态栏上有一个从服务创建的叠加视图,但不隐藏它.
但是,将FLAG_FULLSCREEN标志放在我正在创建的窗口的布局参数中似乎不起作用.我找到了STATUS_BAR和EXPAND_STATUS_BAR权限,但我找不到如何使用它们.
这是LayoutParams:
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_FULLSCREEN,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.RIGHT | Gravity.TOP;
mWindowManager.addView(mOverlayView, params);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
谢谢
我不想永久地绕过键盘锁,只是为了这一刻.例如当发出警报时(例如唤醒警报)我可以在解锁屏幕时解除/暂停它.我想要实现同样的行为.我想开始一个对话框应该在锁定的屏幕上.我可以点击对话框上的按钮而不解锁.这可能吗?如果是的话怎么样?
我不想要以下内容:
private void unlockScreen(Context context){
Log.d("dialog", "unlocking screen now");
PowerManager powermanager = ((PowerManager)context.getSystemService(Context.POWER_SERVICE));
WakeLock wakeLock = powermanager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
wakeLock.acquire();
Window wind = DialogActivity.this.getWindow();
wind.addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);
wind.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);
wind.addFlags(LayoutParams.FLAG_TURN_SCREEN_ON);
}
Run Code Online (Sandbox Code Playgroud) 我想构建一个在锁屏上可见的对话框,可以接收触摸事件.我构建了一个窗口,WindowManager但只有TYPE_SYSTEM_OVERLAY标志显示在GB(Android 2.3.7)的锁屏上.
有没有办法创建一个在锁屏上可见的系统覆盖,并可以在Android 2.3.7中接收触摸事件?
有一个错误,FLAG_WATCH_OUTSIDE_TOUCH但我不确定这对我有什么影响.有任何想法吗?
我正在设计一个关于闹钟的应用程序.
即使手机被锁定,如何显示对话框?
我不希望手机解锁.我只是想让它在手机上显示一些文字.用户需要自己解锁手机以获取更多信息.
没有必要使用对话框.我想要的只是一些要显示的文字.
谢谢!
问题我的Android自动化测试不可靠,因为测试的活动有时会运行并且有时会暂停.
原因如果我的Android设备(三星Galaxy S2)启用了锁屏,则所有活动都会立即进入暂停模式.
如何在我的测试运行时以编程方式禁用锁定屏幕?
这是我尝试过的,根本没有产生任何结果(即,锁定屏幕仍处于活动状态并暂停我的活动).
添加android.permission.DISABLE_KEYGUARD权限并KeyguardLock.disableKeyguard()按照android doc中的说明使用.
设置窗口标志:FLAG_SHOW_WHEN_LOCKED,FLAG_TURN_SCREEN_ON,FLAG_DISMISS_KEYGUARD.
使用WakeLock.acquire()带PowerManager.FULL_WAKE_LOCK,PowerManager.ACQUIRE_CAUSES_WAKEUP,PowerManager.ON_AFTER_RELEASE和PowerManager.SCREEN_BRIGHT_WAKE_LOCK参数.
adb shell input keyevent 82