256

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

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

...すべてのアクティビティに、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. 戻るボタンの押下をキャプチャしてから、ホーム画面のアクティビティを開始し、アプリケーションのアクティビティを効果的に停止状態にします。

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

4

10 に答える 10

342

ほとんどの場合、バックグラウンドで何かを実行するためのサービスActivityを作成する必要があり、ビジブルはこれを制御するだけServiceです。(ミュージックプレーヤーも同じように機能すると確信しているので、ドキュメントの例は少し誤解を招くようです。)その場合は、通常どおりにActivityできますが、引き続き実行されます。finishService

より簡単なアプローチは、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場合によっては簡単な代替手段として使用できます。

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

于 2010-01-04T15:49:16.290 に答える
48

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

public void onBackPressed() {    
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);
}
于 2012-04-27T09:49:34.957 に答える
23

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

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

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

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

于 2010-01-04T15:56:05.170 に答える
18

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

于 2011-06-03T12:03:19.853 に答える
14

それが他の誰かを助けるなら、私は、ある種のpage1> page2構造をエミュレートしようとして、可視性のためにオンとオフを切り替えた2つのレイアウトのアクティビティを行いました。彼らが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
    }

}

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

于 2011-12-07T00:18:26.813 に答える
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);
}

このようにして、戻るボタンはホームボタンのように機能します。それはあなたの活動を終了しませんが、それをバックグラウンドに持っていきます

2番目の方法は、電話をかけ moveTaskToBack(true);onBackPressed必ず削除することですsuper.onBackPressed

于 2014-05-20T06:48:56.830 に答える
0

さらに良いことに、OnPause()はどうですか?

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

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

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

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

于 2012-12-18T05:25:57.443 に答える
0

android 2.0以降のonBackPressed()をオーバーライドします。そのような

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}
于 2016-06-25T13:58:27.583 に答える
-1

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

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

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

于 2012-02-22T10:51:09.387 に答える
-1

私は上記のすべての解決策を試しましたが、どれもうまくいきませんでした。次のコードは、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);
  }
于 2020-05-02T15:08:49.750 に答える