10

私は何かをする asynctask を持っています。

通常、私はそうします:context.sendBroadcast(new Intent(MYINTENT));しかし、asynctaskにはコンテキストがありません。アプリのアクティビティのコンテキストへの参照を asynctask に送信することを提案する、この質問に対するいくつかの回答を見てきました。しかし、ユーザーが画面を回転させた場合、その参照は良くありません。また、参照を手動で維持することは悪い解決策です (私が制御していない asynctask を作成するアクティビティが多すぎます)。質問は次のとおりです。

1) なぜアンドロイドはそのように設定されているのですか? ブロードキャストを登録して他のコンテキストで処理できるのに、ブロードキャストを送信するためにコンテキストが必要なのはなぜですか?

2) この問題に対する良い解決策はありますか? (良い = asynctask を作成するアクティビティからの要求をできるだけ少なくする、ローテーションを乗り切るなど)。

4

1 に答える 1

17

AsyncTask で現在使用しているコンテキストは、現在のアクティビティのコンテキストです。デフォルトでは、画面の回転により、そのアクティビティの現在のインスタンスが破棄され、新しいインスタンスが作成されます。これは (最初はそう見えないかもしれませんが) 意図された動作です。これは、画面の向きごとに異なるリソース (レイアウト、ドローアブルなど) が必要になる場合があるためです。これらの潜在的に異なるリソースを適用するために、Android はローテーションごとにアクティビティを再作成します。

android:configChangesファイルに属性を設定することでこれに対抗できAndroidManifest.xmlますが、あなたの場合、この解決策はお勧めできません。

この問題に対処する適切な方法は、Application Context をAsyncTaskActivity ( Activityinherits from Context) ではなく に渡すことです。getApplicationContext()アクティビティのインスタンスから呼び出すことでそれを行うことができます。アプリケーション コンテキストは、システムがアプリを強制終了するまで、画面の回転やライブなどのイベントを保持します。

基本的なタスクを実行するために Context のインスタンスが必要な理由については、次のとおりです。

アプリケーション環境に関するグローバル情報へのインターフェイス。これは、Android システムによって実装が提供される抽象クラスです。アプリケーション固有のリソースとクラスへのアクセス、およびアクティビティの起動、インテントのブロードキャストと受信などのアプリケーションレベルの操作のアップコールを許可します。

これは、公式ドキュメントがContext. 誰かがこれをもっとうまく説明できるかもしれませんが、私にとってはこの定義で十分です。

于 2012-12-30T12:29:33.683 に答える