2012-03-09 16 views
3

私はこのアプリを持っています。このアプリでは、アクティビティ内の特定の変数を更新し、このアクティビティはBroadcastReceiverを使用して新しい変数をIntentServiceに渡します。しかし、IntentServiceのBroadcastReceiverはブロードキャストを受信して​​いないようです。これは、サービス内のコードがブロードキャストを受信して​​いないサービス内のBroadcastReceiver Android

protected class UpdateReceiver extends BroadcastReceiver{ 
    @Override 
    public void onReceive(Context context, Intent intent){ 
     Log.d("receiver", "Got message: "); 
     //state=3; 
     //Toast.makeText(context, "got it", Toast.LENGTH_SHORT).show(); 
    } 
}; 

を放送受信機を作成し、ここに

IntentFilter intentFilter = new IntentFilter(); 
intentFilter.addAction("updates"); 
UpdateReceiver lol = new UpdateReceiver(); 
DetectService.this.registerReceiver(lol, intentFilter); 

が最後にここにブロードキャストを送信するためのコードですonHandle()関数の中で、レシーバを登録するためのコードだことです私は放送部分と同じ活動に受信機を置く活動

Intent broadcastIntent = new Intent(); 
broadcastIntent.setAction("updates"); 
HomePageActivity.this.sendBroadcast(broadcastIntent); 
Log.d("sender", "send msg"); 

から、それは動作しますが、私はIntentServiceに入れていないとき。助けてください!

ブロードキャストはすべてローカルですが、eclipseは互換性クラスをインポートできないように見えるため、このプロジェクトでLocalBroadcastManagerを使用してみました。 Android SDKマネージャを使用してインストールしました。私がここで間違っていることはありますか?

+0

マニフェストで受信者を宣言していますか? – dldnh

+0

ok放送局と同じアクティビティに受信機を入れてマニフェストに登録すると、受信機は受信しますが、プログラムもクラッシュします。ここでの注釈は、マニフェストまたは電子プログラムのいずれかに登録することを暗示するように見えますが、両方ではありません。 http://developer.android.com/reference/android/content/Context.html#registerReceiver(android.content.BroadcastReceiver、android.content.IntentFilter) –

答えて

4

この活動は、BroadcastReceiverを使用してIntentServiceに新しい変数を渡します。

これは意味をなさない。コマンドをIntentServiceに送信するには、startService()を使用します。またIntentServiceBroadcastReceiverであってはなりません。IntentServiceは完了するとすぐに破棄されるため、ブロードキャストを受信することはありません。

ブロードキャストはすべてローカルですが、eclipseは互換性クラスをインポートできないようですので、LocalBroadcastManagerをこのプロジェクトで使用しようとしました。

::肩をすくめる:: LocalBroadcastManagerを使用してEclipseのプロジェクトファイルと

Here is a sample project。プロジェクトの作成時にEclipseの問題が発生していませんでした。

+0

IntentServiceにはセンサーリスナーが登録されているため、サービスは停止していないようです。 –

+0

@ TanJingYuan:いいえ、あなたは単にリスナーを漏らしているだけであり、非常に悪いことです。 'IntentService'はリスナーでの使用には適していません。 – CommonsWare

+0

OK。ありがとう!私はそれをサービスに変更しようとします。 –

2
protected class UpdateReceiver extends BroadcastReceiver{ 
    @Override 
    public void onReceive(Context context, Intent intent){ 
     Log.d("receiver", "Got message: "); 
     //state=3; 
     //Toast.makeText(context, "got it", Toast.LENGTH_SHORT).show(); 
    } 
}; 

onCreate()メソッドまたは関連する場合。

mReceiver = new UpdateReceiver(); 
IntentFilter filter = new IntentFilter(); 
filter.addAction("<your receivers intent goes here>"); 
this.registerReceiver(mReceiver, filter); 

これで、ブロードキャストを送信できるようになりました。

Intent intent = new Intent("<your receivers intent goes here>"); 
// Add what you want to add to the intent right here. 
<context-handle>.sendBroadcast(intent); 
+1

試しても動作しません。おそらく私はインテントサービスよりもむしろサービスとして実装すべきです。 –

+0

@タンジェンユアンそれはうまくいくはずです。私はこれを頻繁に使用します。マニフェストで何を定義しましたか?受信機にandroid:enabled = "true"が設定されていることを確認してください。マニフェストを投稿できますか? – jjNford

+0

あなたはそうだと思いますが、それはおそらくうまくいくはずですが、以下の他の回答に基づいて、問題はReceiverではなく、サービスとしてではなくIntentServiceとして実装していたようです。 –

関連する問題