2012-12-30 12 views
8

私は何かをするasynctaskを持っています。asynctasksからのブロードキャストの送信

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

1)なぜAndroidはそれほどセットアップされていますか?ブロードキャストを登録して他のコンテキストで処理できるときに、ブロードキャストを送信するコンテキストが必要なのはなぜですか?

2)この問題の解決策はありますか? (良い= asynctaskを作成するアクティビティから可能な限り少ないものを要求し、ローテーションなどを生き残ります。)

+1

'Activity.getApplicationContext()'を使用して、Application Contextを 'AsyncTasnk'に渡します。アプリコンテキストは画面回転の影響を受けません。そのため、参照は潜在的なローテーション後も有効です。 – Paul

+0

@Paulも技術的な問題を解決します。ありがとうございます。私が放送を送るために文脈を必要としているのはなぜかと思っています(設計の立場から)。 – Oren

答えて

16

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

AndroidManifest.xmlファイルのandroid:configChanges属性を設定することでそれに対抗できますが、この場合はこのソリューションはお勧めできません。

この問題を処理する適切な方法は、アクティビティ(Activityが継承するContext)ではなく、アプリケーションコンテキストをAsyncTaskに渡すことです。アクティビティのインスタンスからgetApplicationContext()を呼び出すことでそれを行うことができます。 アプリケーションのコンテキストは、画面の回転などのイベントを維持し、システムがアプリケーションを終了するまで存続します。アプリケーション環境に関するグローバル情報に

インターフェース:あなたは基本的なタスクを実行するために、コンテキストのインスタンスを必要とする理由として

。この は、実装がAndroid システムによって提供される抽象クラスです。これは、アプリケーション固有のリソースと クラスへのアクセスを可能にするだけでなく、アップコールのアプリケーションレベルの操作用など 発射活動、放送と受信の意図、

これは、公式ドキュメントをどのように定義するかであるとして、 Context。 誰かがこれをより良く説明できるかもしれませんが、自分自身でこの定義で十分です。

関連する問題