web-dev-qa-db-ja.com

BroadcastReceiverの登録を解除する方法

私のアプリはBroadcastReceiverを使用して、次の方法でsmsを取得します。

SmsBR.Java

_public class SmsBR extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        if (bundle != null) {
            Object[] pdus = (Object[])bundle.get("pdus");
            final SmsMessage[] messages = new SmsMessage[pdus.length];

            for (int i = 0; i < pdus.length; i++) {
                messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
            }
            if (messages.length > 0)
                //doSomething();
            }
        }
    }
}
_

Manifest.xml

_<application Android:icon="@drawable/icon" Android:label="@string/app_name">
    <activity Android:name=".Activity" Android:label="@string/app_name">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />
            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter> 
    </activity>

    <receiver Android:name=".SmsBR">
        <intent-filter>
            <action Android:name="Android.provider.Telephony.SMS_RECEIVED"></action>
        </intent-filter>
    </receiver>
</application>    
_

このようにして、SmsBRは常にオンになります。サービスの開始時に登録し(onCreate())、サービスが破棄されたときに登録を解除します(onDestroy())。これどうやってするの?

41
supergiox

編集:

アクティビティの場合:

アプリ内からブロードキャストレシーバーを登録するには、最初にAndroidManifest.xmlファイルから_<receiver>_タグを削除します。次に、registerReceiver(BroadcastReceiver receiver, IntentFilter filter)onResume()を呼び出します。 unregisterReceiver(BroadcastReceiver receiver)onPause()を使用して、ブロードキャストレシーバーの登録を解除します。

サービスの場合:

マニフェストファイルからレシーバタグを削除します。その後、onCreate()で同じメソッドを使用してブロードキャストレシーバーを登録し、onDestroy()で登録解除できます。

編集:サンプルコード:

_public class MyActivity extends Activity {
  private final BroadcastReceiver mybroadcast = new SmsBR();

  public void onResume() {
    super.onResume();

    IntentFilter filter = new IntentFilter();
    filter.addAction("Android.provider.Telephony.SMS_RECEIVED");
    registerReceiver(mybroadcast, filter);
  }

  public void onPause() {
    super.onPause();

    unregisterReceiver(mybroadcast);
  }
}
_
96
WindsurferOak

onDestroy()の呼び出しは保証されていません。 Activtyからアクティビティを開始すると、onPause()の代わりにonStop()およびonDestroy()メソッドが呼び出されます。

onDestroy()は、戻るボタンを押すか、finish()メソッドを呼び出すと呼び出されます。

したがって、ブロードキャストレシーバーはonStart()またはonResume()に登録し、onPause()またはonStop()でレシーバーの登録を解除する必要があります。 =

onDestroy()メソッドでレシーバーの登録を解除すると、)Appでメモリリークが発生する場合があります。

19
vivek

最初にマニフェストから受信者タグを削除してから、サービス用に:

@Override
public void onCreate() {


    myReceiver = new SmsBR();
    IntentFilter filter = new IntentFilter();
    filter.addAction("Android.intent.action.SMS_RECEIVED");// add any actions you want
    registerReceiver(myReceiver , filter);

 }

@Override
public void onDestroy() {
    super.onDestroy();
    if (myReceiver != null)
        unregisterReceiver(myReceiver);
}

アクティビティ用:

public class MyActivity extends Activity {
  private final BroadcastReceiver mybroadcast = new SmsBR();

  public void onResume() {
    super.onResume();

    IntentFilter filter = new IntentFilter();
    filter.addAction("Android.provider.Telephony.SMS_RECEIVED");
    registerReceiver(mybroadcast, filter);
  }

  public void onPause() {
    super.onPause();

    if (mybroadcast!= null)
       unregisterReceiver(mybroadcast);
  }
}
0
Maher