2011/12/31

Activity の動作について



アプリを作っていてSurfaceViewの上から別の画面(スコアなど)を表示したくなった
その際に何で画面を切り替えるか、どうやって処理を中断させるか、悩んだので書いて置きます

まあ、タイトルの通り、別画面への以降は別Activity呼び出しを使いました
SurfaceView上のから以下のコードを実行するといい

Intent i = new Intent(getContext(),ClearActivity.class);
i.putExtra("DataKeyWord",Data);
getContext().startActivity(i); 


ViewのgetContextを使っての呼び出し
 ここで、別画面での処理の後、もう一度呼び出し元のSurfaceViewに戻りたいと考えました
しかし、getContextだとstartActivityForResultメソッドは使えないようです

どうにかならんかなあ、とLogCatでトレースし、SurfaceViewとActivityの動きを観察してみた


SurfaceViewのオーバーライドメソッドは以下の3つ

Viewが生成されるとき呼び出し
surfaceCreated(SurfaceHolder holder)

Viewが変更されたとき呼び出し
surfaceChanged(SurfaceHolder holder,int format,int w,int h)

Viewが破棄されるとき呼び出し
surfaceDestroyed(SurfaceHolder holder)


Activityのオーバーライドメソッドは多いから省略!

図はめんどいので字で


メインのActivityをA
呼び出される側のActivityをB
SurfaceViewはSとする


A:onCreate 
A:onStart
A:onResume  //ここでSurfaceViewを生成
S:SurfaceCreated
S:SurfaceChanged 
//ここで一定条件を満たした時,Intentを投げる
A:onPause 
B:onCreate
S:SurfaceDestroyed
A:onPause
B:finish /呼び出された側の処理が終了
A:onRestart
二行目へ戻る

と、こんな感じになりました
結構不可解なとこもありますね
一番下の参照ページを見てもらったほうが早いと思います・・・
あと、logを挟む場所でも変わるし、一概には言えないとこもある


画面がOFFになった時や別Activity呼び出し時にonPauseが呼ばれるようなので
そこでSurfaceViewの停止処理を入れることです
SurfaceViewのインスタンスにnullを入れると surfaceDestroyedが呼ばれるようです

そうすることでonResumeでもう一度インスタンス化し、SurfaceViewでの処理をできます

参照ページ
Activityのライフサイクル


しっかし、文が汚い
もう少しうまく書けないものだろうか ・・・

0 件のコメント:

コメントを投稿