◆PROCESSING 逆引きリファレンス
カテゴリー:スマホ(AndroidMode)
PROCESSINGとライフサイクル(AndroidMode編)
【概要】
PROCESSINGにAndroidMode を導入する事で、PROCESSINGで開発したプログラムをAndroid端末上で動かす事ができるようになります。
AndroidModeの導入については「PROCESSINGをAndroid端末で動かすには(4.0版)」記事を参照してください。
Androidの画面はActivityと呼ばれる単位で動作しますが、Activityは起動から停止までの間、一連の流れをたどりながら動作します。この流れを「ライフサイクル」と呼びます。
また最近のAndroid OSでは、Activityよりもコンパクトで、使い回しが効くFragmentで作成されることが多くなりました。
FragmentはActivityから生成されるサブActivityのようなもので、Activityのライフサイクルと深い関係を持つ独自のライフサイクルを持っています。
以下は公式サイト にあるActivityとFragmentの標準的なライフサイクル図です。
Activityの標準ライフサイクル
Fragmentの標準ライフサイクル
ActivityとFragmentのライフサイクルについては、以下のページなどが参考となります。
- TECHBOOSTER 様:ACTIVITY&FRAGMENTライフサイクルポスター
- @IT 様:知らずに作って大丈夫?Androidの基本的なライフサイクルイベント31選
- Qiita 様:Activity のライフサイクル再確認:@calciolife さん
- Qiita 様:ActivityとFragmentのライフサイクルと罠:@chibi929さん
AndroidModeで動作するPROCESSINGのSketchクラスは、main Activityから起動されるPROCESSING用に拡張されたFragment(PFragment)上で実行されます。
よってAndroid端末の様々な状態(ボタンが押された、メモリが足らなくなった、電話が着信した・・・など)に応じて、Android OS から強制的に停止させられたり、再起動されます。
PROCESSINGでは、初期処理は setup 関数に記述します。Javaモードでは、setup 関数はアプリケーション起動時に1回だけ呼び出される関数でした。
しかしAndroid Modeでは画面を回転させた時や戻るボタンを押下した時にアプリケーションが強制停止・再起動されるため、Javaモードとは異なるタイミングで setup 関数が呼び出されることになります。
【詳細】
PROCESSINGのライフサイクル
以下は、TECHBOOSTER 様:ACTIVITY&FRAGMENTライフサイクルポスター 様の図をベースに書いた、PROCESSINGに関係する Fragment のライフサイクルです。
注目して頂きたいのは、「HOMEボタンやMENUボタンを押下した時の動き」と、「戻るボタンや画面回転時の動き」です。
HOMEボタンや電源ボタンを押下すると、Fragmentが停止します。そして再開時には setup 関数を実行せずに draw 関数を実行する動きになります。
また戻るボタンや画面を回転させた時は、Fragmentが終了・再起動される事により、setup 関数が再度呼ばれることになります。
アプリケーションの停止・再起動に伴い、初期化されたり失われては困る変数は、onPause や onDestroy で保存し、onResume で復元するのが良いでしょう。
保存や復元にはAndroidのプリファレンスを利用するのが便利です。また保存する情報が単純な文字列なら PROCESSINGの saveStrings 命令と loadStrings 命令を使う方法もあります。
AndroidModeでのファイル操作については、以下の関連記事を参照してください。
また settings 関数では、まだ親となるActivityが生成途中であるため、 getActivity() 命令でActivityを取得する事ができません。
SketchでActivityを取得するなら、親Activityの生成(onCreate)が終了した後で呼ばれる onStart 以降で行うのが良いでしょう。
参考までに公式サイト にある、親Activityと子Fragmentの状態関連図を掲載しておきます。
ActivityとFragmentの状態関連図
【関連記事】
- 文字列データを書き込むには(AndroidMode編)
- 文字列データを読み込むには(AndroidMode編)
- プリファレンスを利用するには(AndroidMode編)
- PROCESSINGをAndroid端末で動かすには(4.0版)
サンプルプログラム
Sketchのライフサイクル表示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
import android.os.Bundle; import android.util.Log; import processing.core.PApplet; /** * PROCESSING AndroidMode LifeCycle Sample * @author MSLABO * @version 1.0 */ public class Sketch extends PApplet { final String TAG = "AMTEST"; //メソッド名を返す関数 public String GetName(){ StackTraceElement[] ste = Thread.currentThread().getStackTrace(); return "[" + ste[3].getMethodName() + "]"; } @Override public void settings() { Log.d(TAG, GetName() + " is started"); fullScreen(); } @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); Log.d(TAG, GetName() + " is started"); } @Override public void onStart() { super.onStart(); Log.d(TAG, GetName() + " is started"); } @Override public void onResume() { super.onResume(); Log.d(TAG, GetName() + " is started"); } @Override public void setup() { Log.d(TAG, GetName() + " is started"); } @Override public void draw() { Log.d(TAG, GetName() + " is started"); noLoop(); } @Override public void onPause() { super.onPause(); Log.d(TAG, GetName() + " is started"); } @Override public void onStop() { super.onStop(); Log.d(TAG, GetName() + " is started"); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, GetName() + " is started"); } } |
Sketchのライフサイクルをログに出力します。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。