【AlarmManager】レシーバーのOnReceiveの処理が走らない。

2,098 views
Skip to first unread message

helloooideeeeea

unread,
Jan 28, 2013, 8:57:22 AM1/28/13
to android-g...@googlegroups.com
お世話になってなります。

15秒毎に現在時刻をToastするプログラムを作っているのですが、Toastが表示されません。
ログを見てみると、レシーバーのOnReceiveまで処理が走っていませんでした。
どうすれば処理が走るようになるか、申し訳ないですが、ご教授お願いいたします。

ソース1(AlarmActivity)

  1. public class AlarmActivity extends Activity implements View.OnClickListener {

  2. private PendingIntent mAlarmIntent;

  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. findViewById(R.id.start).setOnClickListener(this);
  8. findViewById(R.id.stop).setOnClickListener(this);
  9. Intent launchIntent = new Intent(AlarmActivity.this, AlarmReceiver.class);
  10. mAlarmIntent = PendingIntent.getBroadcast(AlarmActivity.this, 0, launchIntent, 0);
  11. }

  12. @Override
  13. public void onClick(View v) {
  14. AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
  15. long interval = 5 * 1000;

  16. switch (v.getId()) {
  17. case R.id.start:
  18. Toast.makeText(this, "Scheduled", Toast.LENGTH_SHORT).show();
  19. manager.setRepeating(AlarmManager.ELAPSED_REALTIME,
  20. SystemClock.elapsedRealtime()+interval, interval,mAlarmIntent);
  21. break;

  22. case R.id.stop:
  23. Toast.makeText(this, "Canceled", Toast.LENGTH_SHORT).show();
  24. manager.cancel(mAlarmIntent);
  25. break;
  26. default:
  27. break;
  28. }
  29. }
  30. }
ソース2(AlarmReceiver)

  1. public class AlarmReceiver extends BroadcastReceiver {
  2. @Override
  3.      public void onReceive(Context context, Intent intent) {
  4.          Log.i("AlarmReveiver", "onReceive");
  5.          Calendar now = Calendar.getInstance();
  6.          DateFormat formatter = SimpleDateFormat.getTimeInstance();
  7.          Log.i("AlarmReceiver", "Alarm Received! : " +  "now:" + formatter.format(now.getTime()));
  8.      }
  9. }

マニフェストファイル

  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2.     package="com.example.alarmmanagement"
  3.     android:versionCode="1"
  4.     android:versionName="1.0" >
  5.     <uses-sdk
  6.         android:minSdkVersion="15"
  7.         android:targetSdkVersion="15" />
  8.     <application
  9.         android:icon="@drawable/ic_launcher"
  10.         android:label="@string/app_name"
  11.         android:theme="@style/AppTheme" >
  12.         <reveiver
  13.            android:name=".AlarmReceiver" >
  14.         </reveiver>
  15.         <activity
  16.             android:name=".AlarmActivity"
  17.             android:label="@string/title_activity_alarm" >
  18.             <intent-filter>
  19.                 <action android:name="android.intent.action.MAIN" />
  20.                 <category android:name="android.intent.category.LAUNCHER" />
  21.             </intent-filter>
  22.         </activity>
  23.     </application>
  24. </manifest>


Hirokazu Fukami

unread,
Jan 28, 2013, 9:24:52 AM1/28/13
to android-g...@googlegroups.com
こんばんはfkmです。

実機をUSBでつないで
adb shell dumpsys alarm
で、現在のタイマーの状況が分かります。

で、気になったのが
> manager.setRepeating(AlarmManager.ELAPSED_REALTIME,
> SystemClock.elapsedRealtime()+interval, interval,mAlarmIntent);
の第2引数です。
System.currentTimeMills() + interval
で、最初の実行を現在時刻 + interval後にセット になると思うのですが試してみましたか?

2013/1/28 helloooideeeeea <yasushi...@gmail.com>:
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com
> にメールを送信してください。
> http://groups.google.com/group/android-group-japan?hl=ja
> からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>



--
-------------------------------------------------------------
深見 浩和(Hirokazu Fukami)

URI:http://www.fkmsoft.jp
email: f...@fkmsoft.jp

helloooideeeeea

unread,
Jan 28, 2013, 11:27:54 AM1/28/13
to android-g...@googlegroups.com
迅速なご返答ありがとうございます。

>System.currentTimeMills() + interval 

上の様に、setRepeatingの第2引数を書き換えて実行しましたが、
onReceive の処理は走りませんでした。

>adb shell dumpsys alarm 

行いました。意外(?)な事に、System.currentTimeMills()の場合と、SystemClock.elapsedRealtime()の場合とでは、
出力結果が違いました。以下に抜粋します。

SystemClock.elapsedRealtime() の場合

ELAPSED #0: Alarm{41993990 type 3 com.example.alarmmanagement}
 type=3 when=+12s435ms repeatInterval=15000 count=1
 operation=PendingIntent{41b05988: PendingIntentRecord{419880d8 com.example.alarmmanagement broadcastIntent}}
(…しばらく続いて)
com.example.alarmmanagement
 29ms running, 0 wakeups
 3 alarms: flg=0x14 cmp=com.example.alarmmanagement/.AlarmReceiver

System.currentTimeMills()の場合

 ELAPSED #11: Alarm{41a8d210 type 3 com.example.alarmmanagement}
 type=3 when=+999d23h59m59s999ms repeatInterval=15000 count=0
 operation=PendingIntent{41b9c028: PendingIntentRecord{419880d8 com.example.alarmmanagement broadcastIntent}}
(以下に記載なし)

以上、よろしくお願いいたします。
> このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-japan+unsubscribe@googlegroups.com

Makoto Yamazaki

unread,
Jan 28, 2013, 8:08:57 PM1/28/13
to android-g...@googlegroups.com
zaki です。

> で、気になったのが
>> manager.setRepeating(AlarmManager.ELAPSED_REALTIME,
>> SystemClock.elapsedRealtime()+interval, interval,mAlarmIntent);
> の第2引数です。
> System.currentTimeMills() + interval
> で、最初の実行を現在時刻 + interval後にセット になると思うのですが試してみましたか?

AlarmManager.ELAPSED_REALTIME を使用しているので、SystemClock.elapsedRealtime()
を使うのは正しいです。System.currentTimeMills() を使うのは AlarmManager.RTC* の場合です。
今回は15秒という経過時間で alarm を使いたいようなので .ELAPSED_REALTIME を使うことも
適切だと思います。

で、動かない原因ですが AndroidManifest.xml の

<reveiver
android:name=".AlarmReceiver" >
</reveiver>

に typo があります。 reveiver を receiver に変えれば動くと思います。

--
YAMAZAKI Makoto

helloooideeeeea

unread,
Jan 28, 2013, 9:02:02 PM1/28/13
to android-g...@googlegroups.com
ありがとうございます!
自分も先ほど気づいてしまいました!
動作いたしました!
気づいた時は、思わず、目が見開いてしまいました…。
うれしい反面、自分にがっかりです。
Reply all
Reply to author
Forward
0 new messages