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


253

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

Android ドキュメントではそれは述べています:

...すべてのアクティビティに、[戻る]が押されたときに破棄されるという動作があるわけではありません。ユーザーがミュージックアプリケーションで音楽の再生を開始し、[戻る]を押すと、アプリケーションは通常のバック動作を上書きし、プレーヤーのアクティビティが破棄されないようにし、アクティビティが表示されなくなっても音楽の再生を継続します

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

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. [戻る]ボタンを押すと、ホーム画面のアクティビティが開始され、アプリケーションのアクティビティが停止状態になります。

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


回答:


338

ほとんどの場合、何かをバックグラウンドで実行するためにサービスを作成する必要があり、ビジブルはActivity単にこれを制御しServiceます。(ミュージックプレーヤーも同じように機能するので、ドキュメント内の例は少し誤解を招くように思われます。)その場合、Activityfinishは通常どおり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、時々迅速な代替手段として使用できます。

:DaveがAndroid 2.0の下で指摘したように、新しいonBackPressedメソッドと、[戻る]ボタンの処理方法に関するこれらの推奨事項が導入されました。


1
moveTaskToBack()は必要に応じて機能するようです。この方法を使用することの欠点は何でしょうか?これが期待どおりに機能しない場合がありますか?
bdls

1
そのドキュメントをもっと注意深く読んだ後、私は実際にはそれがうまくいくはずだと思います。(最初はアクティビティに適用されると思いましたが、実際には「このアクティビティを含むタスク」と表示されています。)しかし、もちろん自分でテストする必要があります。:)
ミルコN.

Mirkoに感謝します。この方法はうまく機能しているようです。後でこの質問を見ている人のために、回答の下部にある編集をもっと目立たせるといいかもしれません-それが私が探していたビットだったので!
bdls 2010年

4
バックキーを処理するための推奨される方法については、android-developers.blogspot.com / 2009/12 /…をお読みください。
10

1
理論的には@bdlsは、リソースが不足するとシステムによってバックグラウンドアクティビティが強制終了される可能性があるため、安全のためにとにかくそれ自体を再作成できるはずです。Androidミュージックアプリのソースコードを確認したところ、特別な戻るボタンの処理はありませんでした。
Mirko N.

46

次のコードを使用します。

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

23

戻るボタンをキャッチしたい場合は、Androidデベロッパーブログのこの投稿をご覧ください。Android 2.0でこれを行う簡単な方法と、1.xおよび2.0で実行されるアプリケーションでこれを行う最良の方法について説明しています。

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

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

これらは要件に適しているようです。



14

それが他の誰かを助ける場合、私は可視性のためにオンとオフを切り替えた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
    }

}

それが誰かを助けることを願って、乾杯


10

実例

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

このように、戻るボタンはホームボタンのように機能します。アクティビティは終了しませんが、バックグラウンドに移動します

第二の方法は、呼び出すことです moveTaskToBack(true);onBackPressedして削除してくださいsuper.onBackPressed


0

さらに良いことに、どの程度OnPause()

アクティビティがバックグラウンドに移行するときに、アクティビティライフサイクルの一部として呼び出されますが、(まだ)終了されていません。onResume()に対応するもの。

アクティビティBがアクティビティAの前に起動されると、このコールバックはAで呼び出されます。Bは、AのonPause()が戻るまで作成されないため、enter code hereここで長いことを行わないでください。

このコールバックは主に、アクティビティが編集している永続的な状態を保存し、最初にこのアクティビティを強制終了せずに新しいアクティビティを開始するのに十分なリソースがない場合に何も失われないようにするために使用されます。

これは、アニメーションの停止や、次のアクティビティへの切り替えを可能な限り速くするため、またはカメラなどの排他的アクセスであるリソースを閉じるために、CPUのかなりの量を消費するその他のことを行う場合にも適しています。


0

Android 2.0の後でonBackPressed()をオーバーライドします。といった

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

0

上記の解決策をすべて試しましたが、どれもうまくいきませんでした。次のコードは、onCreateが呼び出される方法でMainActivityに戻ろうとするときに役立ちました。

Intent.FLAG_ACTIVITY_CLEAR_TOPがキーです。

  @Override
  public void onBackPressed() {
      Intent intent = new Intent(this, MainActivity.class);
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
      startActivity(intent);
  }

-1

私は作成した新しいカスタムEditTextを使用して@Mirko N. answserを使用しています

 public class EditViewCustom extends EditText {

    Button cancelBtn;
    RelativeLayout titleReleLayout;
    public EditViewCustom(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public EditViewCustom(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditViewCustom(Context context) {
        super(context);
    }

    public void setViews(Button cancelBtn,RelativeLayout titleReleLayout){
        this.cancelBtn = cancelBtn;
        this.titleReleLayout = titleReleLayout;
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            Log.d("KEYCODE_BACK","KEYCODE_BACK");
            cancelBtn.setVisibility(View.GONE);
            this.setFocusableInTouchMode(false);
            this.setFocusable(false);
            titleReleLayout.setVisibility(View.VISIBLE);

            return super.onKeyPreIme(keyCode, event);
          }

        return super.onKeyPreIme(keyCode, event);
    }

}

次に、アクティビティからデータを設定します

 searchEditView.setViews(cancelBtn, titleRelativeLayout);

ありがとうございました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.