我正在开发锁屏应用。 当锁定屏幕活动正在运行时,长按HOME键或按下RecentApps键将调出RecentApps屏幕,屏幕锁定将被绕过。那么我该如何避免这种情况发生呢? 任何帮助将不胜感激。
编辑: 感谢所有的答案。我的问题中肯定有一些不清楚的地方。我希望HOME长按或导航栏上的RecentApps键在我的活动运行时无法工作。
答案 0 :(得分:1)
使用excludeFromRecents
进行活动:
<activity android:name="com.package.MyActivity"
android:label="@string/app_name"
android:excludeFromRecents="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
编辑:
要在应用运行时不显示“近期”应用对话框,请尝试以下操作:
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if(!hasFocus) {
Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
sendBroadcast(closeDialog);
}
}
希望它有所帮助。
答案 1 :(得分:1)
添加此功能并从您onCreate
的{{1}}:
MainActivity
此外,你必须添加:
private void setAsLockScreen() {
getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG | WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
}
到你的Manifest以避免在那里显示应用程序。它实际上并不是必需的,但很高兴。
注意:如果您想使用多个活动,您的默认锁定屏幕将在活动更改时显示很短的时间。我在这里发布了一个解决方案:Android lock screen multiple activities (a.k.a basic kiosk mode)
编辑:有关此方法的一些其他说明。如果您没有实施任何功能以使您的应用程序处于此模式,则您已被锁定:)。在这种情况下,您必须远程卸载该应用程序。
如果您还将android:excludeFromRecents="true"
添加到您的活动并将其设置为默认启动器,它将在启动后自动启动,您将无法再点击主页或返回。可以通过刷掉其他应用程序来清除最近的应用程序。如果没有其他应用,则无法切换到其他应用:)
答案 2 :(得分:0)
这是我的解决方案:
我使用一个Activity来决定通过LockScreenActivity中的符号集来转到Launcher或LockScreenActivity。这种方法在HOME键禁止时效果很好,但在RecentApps上根本不起作用。
然后我注册了一个接收器来接收LockScreenActivity的onPause方法发送的动作。当收到动作时,重新启动LockScreenActivity.And效果很好。
LockScreenActivity:
@Override
protected void onPause() {
super.onPause();
Intent i = new Intent("xx.xx.xx.lockscreen.pause");
sendBroadcast(i);
mCheckLockHandler.postDelayed(mCheckRunnable, 500);//Check again
}
private Runnable mCheckRunnable = new Runnable() {
@Override
public void run() {
Intent intent = new Intent("xx.xx.xx.lockscreen.pause");
sendBroadcast(intent);
}
};
接收者:
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction() == "xx.xx.xx.lockscreen.pause") {
if(SettingsProvider.getBoolean(context, "locked", false)) {
Intent i = new Intent(context, LockScreenActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_SINGLE_TOP |
Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(i);
}
}
}