如何使活动不被RecentApps覆盖?

时间:2014-11-14 10:27:02

标签: android

我正在开发锁屏应用。 当锁定屏幕活动正在运行时,长按HOME键或按下RecentApps键将调出RecentApps屏幕,屏幕锁定将被绕过。那么我该如何避免这种情况发生呢? 任何帮助将不胜感激。

编辑: 感谢所有的答案。我的问题中肯定有一些不清楚的地方。我希望HOME长按或导航栏上的RecentApps键在我的活动运行时无法工作。

3 个答案:

答案 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);
    }
}

Reference

希望它有所帮助。

答案 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);
        }
    }
}
相关问题