2016-07-08 18 views
0

私は、BroadcastReceiverを通じてサービスまたはIntentServicesが開始されるいくつかのGoogleコード実装を見てきました。私はこれに技術的な理由があるのか​​どうか分かりません。 サービスを開始するために停止する唯一のコードは、ContentProviderがnullかどうかをチェックすることです。BroadcastReceiver経由でサービスまたはIntentServiceを開始するポイントは何ですか?

if(provider == null) { 
    // the provider is not initialised, yet... 
    return; 
} 

p.s.私が疑うことは、サービスの開始がBroadcastReceiverよりも少し高価な場合のパフォーマンスですが、私はこれについていくつかの専門家の意見を聞きたいのですが確信していません:) いつ行うのか理解したいだけですこれとそうでないとき。

答えて

1

ブロードキャスト受信者はあなたのアプリのリスナーです。あなたは彼らにイベントを聞かせ、トリガーされると、他のコンポーネントに進めるように指示します。

通常、BroadcastReceiversとServicesを組み合わせることで、さまざまなイベントによって複数のトリガーが発生し、後でスタッフが何かを行うかどうかを知ることができます(たとえば、イベントに基づいてブロードキャスト開始サービスを複数回実行しますが、それが完了するまで、それ以降の呼び出しは無視されます)。それはまた、意図を積み上げることができますが、それは考えです、彼らは異なる目的を持っています。

+0

答え、非常に有用な説明をありがとう。 – karate

2

あなたはAndroidシステムにIntentFiltersを通じてBroadcastReceiverのonReceiveをトリガーさせることができます。

たとえば、あなたはそれらのデバイスのBluetooth設定を変更するユーザーが興味を持っている場合、あなたは

<receiver android:name=".BTSettingsChangedReceiver"> 
    <intent-filter> 
     <action android:name="android.bluetooth.adapter.action.STATE_CHANGED" /> 
    </intent-filter> 
</receiver> 

を行うことができますし、それが発生したときにシステムが自動的にBroadcastReceiverを呼び出します。

これは、サービスまたはIntentService *で行うことはできません。したがって、受信者のonReceiveには、BroadcastReceiverを使用して手動でcontext.startService()を開始します。

*注意:アプリケーションが安全であることを保証するために、サービスを開始するときは常に明示的な意図を使用し、サービスに対してはインテントフィルタを宣言しないでください。サービスを開始する暗黙的なインテントを使用することは、どのサービスがインテントに応答するかを特定できず、ユーザーがどのサービスが開始されているかを見ることができないため、セキュリティ上の危険です。

+0

お返事ありがとうございます。私にとっては、これと@Filipeの答えは非常に役に立つと思うし、彼らは完全な説明をするために1つにまとめることができると思う。 – karate