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のライフサイクル
しっかし、文が汚い
もう少しうまく書けないものだろうか ・・・
コメント
コメントを投稿