我有一个适用于儿童的应用程序,我不希望他们能够单击“最近的应用程序”按钮(看起来像两个相互重叠的矩形)。我负责捕获后退按钮和主页按钮,我已经搜索并阅读了很多关于尝试捕获“最近的应用程序”按钮的信息,但大多数人说你不能或者他们这样做的方式非常有问题。
如果您按下“最近使用的应用程序”按钮,应用程序“Kids Place”会弹出一个显示“不允许操作”的视图,并将您重定向到其主屏幕,即使您在其他应用程序中也可以使用,那么他们是如何做到的呢?
任何建议,提示将不胜感激。
谢谢。
我有一个适用于儿童的应用程序,我不希望他们能够单击“最近的应用程序”按钮(看起来像两个相互重叠的矩形)。我负责捕获后退按钮和主页按钮,我已经搜索并阅读了很多关于尝试捕获“最近的应用程序”按钮的信息,但大多数人说你不能或者他们这样做的方式非常有问题。
如果您按下“最近使用的应用程序”按钮,应用程序“Kids Place”会弹出一个显示“不允许操作”的视图,并将您重定向到其主屏幕,即使您在其他应用程序中也可以使用,那么他们是如何做到的呢?
任何建议,提示将不胜感激。
谢谢。
经过大量搜索和编码后,我找到的当前最佳解决方案如下:
@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 -> onWindowFocusChanged -> onResume。
对用户来说,按下最近的应用程序按钮没有响应的行为似乎是。注意:我发现如果您快速按下最近的应用程序按钮,它将在短时间内显示该视图。
这不是最好的解决方案,但它是一个尝试。如果您有更好的解决方案,请分享。
我发现最好的方法是这样做:
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/
这不是我自己的代码,但这只是隐藏了最近的应用程序列表。
在接受的答案中,您仅将 ClassName 用于 Android 4.2 - 4.4。它不适用于 5.0 及更高版本或 Android 4.1。
以下是主要 Android 版本的 ClassNames 列表:
对您来说最好的解决方案是使用无障碍服务。覆盖onAccessibilityEvent()
方法,过滤掉上面列出的 ClassNames 并在检测到此事件时执行一些操作。例如模拟按下“主页”按钮。您可以通过在辅助功能服务中进行全局操作来做到这一点。
感谢esse提供更高 SDK 的解决方案!我错过了。
但就我而言,我需要重复调用(或效果不稳定)
if (SDK>15){
windowCloseHandler.postDelayed(windowCloserRunnable, 10);
windowCloseHandler.postDelayed(windowCloserRunnable, 300);
}
如果您有兴趣禁用所有系统按钮,可以选择完全杀死系统栏,请参阅在 Android ICS 上隐藏系统栏的简单方法