コード書いていたら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回呼ばれるようになった。