Androidアプリ BroadcastReceiverがブロードキャストを受信しない
AndroidネイティブのJavaアプリで、アラームを発火してBroadcastReceiverで受信するアプリを作ってたのだがうまくいかなかった
公式のドキュメントや方々のブログを参考に以下の内容のソースを書いた。5秒後にアラームをセットして、BloadCastReceiverクラスから派生したAlaramReceiverクラスのonReceiveメセッドで受信されるといった簡単なもの。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="hogehoge.com"> <uses-permission android:name="android.permission.WAKE_LOCK" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <receiver android:name=".AlarmReceiver" android:process=":remote" /> </application> </manifest>
AlarmReceiver.java
package club.selfiem.proto; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; import android.util.Log; public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Received ", Toast.LENGTH_LONG).show(); Log.i("Receiver", ""); } }
MainActivity.java
// アラームの設定 Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); Log.i("Cal", String.valueOf(calendar.getTime())); calendar.add(Calendar.SECOND, 5); Log.i("Cal", String.valueOf(calendar.getTime())); Intent alarmIntent = new Intent(getApplicationContext(), AlarmReceiver.class); pending = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, 0); alarmIntent.setAction("MY_ALARM"); am = (AlarmManager)getSystemService(Context.ALARM_SERVICE); if(am != null){ am.setExact(RTC_WAKEUP, calendar.getTimeInMillis(), pending); Toast.makeText(getApplicationContext(), "Set Alarm", Toast.LENGTH_SHORT).show(); }
このソースは、何もないスケルトンのandroidプロジェクトに実装すると正常に動作した。
しかし、数枚のアクティビティとAsyncTaskの派生クラスによって非同期プロセスを実装したプロジェクトでは、なぜかBroadcastReceiverにアラームを受信できなかった。
なお、アラームはシステムに正常に登録されていることはadbでdumpsysコマンドを発行して確認はできた
【メモ:adbでdumpsysで登録されたアラームを確認する】
adb shell dumpsys alarm
いろいろ試した結果、AnroidManifest.xmlでReceiverを登録するときに
android:process=":remote"
としていることが障害となっていたようで、これを削除すると正常にアラームが発行された。
このandroid:process=":remote" は、メインスレッドとは別スレッドでレシーバを稼働させる(理解が間違っているかも)ための指定らしい。公式のドキュメントを見てもが自分の理解力が乏しくよくわからず。。ググってみるとなんとなくコピペして使っているサンプルが多数出回っている風。
時間の余裕ができたらちゃんと調べてみたい