1

編集:質問を少し修正しました。私は実際に私の例を実装しました。実際のコードをより単純な例に移す前に、実際には最終的に何か違うことをしました。

Activity.startActivity. 何年も前に Swing を学習したとき、キューの最後で Runable の実行を実際にスケジュールしたことを覚えています。これは、たとえば Activity.startActivity によってスケジュールされたアクティビティが後にのみレンダリングされる Android にも似ていると思います。

  1. アクティビティ ライフ サイクル メソッド呼び出し (onStart、onPause、onStop など) のまだ完了していないスタックが返されました。
  2. UI スレッドでスケジュールされたその他のイベントが完了します (Activity.startActivity などの呼び出しによって以前にアクティブになるように設定されたその他のアクティビティ)。

ただし、これは私が観察したことの一部にすぎません。

メインアクティビティ:

public void onCreate(Bundle b) {
 for(int i = 0; i < 3; i++) {
  Log.d(TAG, "Schedule OtherActivity " + i);
  startActivity(new Intent(this, OtherActivity.class).putExtra("instance", i));
  Log.d(TAG, "Done scheduling OtherActivity " + i);
 }
}
public void onResume() {
 Log.d(TAG, "Resumed MainActivity");
}

その他のアクティビティ:

public void onCreate(Bundle b) {
 int instance = getIntent().getIntExtra("instance", -1);
 Log.d(TAG, "Created OtherActivity " + instance);
 startActivity(new Intent(this, YetAnotherActivity.class).putExtra("instance", instance);
}
public void onStart() {
 Log.d(TAG, "Started OtherActivity " + getIntent().getIntExtra("instance", -1));
 finish();
}
public void onStop() {
 Log.d(TAG, "Stopped OtherActivity " + getIntent().getIntExtra("instance", -1));
}

まだ別のアクティビティ:

public void onCreate(Bundle b) {
 Log.d(TAG, "Created YetAnotherActivity " + getIntent().getIntExtra("instance", -1));
}
public void onStart() {
 Log.d(TAG, "Started YetAnotherActivity " + getIntent().getIntExtra("instance", -1));
 finish();
}
public void onStop() {
 Log.d(TAG, "Stopped YetAnotherActivity " + getIntent().getIntExtra("instance", -1));
}     

次のようになります。

Schedule OtherActivity 0
Done scheduling OtherActivity 0
Schedule OtherActivity 1
Done scheduling OtherActivity 1
Schedule OtherActivity 2
Done scheduling OtherActivity 2
Created OtherActivity 2
Started OtherActivity 2
Created YetAnotherActivity 2
Started YetAnotherActivity 2
Created OtherActivity 1
Started OtherActivity 1
Created YetAnotherActivity 1
Started YetAnotherActivity 1
Created OtherActivity 0
Started OtherActivity 0
Created YetAnotherActivity 0
Started YetAnotherActivity 0
Resumed MainActivity
Stopped OtherActivity 2
Stopped YetAnotherActivity 2
Stopped OtherActivity 1
Stopped YetAnotherActivity 1
Stopped OtherActivity 0
Stopped YetAnotherActivity 0

これは常に結果になるのでしょうか、それとも Android はこの例をこれとは別の順序で実行できますか? 私が観察したように、UI イベントは特定の順序でスケジュールされているため、本質的に同期されていると想定していました。ただし、実際のスケジューリングがどのように機能するかはわかりません。

たとえば、一部の UI イベント (つまり、Constuctor/onCreate/onStart/onResume/onPause) が常に実行キューの先頭にスケジュールされ、一部のイベントが最後にスケジュールされる (つまり、onStop/onDestroy) とは予想していませんでした。しかし、この理論によれば、YetAnotherActivity の前に OtherActivity が破棄されるのはなぜでしょうか? そして、onResume が突然実行キューの先頭に来るのはなぜでしょうか?

UIスケジューリングが一般的にどのように機能するかを誰か説明できますか? 私の考えについてのフィードバックをありがとう!

4

2 に答える 2

1

すべてのアクティビティ ライフサイクル メソッド ( onCreate()onResume()など) は UI スレッドで呼び出されるため、これらのメソッドは常に記述した順序で呼び出されます。はい、メソッド呼び出しのキューがあり、それらは次々に処理されます。

于 2013-04-29T11:00:14.743 に答える
1

これが、シミュレーションの例から得られた出力シーケンスからデコードできる「アルゴリズム」です。このアルゴリズムは、メインの UI スレッドによって実行されます。

> To start with, the scheduler initializes queue Q with MainActivity's onCreate()
> while (Q is not empty) {
>   worker thread retrieves one element E from head of Q
>   if (E is "A.onCreate()")  // A is any activity
>       insert "A.onStop()" into tail of Q
>   process E (while processing, a "startActivity(A)" will immediately cause A.onCreate() to be pushed into head of Q, so activity invocations follow "stack" order)
> }

したがって、一連のイベントのキューが必要ですが、それは「型にはまらない」キューです。メイン UI スレッドによる処理中に、キュー内のイベントにより、イベントに応じて後方および/または前方に成長します (この決定はその場で行われます)。

于 2013-05-30T06:51:54.107 に答える