質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

3回答

7834閲覧

Androidで例外が発生した後のライフサイクルについて知りたい

arcanum_jp

総合スコア94

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

1グッド

1クリップ

投稿2016/02/26 13:41

編集2016/02/26 14:40

Androidにおいて、例外が発生した場合のライフサイクルについて教えて頂きたいです。

下記のように、例えばMainActivity ⇒ SubActivityと遷移するアプリがあり、SubActivity側で例外が発生してしまった場合に、SubActivityが破棄され、表面上はMainActivityに戻ったように見えますがMainActivityで参照しているシングルトンなクラスオブジェクトが例外発生後ではインスタンスが変わってしまいます。

Logcat上では[D/AndroidRuntime: Shutting down VM ]のように出力され、例外が発生した場合は一度VMがシャットダウンされるのかなと言うのは予想がつきました。

そこで質問なのですが、例外が発生した場合のライフサイクルについて、どのようなシーケンスをたどるのか教えて頂きたいのです。Webで探したのですがなかなか見つからず、もし良いサイト等あれば教えていただきたいです。

以上、よろしくお願いします。

02-26 22:35:37.866 22074-22074/com.example.xxxxx.exceptionapp D/AndroidRuntime: Shutting down VM
02-26 22:35:37.866 22074-22074/com.example.xxxxx.exceptionapp W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x40d55ae0)
02-26 22:35:37.866 22074-22074/com.example.xxxxx.exceptionapp E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: なんかエラー
at com.example.shinyahosokawa.exceptionapp.SubActivity$1.onClick(SubActivity.java:37)
at android.view.View.performClick(View.java:4278)
at android.view.View$PerformClick.run(View.java:17430)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:5092)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:564)
at dalvik.system.NativeStart.main(Native Method)

Java

1 2public class MainActivity extends Activity { 3 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.activity_main); 8 9 10 Button b = (Button) findViewById(R.id.call_sub1); 11 b.setOnClickListener( 12 new View.OnClickListener() { 13 @Override 14 public void onClick(View v) { 15 Intent i = new Intent(getBaseContext(), SubActivity.class); 16 startActivity(i); 17 } 18 } 19 ); 20 21 22 Button singleton = (Button) findViewById(R.id.showsingleton); 23 singleton.setOnClickListener( 24 new View.OnClickListener() { 25 @Override 26 public void onClick(View v) { 27 int hash = SingletonClass.getInstance().hashCode(); 28 Toast.makeText(getBaseContext(), "singleton#hash: " + hash, Toast.LENGTH_SHORT).show(); 29 } 30 } 31 ); 32 33 } 34} 35

Java

1public class SubActivity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_sub); 7 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 8 setSupportActionBar(toolbar); 9 10 11 Button b = (Button) findViewById(R.id.button); 12 b.setOnClickListener( 13 new View.OnClickListener() { 14 @Override 15 public void onClick(View v) { 16 throw new RuntimeException("なんかエラー"); 17 } 18 } 19 ); 20 21 22 } 23 24}

Java

1public class SingletonClass { 2 3 private static SingletonClass _instance; 4 5 public static final SingletonClass getInstance() { 6 if (_instance == null) { 7 _instance = new SingletonClass(); 8 } 9 return _instance; 10 } 11 12 private SingletonClass() { 13 // private for singleton 14 } 15 16}
ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

いったんこの質問については、以下の理解としています。

  1. 例外が発生すると一旦Processが消滅しアプリが終了するが、Taskは生き残る。
  2. 例外が発生したActivityはTaskから消え、残りのActivityがTaskの記録順にしたがって開かれる
  3. その際アプリ用のプロセスが再度生成される。
  4. 先ほどのProcessが消滅しているため、シングルトンオブジェクトは別のオブジェクトになる

この場合、アプリケーションがプロセス内のメモリとして持っているのは、ルートアクティビティから遷移していったアクティビティや、アプリで設計されたクラスのオブジェクト達、その他、タスクといったものは、アプリ以外でAndroid OS側で管理しているという認識です。

当初、例外が発生した場合に、UncaughtExceptionHandlerでアプリを終了するためにと言う目的で考えている時に、質問になった例外発生後、VMが再起動するという現象がなんで起こるのだろうという疑問が浮かんだわけです。(例外がおきたアクティビティだけ殺せばいいし、なぜVMの再起動まで必要なのだろうかと)

しかし、回答をいただいて少し勉強する限り、たとえば例外がOutOfMemoryなどのError系だった場合、当然メモリ内の整合性は保てないわけで、プロセスは殺さないといけないわけで、と言う事実を思い浮かべるのでした。

投稿2016/02/27 04:42

arcanum_jp

総合スコア94

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

参考URL→ライフサイクルの理解 その2 Process ライフサイクルの理解 その3 Task
私自身、完全には理解していないのですが、要点として

  1. アプリの他にstatic変数の管理などを司るProcess,画面を開いた順番を管理するTaskが存在する
  2. Processの消滅によりstatic変数が消滅しても、画面管理のTaskが生き残ることがある

以上を踏まえると、

  1. 例外が発生すると一旦Processが消滅しアプリが終了するが、Taskは生き残る。
  2. 例外が発生したActivityはTaskから消え、残りのActivityがTaskの記録順にしたがって開かれる
  3. Processが消滅しているため、シングルトンが再生成する

こういうことではないかと思います。余り説明になってないかもしれませんが…

投稿2016/02/26 15:00

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

arcanum_jp

2016/02/27 03:00

回答ありがとうございます。 参考としていただいたリンク先、良いですね。まずAndroidのメモリ管理について理解しないといけないのかなと感じ始めています。 リンク先を読んだだけで、結構理解が進みましたが、一方ワラワラと疑問が浮かんできました。 いったん、メモリ管理について勉強してみたいと思います
guest

0

詳しい仕様ではなく、今までの経験からでなら答えられます。参考になればいいのですが。

一つのActivityで起こった例外が処理されない場合、例外は処理が行われるまでthrowされ続け、アプリ毎に割り振られた仮想マシンまで到達します。すると仮想マシンは停止するのでアプリ自体が終了します。

その後の処理は例外の発生した箇所がライフサイクルメソッド上かどうかによって変わります。ライフサイクルメソッド外で例外が発生するとアプリケーションは再起動し、すべてのデータが初期化されます。これはログキャットのプロセスIDからも確認できます。一方でライフサイクルメソッド上で例外が発生した場合は再起動せずに、ホーム画面または履歴の一番上にあるアプリケーションに戻ります。

投稿2016/02/26 14:56

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

arcanum_jp

2016/02/27 02:28

ありがとうございます。 状況としては、回答にいただいたとおりで、例外発生でプロセスは一度死んでしまい、タスクは生き残っている、そのためタスクの順番に従い、アクティビティを表示しようとするという動きみたいですね。(プロセスが再起動なので、プロセス内で管理していたメモリは初期化される) UncaughtExceptionHandlerを設定していたのですが、コールバックでアプリが安全に死ぬような処理を書いたとしても、ログキャット上では再起動する旨が表示されていたので、例外発生時の処理はメモリに頼らない終了処理が必要かなと感じました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問