14

我正在为 Android 构建一个儿童游戏应用程序。我需要在使用时禁用所有键。我已将应用程序设置为主页应用程序并禁用后退键(负责主页和后退按钮)。为了清除最近的任务列表,我创建了一个 Dummy Activity 列表,它在应用程序启动时开始然后结束。虚拟活动看起来像:

public class Dummy1 extends Activity
{
  public void onCreate(Bundle paramBundle)
  {
    super.onCreate(paramBundle);
   finish();
}
}

然后在我执行的应用程序的 onCreate 中:

this.pm.setComponentEnabledSetting(new ComponentName(this, Dummy1.class),   PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

Intent localIntent1 = new Intent(this, Dummy1.class);
localIntent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(localIntent1); 

当有人试图按住 Home 键以显示最近的任务时,这会照顾到我创建了 8 个这些任务并且它们都是空的,因此用户无法单击以更改应用程序。

现在我似乎无法禁用的唯一按钮是“最近的任务/应用程序”按钮(主要在 HTC 设备上可用,即 One X、One S 等)。此按钮似乎仍会显示所有最近的任务(即使创建了我的虚拟任务),并且我似乎无法为按下此按钮时触发的事件找到“挂钩”?

注意:我知道这是可行的,因为像 ToddlerLock 这样的应用程序已经做到了......我似乎无法弄清楚。

4

5 回答 5

23

这将关闭“RecentActivity”对话框。把它放在你的活动课上。

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

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

    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" />
于 2013-06-13T19:48:52.783 回答
7

你试过这个代码吗?

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

来自:http ://www.juliencavandoli.com/how-to-disable-recent-apps-dialog-on-long-press-home-button/

于 2013-04-07T22:42:55.567 回答
2

实际上,您不能禁用任务按钮。当您按下它时,您的活动会调用onPause()方法,您可以在此方法中将任务移到前面。请参阅我对相关问题的回答

于 2016-01-08T15:51:12.557 回答
1

据我所知,在没有用户确认的情况下,您无法覆盖主页按钮的行为(就像您可以覆盖 BACK 按钮的行为一样)。换句话说,当前处理主页按钮的应用程序的默认值 - 这是当前主页启动器的任何内容 - 必须首先清除。

于 2013-01-29T02:34:30.267 回答
0

您可以禁用状态栏弹出窗口:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    try {
        if (!hasFocus) {
            Object service = getSystemService("statusbar");
            Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
            Method collapse = statusbarManager.getMethod("collapse");
            collapse.setAccessible(true);
            collapse.invoke(service);
        }
    } catch (Exception e) {
        Log.e(TAG, "onWindowFocusChanged - " + e.getCause());
    }
}

您还应该在 AndroidManifest.xml 中添加此权限

<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />

希望这可以帮助。

于 2014-04-21T10:23:56.877 回答