2011-08-08 3 views
3

私は活動がサービスに送信するいくつかの意図を持っています。 それらのすべてがマニフェストに登録されていますアンドロイド:なぜ意思broadcastrecieverで受信していないのですか?

<service android:name=".location.LocationService" android:label="@string/location_service_started"> 
        <intent-filter> 
         <action android:name="@string/location_service_set" /> 
         <action android:name="@string/location_service_start" /> 
         <action android:name="@string/location_service_stop" />    
        </intent-filter> 
</service> 

しかし、唯一のlocation_service_startとlocation_service_stop意図が受信されています。理由は何でしょうか? 私の受信機のコードがあります:

private BroadcastReceiver LocationServiceReceiever = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(intent.getAction().equals(getString(R.string.location_service_stop))) 
     { 
      showMessage("stop");  
     } 
     if(intent.getAction().equals(getString(R.string.location_service_start))) 
     { 
      showMessage("start"); 
     } 
     if(intent.getAction().equals(getString(R.string.location_service_set))) 
     { 
      showAlertBox("set");  

     } 
    } 
}; 

だから私は、メッセージを「設定」を参照してくださいことはありません。私も、「開始」と同じ場所でメッセージを「設定」、まだすべて同じためsendBroadcastを入れて試してみました。 "スタート" - OK、 "セット" - 決して受け取られません。インテントを発射

機能:

protected void start() 
    { 
     Intent intent = new Intent(getString(R.string.location_service_start)); 
     getApplicationContext().sendBroadcast(intent); 
    } 

protected void set(double lat, double lon, double rad) 
    { 
     Intent intent = new Intent(getString(R.string.location_service_set)); 
     intent.putExtra("lat", lat); 
     intent.putExtra("lon", lon); 
     intent.putExtra("rad", rad); 
     getApplicationContext().sendBroadcast(intent); 
    } 

どちらが正しい送信しているが、エラーなしで、アクションが正しいです。


UPD:

ああ、私のせい。 filter.addAction ...を新しいインテントに追加するのを忘れました。 すみません。しかし、答えは本当に便利でした!ありがとうございました!

答えて

3

それらのすべてがマニフェストに登録されています

一般的にあなたがそれらを国際化することはありませんので、あなたは、<intent-filter>でアクション文字列の文字列リソースを使用しません。あなたは、サードパーティ製のアプリにそのサービスを公開している場合を除き

一般的に、あなたはサービスと全く<intent-filter>を使用しないでください。実際には、今、あなたは、誰もがあなたのサービスにこれらのコマンドを送ることができるように、サードパーティ製のアプリにあなたのサービスをさらすあります。

しかし、唯一のlocation_service_startとlocation_service_stop意図は

を受けているいいえ、それらのどれもが、サービスによって受信されません。 Javaコードでブロードキャストを送信しています。サービスはブロードキャストを受信しません。インテントを発射

機能:

あなたは何をしているか知っている限りgetApplicationContext()を使用しないでください。どのようなあなたがgetApplicationContext()を呼び出していることContextあるので、あなたはそれにsendBroadcast()を呼び出すことができます。

+0

ありがとうございます。それは便利です。サービスには登録されていないが、サービスに登録されている放送受信機には意図があることはわかっています。しかし、それは問題を解決しません。 – Ksice

+0

"あなたがやっていることがわからない限りgetApplicationContext()を使わないでください" - 現在のアクティビティを越えるスコープのブロードキャストに対してgetApplicationContext()を使用する方が良いのではないですか?私は、放送は完了していないが、アクティビティはリサイクルされないだろうと思っていますが、あなたのコメントを見てもわかりません。あなたはコメントできますか? – auval

+1

@uval: "現在のアクティビティを超えたスコープのブロードキャストに対してgetApplicationContext()を使用する方が良いのですか?" - いいえ。 「放送は完了していないが、活動はリサイクルされないと思う」 - ブロードキャストは放送局の立場から言えばマイクロ秒単位で「完全」になる。全てのフレームワークレベルの放送(例えば、 'sendBroadcast()')はIPCを伴う。したがって、「Context」は、ブロードキャスト要求をコアOSプロセスに送信し、その時点で「Context」の作業が完了する。 – CommonsWare

1

コピー&貼り付けthis question私はちょうど答えました。同じ問題でなければならない。

<action />タグはマニフェストの別々の<intent-filter />タグに入れなければなりません。ドキュメントは、あなたがフィルタタグ内に複数のアクションを置くことができると述べ以来

これは、バグのようになります。

ゼロまたはそれ以上のアクションは、[..]タグは内容を記述するために内部 を含めるべきですフィルタの

Source

関連する問題