214

現在、通知が表示されると通知バーにも表示されるアクティビティがあります。

これは、ユーザーがホームを押してアクティビティがバックグラウンドにプッシュされたときに、通知を介してアクティビティに戻ることができるようにするためです。

ユーザーが戻るボタンを押すと問題が発生し、私のアクティビティは破棄されますが、ユーザーが戻るボタンを押しても、通知を介してアクティビティにアクセスできるようにしたいので、通知は残ります。しかし、ユーザーがこれを試みると、古いアクティビティを戻すのではなく、新しいアクティビティを開始しようとして、Null ポインターが表示されます。

基本的に、戻るボタンをホームボタンとまったく同じように動作させたいのですが、これまでに試した方法は次のとおりです。


        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event)  {
            if (Integer.parseInt(android.os.Build.VERSION.SDK) < 5
                    && keyCode == KeyEvent.KEYCODE_BACK
                    && event.getRepeatCount() == 0) {
                Log.d("CDA", "onKeyDown Called");
                onBackPressed();
            }

            return super.onKeyDown(keyCode, event);
        }

        public void onBackPressed() {
            Log.d("CDA", "onBackPressed Called");
            Intent setIntent = new Intent(Intent.ACTION_MAIN);
            setIntent.addCategory(Intent.CATEGORY_HOME);
            setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(setIntent); 

            return;
        }   

ただし、上記のコードではまだアクティビティを破棄できるようです。戻るボタンが押されたときにアクティビティが破棄されないようにするにはどうすればよいですか?

4

10 に答える 10

300

キーリスナーを削除するかtrue、持っているときに戻りますKEY_BACK

バックキーをキャッチするには、次のものが必要です(スーパーを呼び出さないように注意してくださいonBackPressed())。

また、サービスをバックグラウンドで実行することを計画している場合はstartForeground()、通知を継続的に確認してください。そうしないと、Androidがメモリを解放する必要がある場合にサービスを強制終了します。

@Override
public void onBackPressed() {
   Log.d("CDA", "onBackPressed Called");
   Intent setIntent = new Intent(Intent.ACTION_MAIN);
   setIntent.addCategory(Intent.CATEGORY_HOME);
   setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   startActivity(setIntent);
}
于 2010-06-29T16:00:10.140 に答える
81

1 行のコードだけで実装する方が簡単でした。

@Override
public void onBackPressed() {
   moveTaskToBack(true);
}
于 2015-04-24T16:48:55.197 に答える
12

あなたが望むのは、戻るボタンをオーバーライドすることではないと思います (それは良い考えとは思えません - Android OS はその動作を定義しますが、なぜそれを変更するのですか?) が、Activity Lifecycleを使用して、設定/データをonSaveInstanceState(バンドル)イベント。

@Override
onSaveInstanceState(Bundle frozenState) {
    frozenState.putSerializable("object_key",
        someSerializableClassYouWantToPersist);
    // etc. until you have everything important stored in the bundle
}

次に、onCreate(Bundle)を使用して、永続化されたバンドルからすべてを取得し、状態を再作成します。

@Override
onCreate(Bundle savedInstanceState) {
    if(savedInstanceState!=null){ //It could be null if starting the app.
        mCustomObject = savedInstanceState.getSerializable("object_key");
    }
    // etc. until you have reloaded everything you stored
}

上記の疑似コードを考慮して、正しい方向に向けてください。アクティビティのライフサイクルを読むと、探しているものを達成するための最良の方法を判断するのに役立ちます。

于 2010-06-29T15:48:16.197 に答える
0

私は非常に遅れているように見えますが、新しい画面に切り替えて戻るボタンのスタックをクリアする必要がある人にとっては、非常に簡単な解決策です。

startActivity(new Intent(this,your-new-screen.class));
finishAffinity();

finishAffinity(); メソッドは戻るボタンのスタックをクリアします。

于 2020-09-10T23:55:40.350 に答える
0

コトリンでは:

val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
    // Handle the back button event
}

詳細については、これを確認してください。

Kotlin での戻るボタンのオーバーライドに関する特定の質問もあります。

于 2020-02-12T09:36:04.920 に答える