2011年2月19日土曜日

Android Tips Activityの挙動

Activity, GroupActivity, SeacrhBarを複合させたアプリ作成時に、挙動で色々とはまったので今後のためにメモ。
はまった時に基本に立ち返るのはやっぱ重要ですね。もっと基礎を固めないと…

osは現在メインで開発している2.1、エミュレータは2.3で確認

1、まずは基本。

1.1、画面表示までに呼び出しが行われるメソッドの流れ

onCreate

onStart

onResume

画面表示

1.2、onNewIntent()メソッドの使い方。

search barで使用するときにちょっと挙動にとまどいました。
このメソッドは一度目のActivityの起動では呼び出されません。二度目以降に呼び出されます。

つまり、


上記のような遷移の場合、画面Aから画面Bに遷移する時には、onNewIntent()は呼ばれません。それがたとえ、

Intent intent = new Intent(this, 画面B.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);


のように画面Aのコード内でFLAG_ACTIVITY_SINGLE_TOPを指定してもです。
onNewIntent()が呼ばれるのは、画面Bから画面Bにアクションを行う場合のみです。
この時、FLAG_ACTIVITY_SINGLE_TOPを指定します。

public void onClickButton(View view) {
Intent intent = new Intent(this, 画面B.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
}

この時画面BのActivityで呼び出されるメソッドは
onNewIntent

onResume
の順序となります。

覚えておいて欲しいことは、stackには遷移前の画面Bは積まれないということです。
デバイスの戻るを押した場合には、画面Aに戻ります。
ちなみに、コード内でIntent.FLAG_ACTIVITY_SINGLE_TOPを指定しなくても、android:launchMode="singleTop" をAndroidManifest.xmlに指定すれば同じことです。
むしろ、こちらのほうが可読性が良いのでオススメします。

1.3、Intent.FLAG_ACTIVITY_CLEAR_TOPを使ったActivityの挙動を理解する

activityはstackの形式で蓄積されます。例えば、以下のような画面遷移があるとします。

上記のような画面遷移を行うと、stackにはA, B, C, D, Bの順でactivityが積みあげられます。なので、画面Bでデバイスの戻るを押すと、

D→C→B→A

の順番で画面が戻っていきます。
しかし、このデフォルトのactivityの仕様だと非常に困るときがあります。
 例えば、画面Bが通常画面、画面Cがユーザデータの入力画面、画面Dがユーザ入力項目の確認画面と仮定しましょう。
画面Dでボタン押下後にデータベースに登録して画面Bに戻る処理を行います。この時、画面Bに戻った後にデバイスの戻るを押されると、画面Dに戻ってしまいます。そこでユーザが登録ボタンを再び押せば、二重登録処理となってしまいます。バリデーションが実装されていてもこれは問題でしょう。このケースの場合、画面Dから画面Bに遷移する場合は、画面Cと画面Dのactivityはstackから消えていなければいけません。

こういった場合に使うのが、Intent.FLAG_ACTIVITY_CLEAR_TOPです。この例の場合だと、画面Dから画面Bに遷移する場合に以下のようにコードを記述する

public void onClickButton(View view) {
Intent intent = new Intent(this, 画面B.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}

こうすることで、画面Bに遷移したときstackの中身はA, Bになります。CとDがstackから削除されます。これなら、デバイスの戻るを押されても、画面Aに戻るだけです。

色々な使い道があるので、googleのマニュアルにも目を通しておくといいでしょう
http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP

疲れたので、今回はとりあえずこんな所です。
でわ

android開発オススメ書籍

Effective Javaのような本だと思って購入する面食らうと思います。 この本はTIPS集です。複数のandroid案件を抱えているなら、側に置いておくと役に立つと思います。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...