29474


ActivityのライフサイクルとUIスレッドの処理について質問です。onCreateメソッドでHandlerを生成し、ログを表示する処理をpostしたところ、実行した際に、onResumeの後にログが表示されました。これは、ログを表示する処理がUIスレッドのMessage
queueに追加されるより前に、Message
queueにonRsumeの処理があるということでしょうか？Handlerでpostした処理が実行されるタイミングがいまいちわかりません。


CC BY-SA 3.0
2016-10-11T03:33:19.620
29471
2016-10-11T07:03:51.890
19027
question
android
Activityのライフサイクルとスレッド


はい、その認識で正しいです。

`Handler` は生成したスレッド （ここでは UI スレッド） の `Looper` に処理をキューイングします。

`onCreate()` で追加した Message より先に `onResume()` が呼ばれるのがなぜかというと、

  * Activity の起動処理もまた、UI スレッドにキューイングされている処理であること
  * `onCreate()` のコールスタックを辿り、`ActivityThread#handleLaunchActivity()`メソッドの処理を読むこと

で分かります。説明に必要最低限な処理を抜き出すと以下になります。

[code]

    // ここで onCreate() が呼び出されます
    Activity a = performLaunchActivity(r, customIntent);
    if (a != null) {
        r.createdConfig = new Configuration(mConfiguration);
        Bundle oldState = r.state;
        // ここで onResume() が呼び出されます
        handleResumeActivity(r.token, false, r.isForward, !r.activity.mFinished && !r.startsNotResumed);
        // 以下略
    }
    
[/code]

`onCreate()` の呼び出しと、`onResume()` の呼び出しはひとつのキューイングされた処理の中で行なわれているのです。

これらの処理が終わって初めて次のメッセージが取り出されるので、`Handler#post()` した内容は、`onResume()` の後で実行されます。


CC BY-SA 3.0
2016-10-11T07:03:51.890
29474
2016-10-11T07:03:51.890
5337
29471
answer