14

Android用の子遊びアプリケーションを構築しています。使用中はすべてのキーを無効にする必要があります。アプリケーションをホームアプリとして設定し、戻るキーを無効にしました(ホームと戻るボタンを処理します)。最近のタスク リストをクリアするために、アプリケーションの起動時に開始および終了するダミー アクティビティのリストを作成しました。ダミー アクティビティは次のようになります。

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 に答える
2

実際には、タスク ボタンを無効にすることはできません。それを押すと、アクティビティがonPause()メソッドを呼び出し、このメソッドでタスクを前面に移動できます。関連する質問については、私の回答を参照してください。

于 2016-01-08T15:51:12.557 に答える
1

私の知る限りでは、ユーザーが確認しない限り、ホーム ボタンの動作をオーバーライドすることはできません ([戻る] ボタンの動作をオーバーライドする方法と同様)。つまり、現在ホーム ボタンを処理しているアプリの既定値 (現在のホーム ランチャーが何であれ) を最初にクリアする必要があります。

于 2013-01-29T02:34:30.267 に答える
0

StatusBar ポップアップを無効にすることができます:

@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 に答える