ページ

2011年10月7日金曜日

onCreateの引数の意味

onCreateの引数の意味

この記事は【必須】再起動阻止 configChangesの続きです。

onCreateメソッドの引数
ActivityにおけるonCreateメソッドには、Bundle savedInstanceStateという引数が付いています。androidの学習を始めた時から目にしていましたが、特に気にはなりませんでした。ここに来てやっと、使いたくは無いが、使うべき時がきてしまいました。

この引数の内容は、通常はnullです。
しかし、実機の端末を、縦位置から横位置へ(又は横位置から縦位置へ)変える(以下「configuration change」と呼ぶ。)と、null以外の値が代入されてきます。
このため、現在の起動が、初回の起動なのか、再起動なのかを捕捉することに使えます。

各技法の評価

AndroidManifest.xmlを書き換える技法
前回の私の記事では、再起動の回避策として、「AndroidManifest.xmlの<activity>の属性としてandroid:configChanges="orientation"を書く」という技法を紹介しました。しかし、この技法に対しては、Handling Runtime Changesにおいて次のようなコメントがあります。
This technique should be considered a last resort when you must avoid restarts due to a configuration change and is not recommended for most applications.
このように書かれてしまうと、使いづらくなります。

onCreateメソッドの引数を使う技法
onCreateメソッドのBundleを使う技法に対しては、「it is not designed to carry large objects (such as bitmaps)」という指摘はありますが、初回起動か再起動かの判別をしたいだけなので、有効な技法と言えます。
誰しもが目にするonCreateメソッドの引数として付いてきているのです。なので、androidの基本的な設計思想として、「configuration changeに基づく再起動は発生するのが当たり前であり、発生した時には、これを使え」と言っているようです。
Bundleの特性を活かして、再起動の前から、再起動の後へ、任意の値を渡すことができます。
しかし、再起動を許可してしまうため、Javaのcodeにおいて、初回起動時に行う部分と、再起動時に行う部分とを書き分けなければならなくなります。
このような書き分け作業を行ったとしても、そのコーディングのメリットは、「再起動による不都合を防止する」という程度であって、自分のアプリへの積極的なメリットはありません。

Intentによる再起動
「onCreateメソッドの引数」技法が使えるのは、configuration changeによる再起動の場合です。
Intentを受けた場合には、onCreateメソッドの引数は常にnullです。
このため、Intentによる初回起動or再起動の確認は別の手段を講じなければなりません。

私なりに考えた方法
再起動への対応を考える
configuration changeに伴う再起動への対応 その1
configuration changeに伴う再起動への対応 その2

上記知見を得るために使ったsourceを掲載しておきます。エミュレータでは有効に稼働しません。実機を使ってください。
public class OnSaveInstanceActivity extends Activity{
    final String TAG = "OSIA";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        if(savedInstanceState==null){//初回起動
            Log.i(TAG, "null at onCreate");
            //ここに初回だけ実行させるコードを書けば良い。
        }
        else{//再起動
            Log.i(TAG, "Not null at onCreate");
        }
    }
}

0 件のコメント:

コメントを投稿