2016-05-11 18 views
1

ストーリーショート:私は現在、小さなアンドロイドのゲームに取り組んでいます。 1つの機能は、アプリのテーマを変更することができます。ユーザーがテーマを変更すると、イベントがアプリケーション全体にブロードキャストされ、すべてのアクティブなアクティビティはrecreate()を呼び出して新しいテーマを適用します。スタックから再作成されたアクティビティを再開するときに、アクティビティonStart()が呼び出されない

問題: はの活動の積み重ねがあるとしましょう:A)は、B、Cのすべての活動は、それらが開かれた順にイベントを受け取ることになりますし、(再作成を呼び出します。

  • 活動AはonDestroy()、のonCreate()、ONSTART()、onResume()とonPause()を
  • アクティビティBを呼び出します呼び出します。これらは、(順番に)呼び出されますライフサイクルイベントです
  • アクティビティCは、onPause()、onStop()、onDestroy()、onCreate()、onStart()、onResume()を呼び出します。

アクティビティAまたはBはどちらもonStop()を呼び出さなかったことに注意してください。 これらのアクティビティが返されているとき(例えば、戻るボタンの押下)は、と表示されたときにonStart()を呼び出さず、onResume()を呼び出します。これは、アクティビティライフサイクルのドキュメントに記載されている内容とは異なります。

質問:私がここで間違っていることはありますか?アクティビティのライフサイクルを邪魔することなく、アプリケーション内のすべてのアクティビティを再起動する別の方法はありますか?

答えて

3

ここで間違ったアプローチをしていると思います。テーマを変更するには、フレームワーク呼び出しを使用しないでください。あなたが持っている問題は、あなたがonStopをフレームワークとして呼び出すのではなく、それでもそうであるということです。

あなたのアプローチが間違っている主な理由は、Androidが既に表示されていない場合にはActivityを破壊している可能性があります。したがって、フレームワークメソッドを呼び出すイベントをそれに送ることは、その時点で不必要であるだけでなく、予測できない状態や動作を引き起こす可能性があります。クラッシュを引き起こす可能性もあります。

テーマやUIコンポーネントを変更する場合は、onResumeで処理する必要があります。つまり、ユーザーがActivityに戻ったときのUI要素の変更を処理する必要があります。これを行う1つのオプションは、フラグをstartActivityForResultに渡すことです。

sharedPreferences(または別の方法を使用)を使用してテーマを選択したままにしてから、Activityが再開されたときにそれを読み込んでください。これにより、ユーザーがActivityにどのようにアクセスするかに関係なく、適切なテーマが確実に選択されます。

EDIT:

注彼らはいつでも、または他のクラスによってアクセスする必要があるため、それらはあなたのアプリケーションに実装するためにそれが必要とされているため、Activityフレームワークのメソッドがpublicでないこと。それらはフレームワークの外で呼び出されることを意図していません。

Activityの公式ドキュメントでは、呼び出すメソッドのいずれも「パブリックメソッド」(http://developer.android.com/reference/android/app/Activity.html#Activity())としてリストされていないことに注意してください。サポートされていない方法でそれらを使用しています。しかし、私はこれをあなたに知らせるだけであり、この問題を解決するには一般的に受け入れられているアプローチではないことを指摘しています。

+0

ここでEventBusを使用している再作成イベントは、各アクティビティごとにonCreate()とonDestroy()の間にのみ登録されるため、そこには問題はありません。 startActivityForResult()/ onResume()の方法では、テーマが変更された場合に再開された各アクティビティに対して醜いフリッカーが発生し、そのことを回避しようとしています。また、私が使用しているアクティビティのrecreate()メソッドは、API 11で追加された公開コールです。 –

+0

私の回答を編集しました。このアプローチではEventBusを使用しても避けています。そして、あなたは "醜いちらつき"をテストしましたか?私は "はい"と仮定しています - もしそうなら、これを扱うアニメーションや別のアプローチを考慮する必要があります。たぶんその質問をここに投稿しますか?アクティビティが表示されていない間に "onStart"または "onResume"を呼び出さないでください。これは問題の一部である可能性がありますが、推測に過ぎません。 – Jim

+0

私は少し質問が間違っていると思います。私はこれらのライフサイクルメソッドを呼び出すとは言いませんでした。私はこれらのメソッドがosによって呼び出されていると言って、そのアクティビティが表示されていなくてもonStop()が呼び出されないことを指摘して、その順序を列挙しました。私は、publicメソッドrecreate()を使用して、アクティビティレクリエーションをトリガーしています。この方法は次のとおりです。http://developer.android.com/reference/android/app/Activity.html#recreate%28%29 –

0

これは、ドキュメントとまったく同じです。

http://developer.android.com/training/basics/activity-lifecycle/starting.html

あなたがチャートを見れば何の問題ではない何かが、ONSTART活動に戻っていない場合、onResumeが呼び出されます。

+0

はい、同じ文書では、アクティビティが完全に非表示になっている場合、onStop()が呼び出されます。この場合はonStop()は呼び出されません。 –

0

UI関連コンポーネントを変更する場合は、すべてのアクティビティを再作成する代わりに、OnResumeメソッドを使用する必要があります。次のように。

@override 
    onResume() 
    { 
    textview.setText("Change text When activity resumes"); 
    } 
0

上記の連絡先は非常に良好です。 報告した動作。 onstartとonResumeは呼び出されません。私はそれがホットコードスワッピングに起こっているのを見ました。アプリケーションを停止し、再構築を呼び出すことは価値があります。

関連する問題