Android默认锁定屏幕上的活动


Answers

不要去做活动,因为安全原因,android不会在你的活动后面显示锁屏,所以使用service来代替Activity。

以下是我的服务onStartCommand中的代码。

WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

View mView = mInflater.inflate(R.layout.score, null);

WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
/* | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON */,
PixelFormat.RGBA_8888);

mWindowManager.addView(mView, mLayoutParams);

并将<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />到清单

Question

如何显示ActivityDialog在锁定屏幕上可见?

我已经尝试在Activity.onCreate()方法中通过设置各种窗口类型来显示我的锁定活动:

TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_KEYGUARD

和其他一起使用SYSTEM_ALERT_WINDOWINTERNAL_SYSTEM_WINDOW权限。

我解锁设备后,我的活动是可见的。

更新:

我其实已经设法显示我自己的活动,而不是默认锁定屏幕。 除非您使用HOME按钮,否则它工作正常。




你可以在任何你认为正在工作的答案中使用代码。 然后为了防止HOME按钮工作,将TYPE_SYSTEM_ALERTTYPE_SYSTEM_OVERLAY (取决于您当前使用的)更改为TYPE_SYSTEM_ERROR

params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.MATCH_PARENT,
    WindowManager.LayoutParams.MATCH_PARENT,
    WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
    WindowManager.LayoutParams.FLAG_FULLSCREEN | 
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD,
    PixelFormat.TRANSLUCENT
);
params.gravity = Gravity.TOP;
mOverlay = (RelativeLayout) inflater.inflate(R.layout.main, (ViewGroup) null);
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mWindowManager.addView(mOverlay, params);