web-dev-qa-db-ja.com

戻るボタンをオーバーライドしてホームボタンのように機能する

戻るボタンを押すと、アプリケーションは破棄状態ではなく停止状態になります。

Android のドキュメント では次のように述べています。

... BACKが押されたときにすべてのアクティビティが破壊されるという動作をするわけではありません。ユーザーがMusicアプリケーションで音楽の再生を開始してからBACKを押すと、アプリケーションは通常の戻る動作を無効にして、プレーヤーのアクティビティが破壊されるのを防ぎ、アクティビティが表示されなくなっても音楽の再生を続けます。

この機能を自分のアプリケーションに複製するにはどうすればよいですか?

私は3つの可能性があるに違いないと思います...

  1. (以下のように)戻るボタンを押してから、ホームボタンが呼び出すメソッドを呼び出します。

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            Log.d(this.getClass().getName(), "back button pressed");
        }
        return super.onKeyDown(keyCode, event);
    }
    
  2. 戻るボタンを押してから、ホームボタンを偽装します。

  3. 戻るボタンを押してからホーム画面のアクティビティを開始し、アプリケーションのアクティビティを事実上停止状態にします。

編集:私はサービスについて知っていて、この問題が関連しているアプリケーションでそれを使用しています。この問題は、戻るボタンを押したときに、アクティビティを破棄状態ではなく停止状態にすることに関するものです。

242
bdls

ほとんどの場合、バックグラウンドで何かを実行するために サービス を作成する必要があります。目に見えるActivityは単にこのServiceを制御します。そうであれば、あなたのActivityはいつものようにfinishを実行することができ、Serviceは引き続き実行されます。

より簡単な方法は、Backボタンを押して、次のように moveTaskToBack(true) を呼び出すことです。

// 2.0 and above
@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

// Before 2.0
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

私は、アクティビティが正常に終了して自分自身を再現できるようにすることをお勧めします。必要に応じてサービスから現在の状態を読み取る。しかしmoveTaskToBackは時々手っ取り早い方法として使うことができます。

NOTE:Android 2.0以下のDaveが指摘したように、新しいonBackPressedメソッドが導入され、 これらの推奨事項 戻るボタンの取り扱い方法について.

331
Mirko N.

次のコードを使用してください。

public void onBackPressed() {    
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);
}
44

戻るボタンをキャッチしたい場合は、Android Developer Blogの この記事を見てください 。これは、Android 2.0でこれを行うためのより簡単な方法と、1.xと2.0上で動作するアプリケーションのためにこれを行うための最良の方法をカバーしています。

ただし、アクティビティが停止した場合でも、デバイスのメモリの空き容量によっては、それでも強制終了される可能性があります。プロセスをUIなしで実行したい場合は、Serviceを作成する必要があります。 ドキュメントにはサービスについて次のように書かれています:

サービスには視覚的なユーザインタフェースはありませんが、無期限にバックグラウンドで実行されます。たとえば、サービスがユーザーが他の事項に注意を向けてBGMを再生したり、ネットワークを介してデータを取得したり、何かを計算して結果をそれを必要とするアクティビティに提供したりします。

これらはあなたの要求に適しているようです。

22
Dave Webb

android.app.Activityクラスで定義されているvoid onBackPressed()をオーバーライドしてみてください。

17
m-szalik

それが他の誰かを助けるなら、私は私が見やすさのためにオンとオフを切り替えた2種類のレイアウトで活動をしていて、一種のpage1> page2構造をエミュレートしようとしました。彼らが2ページにいて、戻るボタンを押したなら、私は彼らが1ページに戻るようにしたかった、彼らが1ページで戻るボタンを押したなら、それはまだ普通に機能するはずです。それはかなり基本的ですが、うまくいきます

@Override
public void onBackPressed() {
// check if page 2 is open
    RelativeLayout page2layout = (RelativeLayout)findViewById(R.id.page2layout);
    if(page2layout.getVisibility() == View.VISIBLE){
        togglePageLayout(); // my method to toggle the views
        return;
    }else{
        super.onBackPressed(); // allows standard use of backbutton for page 1
    }

}

それが誰かに役立つことを願って、応援

13
craigk

実施例.

Super.onBackPressed()を呼び出さないでください。

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

このように、あなたの戻るボタンはホームボタンのように振る舞います。それはあなたの活動を終了させませんが、背景にそれを取ります

2番目の方法は、onBackPressed内でmoveTaskToBack(true);を呼び出し、super.onBackPressedを必ず削除することです。

9
Xar E Ahmer

Android 2.0以降はonBackPressed()をオーバーライドしてください。といった

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}
0
SaiLiu