戌印-INUJIRUSHI- (Androidあれこれ)

Androidのプログラミングをメインにしてます。記事に貼られたソースコードはダブルクリックすることで行番号をはずしてコピーすることができます。

 
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
08

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Androidの例外処理

日本Androidの会で質問した「例外発生時のアプリ終了について」をこちらに転載。

Androidというよりアプリ全般に言えることですが、アプリで例外が発生するとcatchされていなければアプリは強制終了されてしまいます。

この強制終了ですがアプリが完全に落ちて最初から始まる…というわけではありません

例外が発生した時、アプリは終了されるためアクティビティは破棄されます。
が、アクティビティは一部を除いてスタックに残ったままとなっています。
そのため、スタックに詰まれたアクティビティが呼び出されてアプリが再開されたように見えます。

※アプリは1度終了しているのでファイルやDBに保存していない情報は破棄されています(static変数など)

さて先ほど一部を除いてと書きましたが、以下の2つのアクティビティはスタックから取り除かれます。
例外が発生したアクティビティ
そのアクティビティを呼び出したアクティビティ

例えばアクティビティA、B、C、D、Eとあるとします。
・スタックが A→B→C→D→E の時にEで例外が発生するとスタックは A→B→C となります。
・スタックが A→B→C→(D)→E でDをEへの遷移時に破棄してEで例外が発生するとスタックは同様に A→B→C になります。

この時アクティビティはCから始まるが、アクティビティは1度破棄されているためライフサイクルは onCreate() から始まります(他アクティビティから戻ると本来は onStart() から始まる)
CからBに戻るとBも onCreate() から始まります(Aも同様)


このように例外時には特殊な動きをするので、強制終了された時の処理を何か入れておくべきです。

一番良いのは、必要な情報は全てプリファレンスやDBに保存。
情報の取得は全てそこから行うようにし、どこから再開しても問題ないような作りにすることです


とはいえ、終了したら必ず最初から始めたいという場合もあります。
その時は以下のような対応を行います。

・起動時にstatic変数に持たせたフラグをオンにする。
・例外で再開されたら、アクティビティはフラグを見てオフだったらアクティビティを閉じる。

これはあくまで一例ですので、他にもっと良い方法があると思います。
マニフェストファイルに1行追加するだけでこういうことやってくれたら嬉しいんですけどねえ…
スポンサーサイト

Comments

Leave a Comment


Body
プロフィール

とむ・やむくん

Author:とむ・やむくん
管理人について

Windows 7 / 64bit
Eclipse 4.2 Juno (日本語パッチ済)

スポンサーサイト
最新トラックバック
検索フォーム
ブロとも申請フォーム
QRコード
QR
Twitter
2013/01/04 19:00 カウント開始

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。