この記事は【必須】再起動阻止 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において、初回起動時に行う部分と、再起動時に行う部分とを書き分けなければならなくなります。
このような書き分け作業を行ったとしても、そのコーディングのメリットは、「再起動による不都合を防止する」という程度であって、自分のアプリへの積極的なメリットはありません。
「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 件のコメント:
コメントを投稿