web-dev-qa-db-ja.com

Android - 「戻る」ボタンをオーバーライドして自分のアクティビティをFinish()しないようにするにはどうすればいいですか?

私は現在それが表示されたときに通知が通知バーにも表示されるようになるアクティビティを持っています。

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

ユーザーが戻るボタンを押したとき、私のアクティビティが破壊されても通知は残りますが、ユーザーが通知を介してアクティビティにアクセスできるようにしたいので、通知は残ります。しかし、USERがこれを試みると、私はNull Pointersが古い活動を取り戻すのではなく新しい活動を開始しようとしていると見なします。

なので、基本的に[戻る]ボタンを[ホーム]ボタンとまったく同じように機能させる必要があります。これまでに試した方法は次のとおりです。


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

しかしながら、上記のコードはそれでも私の活動が破壊されることを許しているようです。戻るボタンが押されたとき私の活動が破壊されないようにするにはどうすればいいですか?

182
Donal Rafferty

キーリスナーを削除するか、KEY_BACKがある場合はtrueを返します。

バックキーをキャッチするには、次のものだけが必要です(onBackPressed()ではsuperを呼び出さないでください)。

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

@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 true; 
    }
    return super.onKeyDown(keyCode, event);
}


@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);
}
253
ekawas

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

@Override
public void onBackPressed() {
   moveTaskToBack(true);
}
65
Teo Inke

私はあなたが欲しいのは戻るボタンをオーバーライドすることではないと思う(それはただ良い考えのように思えない - Android OSがその振る舞いを定義する、なぜそれを変えるのか?)が、 アクティビティを使うライフサイクル および onSaveInstanceState(Bundle) イベントで設定/データを保持します。

@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
}

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

12
kiswa

単にこれを行います。

@Override
public void onBackPressed() {
    //super.onBackPressed();
}

//super.onBackPressed()をコメントアウトする。トリックをします

10
androCoder-BD

これを試して:

@Override
public void onBackPressed() {
    finish();
}
3
Thakur

念のために戻るボタン(電話の下部にあります)とホームボタン(アクションバーの左側にあるボタン)の動作を処理したい場合は、このカスタムアクティビティを使用してください。

import Android.os.Bundle;
import Android.support.v7.app.ActionBar;
import Android.support.v7.app.AppCompatActivity;
import Android.view.MenuItem;

/**
 * Activity where the home action bar button behaves like back by default
 */
public class BackActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setupHomeButton();
    }

    private void setupHomeButton() {
        final ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setHomeButtonEnabled(true);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case Android.R.id.home:
                onMenuHomePressed();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    protected void onMenuHomePressed() {
        onBackPressed();
    }
}

あなたの活動での使用例:

public class SomeActivity extends BackActivity {

    // ....

    @Override
    public void onBackPressed()
    {
        // Example of logic
        if ( yourConditionToOverride ) {
            // ... do your logic ...
        } else {
            super.onBackPressed();
        }
    }    
}
2
Ferran Maylinch
@Override
public void onBackPressed() {
// Put your code here.
}

//I had to go back to the dashboard. Hence,

@Override
public void onBackPressed() {
    Intent intent = new Intent(this,Dashboard.class);
    startActivity(intent);
}
Just write this above or below the onCreate Method(within the class)
0
user3156040