android拦截最近的应用程序按钮

时间:2013-07-21 05:24:46

标签: android

我有一个适用于儿童的应用程序,我不希望他们能够单击“最近的应用程序”按钮(看起来像两个矩形的按钮)。我正在关注捕获后退按钮和主页按钮,我已经搜索并阅读了很多关于尝试捕获最近的应用程序按钮,但大多数人说你不能或他们这样做的方式是非常值得怀疑的。

应用程序“Kids Place”会弹出一个“不允许操作”的视图,如果您按下“最近使用的应用程序”按钮,会将您重定向到其主屏幕,即使您使用的是其他应用程序,这也会有效,那么它们如何运行这样做?

任何建议,提示都将不胜感激。

感谢。

5 个答案:

答案 0 :(得分:20)

经过大量搜索和编码后,我发现当前最佳解决方案如下:

   @Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);

    if (!hasFocus) {
        windowCloseHandler.postDelayed(windowCloserRunnable, 0);
    }
}

private void toggleRecents() {
    Intent closeRecents = new Intent("com.android.systemui.recent.action.TOGGLE_RECENTS");
    closeRecents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
    ComponentName recents = new ComponentName("com.android.systemui", "com.android.systemui.recent.RecentsActivity");
    closeRecents.setComponent(recents);
    this.startActivity(closeRecents);
}

private Handler windowCloseHandler = new Handler();
private Runnable windowCloserRunnable = new Runnable() {
    @Override
    public void run() {
        ActivityManager am = (ActivityManager)getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
        ComponentName cn = am.getRunningTasks(1).get(0).topActivity;

        if (cn != null && cn.getClassName().equals("com.android.systemui.recent.RecentsActivity")) {
            toggleRecents();
        }
    }
}

这要求您使用<uses-permission android:name="android.permission.GET_TASKS" />

当用户按下最近的应用按钮时使用此方法时,将导致您的活动将经历活动生命周期,如下所示:onPause - &gt; onWindowFocusChanged - &gt;的onResume。

向用户显示按下最近的应用按钮没有响应的行为。注意:我发现如果您快速按下最近的应用程序按钮,它将在短时间内显示该视图。

这不是最好的解决方案,但它是一个很好的解决方案。如果您有更好的解决方案,请分享。

答案 1 :(得分:3)

我找到的最好的方法就是这样做:

public class BaseActivity extends Activity {
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);

            Log.d("Focus debug", "Focus changed !");

        if(!hasFocus) {
            Log.d("Focus debug", "Lost focus !");

            Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
            sendBroadcast(closeDialog);
        }
    }
}// all credit goes here: http://www.juliencavandoli.com/how-to-disable-recent-apps-dialog-on-long-press-home-button/

这不是我自己的代码,但这只是隐藏了最近显示的应用列表。

答案 2 :(得分:1)

在接受的答案中,您仅使用ClassName for Android 4.2 - 4.4。它不适用于5.0及更高版本,或Android 4.1。

以下是主要Android版本的ClassNames列表:

  • Android 4.1:“com.android.internal.policy.impl.RecentApplicationsDialog”
  • Android 4.2 - 4.4:“com.android.systemui.recent.RecentsActivity”
  • Android 5.0 - 7.1:“com.android.systemui.recents.RecentsActivity”(已添加“s”字母)

最适合您的解决方案是使用辅助功能服务。 覆盖onAccessibilityEvent()方法,过滤掉上面列出的ClassNames,并在检测到此事件时执行某些操作。例如,模拟按“主页”按钮。您可以通过在辅助功能服务中进行全局操作来实现此目的。

答案 3 :(得分:0)

感谢 esse 获取更高版本SDK的解决方案!我错过了。

但在我的情况下,我需要重复调​​用(或效果不稳定)

        if (SDK>15){
            windowCloseHandler.postDelayed(windowCloserRunnable, 10);
            windowCloseHandler.postDelayed(windowCloserRunnable, 300);
        }

答案 4 :(得分:0)

如果您对禁用所有系统按钮感兴趣,可能选择完全终止系统栏,请参阅Easy way to hide system bar on Android ICS