2013/03/17

[android]画面遷移を学ぼうとするも、難しいことに気付く

Annotationの調べを進めていて気付いたが・・・私はそれよりも先にやるべきことがあるはずだ、と思うようになった。
今は亡き(と思う)、Personal Java時代にちょろっとかじったくらいの私には、Javaがまだわかっていないのだ。
そんな私がAnnotationを見ようなんて、庭のビニールプールで遊んでいる子供がいきなり荒海の小島を目指して泳ぐようなものだ。
順番にやっていこう。

最初に選んだのは、画面遷移だ。
Javaじゃないんだけど、そもそもJavaを全部把握するなんて、私には無理だ。
実際に使うところから学んでいこう。


Androidの画面遷移について説明してあるサイトは、非常に多い。
それだけ重要なのだろう。

まずは練習として、1つのアプリに2つのActivityを作り、ボタンを押すとstartActivity()で切り替わる、ということをやった。
うん、これは動く。

ただ、BACKキーを押すと、ひたすらスタックに積まれた前のActivityに戻ってしまう。
startActivity()するだけだと、新たにインスタンスを作っていくようだ。

では、BACKキーを押したらもう戻らないようにしよう。
調べると、startActivity()したいインテントにフラグを設定すればよいらしい。

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

やってみたのだが、私のイメージとちょっと違っていた。
ActivityのAとBがあるとして、

ランチャー→A→B→A→B→A→(BACK)

とするとホーム画面に戻るのだが、

ランチャー→A→B→A→B→(BACK)

とすると、Aに戻るのだ。次にBACKを押すと、ホーム画面に戻る。
AndroidManifest.xmsで<activity>のlaunchModeを変更したが、どれも同じ動きだ。


別の設定がないか探すと、noHistoryというものがあった。
これを使うと、launchModeがstandardだろうとsingleTopだろうと、BACKキーでホーム画面に戻った。
(その代わり、アクティビティBでホーム画面に戻ってから再度アプリを立ち上げても、アクティビティAになる。)

launchModeがstandardだと、毎回アクティビティのインスタンスを作成するのにうまくいくのは、noHistoryがtrueだと「見えなくなったアクティビティは終了する」という動作になるからだろう。
見た目は同じだけど、毎回生まれ変わっているので、注意がいる。
たぶん今回の私が期待する動作はsingleTopだろう。

 

と思ったが、noHistoryが裏に回ったアクティビティを終了させるのなら、singleTopにしていたとしても同じではないか。
そんな心配をするくらいだったら、アクティビティ間で共通するデータは別に持つようにした方がよさそうだ。

また、ツールのdumpsys activityを使って見てみると、noHistoryにしていたとしてもA→BとしたときにAはヒストリーに残っているようなのだ。
見方が悪いのかな?

 

などなど、一筋縄でいかないことがわかってきた。
ネットで調べるのもめんどうなので本を買いたいところだが、手持ちの本はそこら辺が書いてないので、また買っても同じかも・・・という気もしている。

まあ、見に行くか。

2 件のコメント:

  1. 一般的に
    A -> B
    に遷移した後
    B -> A
    に startActivity で遷移する事が稀なので、悩むかもしれません。

    実際は、
    ・B -> Aに遷移するボタンを置かず、戻るボタンで戻る。
    ・B -> Aに遷移するボタンを押すと、finish() でBを終了させる。
    のどちらかのパターンが多いと思います。

    返信削除
    返信
    1. いつもありがとうございます。

      > B -> A
      > に startActivity で遷移する事が稀なので、悩むかもしれません。
      これは、かなり興味深いです。

      AとBが対等の関係になるようにするより、Aを根っこ、Bを葉っぱにするようなイメージで作った方が、「作りやすい」とか「安全に動く」とか、そういう感じなのでしょうか。
      まだアプリのあり方がわかってなくて、自分が思うように実装してしまいたい年頃なんですよね。。。

      削除

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。