2010-12-16 9 views
24

buttonから開始して停止できるserviceがあります。サービスの受信機を登録する

しかし、service内には、SMSブロードキャストを受信する受信者を登録したいと考えています。私はserviceが実行中にSMSを待ち受けるだけです。私はregisterReceiver(receiver, intentfilter)を試しましたが、これは動作しません。私は間違って何をしていますか?

+0

この質問は、問題を指定するとより役立ちます。 "これは動作しません" = "受信者は決して呼ばれません"、例えば?それとも、SMS_RECEIVED_ACTIONでは呼び出されませんか?またはエラーがありますか?または... – LarsH

答えて

2

AndroidManifestファイルにアクセス許可を設定する必要があります。ご利用のサービスで動的のonCreate()で、あなたの受信機を登録する必要があります実行しているときにのみ放送を受信する場合

<receiver android:name=".MySMSReciever"> 
     <intent-filter> 
      <action android:name= 
       "android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 

<uses-permission android:name="android.permission.RECEIVE_SMS"/> 
+0

私はそれをしました。 AccountManagerServiceとContactsProviderエラーが発生する/ – Vic

+0

IntentFilterは正しいですか?プライベート静的最終文字列SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED"? – Vic

+4

はい、受信者をマニフェストに追加する方法ですが、動的に登録する必要があります。上記の方法は、サービスが停止していても着信SMSをすべて受信します。私は私のサービスが動いている間だけSMSを聞きたいです。 – Vic

77

また、onDestroyであなたの受信機の登録を解除することを忘れないことが重要です() 方法!

例:

import android.app.Service; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.IBinder; 
import android.widget.Toast; 

public class YourClass extends Service { 

    private static final String ACTION="android.provider.Telephony.SMS_RECEIVED"; 
    private BroadcastReceiver yourReceiver; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     final IntentFilter theFilter = new IntentFilter(); 
     theFilter.addAction(ACTION); 
     this.yourReceiver = new BroadcastReceiver() { 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       // Do whatever you need it to do when it receives the broadcast 
       // Example show a Toast message... 
       showSuccessfulBroadcast(); 
      } 
     }; 
     // Registers the receiver so that your service will listen for 
     // broadcasts 
     this.registerReceiver(this.yourReceiver, theFilter); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     // Do not forget to unregister the receiver!!! 
     this.unregisterReceiver(this.yourReceiver); 
    } 

    private void showSuccessfulBroadcast() { 
     Toast.makeText(this, "Broadcast Successful!!!", Toast.LENGTH_LONG) 
       .show(); 
    } 
} 
+1

DDoSAttackありがとう、これはかなり簡単でしたが、これを検索するのに数時間を費やしましたが、良い解決策は見つかりませんでしたが、あなたはかなり簡単で分かりました。 (Y)ありがとう:) – Zaksh

+0

なぜこの答えは解決策として受け入れられないのですか? – akmal

+0

この回答は正しいです。私はIntentServiceのためにこれを使用し、それも働いたので、特にonCreate()で受信機を登録することに重点を置いておきたいと思います! – Edeph

1

XMLからインテントフィルタを削除し、受信側の唯一の動的登録を行います。 サービスがオフのときに機能しないようにするには、サービスを停止する前にサービスの登録を解除します。ただし、XMLにアクセス許可を追加することを忘れないでください。