17

戻るボタンを押すと、基本的に現在のアクティビティがになりfinish()ます。これは常に当てはまりますか?アクティビティをスタックからポップする方法と同じように見えます。

よくわからない状況の1つは、タスクのルートアクティビティがバックプレスされたときです。私は現在、次のように説明されている非常に奇妙な効果を経験しています:

アプリケーションをロードすると、最初のアクティビティは初期化用であり、終了すると、メインのアクティビティ(TabActivity)を呼び出します。この最初の初期化アクティビティでは、マニフェストにandroid:noHistory = "true"が設定されているため、メインのアクティビティから[戻る]を押しても元に戻りません。ランチャーに行きます。ランチャーでアプリをもう一度クリックすると、初期化アクティビティが再度読み込まれ、完了するとメインアクティビティが読み込まれます。ほぼ直後に、メインアクティビティの2番目のインスタンスが読み込まれます。ただし、アプリケーションがすでに1回実行され、メインアクティビティから[戻る]を押して終了した後でのみです。アプリを強制終了するか、IDEから新しいバージョンをロードするまで、それ以降は毎回実行されます。

これに基づいて、ある種のActivityインスタンスが横になって再利用されているのではないかと考えています。これは、アプリケーションを実行した2回目以降にのみ発生するためです(そしてBACKで終了します。HOMEを使用すると、アプリの最後の状態に戻ります。大きな問題ではない)。誰か考えがありますか?

4

7 に答える 7

11

戻るボタンを押すと、基本的に現在のアクティビティが終了する()と聞きました。これは常に当てはまりますか?

いいえそうではありません。ほとんどのアクティビティにはこの動作がありますが、すべてではありません。たとえば、ダイアログを作成してsetCancelable(false)に設定すると、[戻る]ボタンをクリックしてもダイアログは閉じません。

さらに、 onBackPressedをオーバーライドすることで、押されたBACKボタンのアクティビティ動作をカスタマイズできます。

アクティビティがユーザーによる戻るキーの押下を検出したときに呼び出されます。デフォルトの実装は単に現在のアクティビティを終了しますが、これをオーバーライドして必要なことを行うことができます。

アプリケーションの動作について..メインアクティビティをロードした後、アクティビティランチャーが終了したかどうかを確認しましたか?つまり、onDestroy()メソッドが呼び出された場合です。たぶん、メインアクティビティを実行した後もそこに残り、クリックして戻ると、古いランチャーに戻ります...

お役に立てれば..

于 2010-05-10T08:54:32.110 に答える
5

Androidデベロッパーサイトのアクティビティとタスクの設計ガイドラインをお読みください。ホームボタンと戻るボタンの仕組みを説明しています。明らかに、デフォルトの動作をオーバーライドすると(上記のharaで述べたように)、戻るボタンはアクティビティを終了しません。

特定の問題については、logcatを確認してください。古いプロセスを復活させているのか、新しいプロセスを開始しているのかを確認できるはずです。それが不明な場合は、onCreate、onPause、onDestroyedなどにいくつかのログステートメントを挿入して、プロセスで何が起こっているかを正確に確認できるようにします。

于 2010-05-10T10:09:40.000 に答える
2

次のコードを書くことで、BACK-BUTTONを制御できます。

public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if (keyCode == KeyEvent.KEYCODE_BACK ) {
        //preventing default implementation previous to 
        //android.os.Build.VERSION_CODES.ECLAIR
        return false;
    }     
    return super.onKeyDown(keyCode, event);    
}
于 2011-04-06T12:12:48.667 に答える
1

singleInstanceやsingleTopなどの特別なフラグを使用してアクティビティを実行していますか?それらはあなたが見ている奇妙なことを引き起こしている可能性があります。問題の原因を突き止める最も簡単な方法は、デバッグメッセージで完全に埋めることです。例えば:

  1. 初期化アクティビティで、onCreateの先頭にログを追加して、this.toString()などのアクティビティの名前を取得します。この行が必要な理由については後で詳しく説明します。
  2. メインのタブ付きアクティビティを起動するときに、起動アクティビティの名前と、タブ付きアクティビティが起動したことを示すメッセージを取得します。
  3. onPause()、onStop()、およびonDestroy()コールバックをオーバーライドし、this.toString()と、それがどのコールバックであるかを示すメッセージを使用してデバッグ行を追加します。

これにより、初期化アクティビティの複数のインスタンスが存在するかどうかがわかります。これに、メインアクティビティを呼び出すアクティビティの名前を、作成されたばかりのアクティビティおよびonDestroyに渡されたアクティビティと比較します。

デバッグ方法がわからない場合は、を使用してLog.d(LOG_TAG, "Your message here");ください。次に、定数LOG_TAG文字列をどこかに定義します。その後、ウィンドウに移動してEclispeでLogCatパースペクティブを表示し、パースペクティブを表示します(または表示します。正確には覚えていません)。その他、Android、LogCat。LOG_TAG定数を持つ目的は、その文字列にフィルターをかけ、それらのメッセージのみを表示するようにLogCatを設定できることです。これにより、大量のシステムログメッセージの中でそれらを簡単に確認できるようになります。

于 2010-05-10T10:10:00.270 に答える
0

元の質問に対する簡単な答えは「いいえ」です。これは主に、残念ながら、すべての開発者が以前の回答で参照されているガイドラインに従っているわけではないためです。

ただし、ギドリン自体は、Backキーがfinish()を呼び出さない場合の例外について言及しています。最も顕著な例外はWebブラウザで、ウィンドウごとに独自の「バックスタック」があるため、Backキーの独自のカスタム処理が必要です。

于 2010-07-04T02:21:50.210 に答える
0

バックスタックにフラグメントがなく、開発者がonBackPressedをオーバーライドしていない場合、戻るボタンが押されたときにアクティビティが終了します。

Android 4.4.2 Activity.onBackPressed()のソースコードは次のとおりです。

public void onBackPressed() {
    if (!mFragments.popBackStackImmediate()) {
        finish();
    }
}
于 2014-07-14T16:20:58.530 に答える
0

onbackpressed()..をオーバーライドするだけです。バックプレスでこのメソッドはexecute remove superを取得し、uがやりたいことを実行します。

于 2017-02-22T09:05:41.387 に答える