BroadcastReceiverが2回呼ばれる!?

コード書いていたらBroadCastReceiverが2回呼ばれるなと思ったコードが
MainActivity.java

package jp.co.missreceiver;

import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity implements View.OnClickListener {
   MyReceiver myReceiver;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      findViewById(R.id.callButton).setOnClickListener(this);
   }

   @Override
   protected void onResume() {
      super.onResume();
      myReceiver=new MyReceiver();
      IntentFilter intentFilter=new IntentFilter(MyReceiver.action);
      registerReceiver(myReceiver,intentFilter);
   }

   @Override
   protected void onPause() {
      unregisterReceiver(myReceiver);
      super.onPause();
   }

   @Override
   public void onClick(View v) {
      if(v.getId()==R.id.callButton){
         sendBroadcast(new Intent(MyReceiver.action));
      }
   }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest
    package="jp.co.missreceiver"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="MyReceiver.action"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

MyReceiver.java

package jp.co.missreceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MyReceiver extends BroadcastReceiver {

   private static final String TAG = MyReceiver.class.getSimpleName();
   public static final String action = "MyReceiver.action";

   public MyReceiver() {
   }

   @Override
   public void onReceive(Context context, Intent intent) {
      String text = "BroadcastReceiver is called";
      Log.d(TAG, text);
   }
}

で原因は2重に登録していたことだった

            <intent-filter>
                <action android:name="MyReceiver.action"/>
            </intent-filter>

public class MainActivity extends Activity implements View.OnClickListener {
   MyReceiver myReceiver;

   @Override
   protected void onResume() {
      super.onResume();
      myReceiver=new MyReceiver();
      IntentFilter intentFilter=new IntentFilter(MyReceiver.action);
      registerReceiver(myReceiver,intentFilter);
   }

   @Override
   protected void onPause() {
      unregisterReceiver(myReceiver);
      super.onPause();
   }
}

が被ってしまっていたらしい

今回はReceiverをonResumeで登録,onPauseで解除するつもりだったので

<?xml version="1.0" encoding="utf-8"?>
<manifest
    package="jp.co.missreceiver"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true" />
    </application>

</manifest>

と修正したら正常に1回呼ばれるようになった。

スポンサーリンク

シェアする

フォローする

スポンサーリンク