2016-12-03 7 views
0

Androidスタジオで簡単な目覚まし時計アプリケーションを開発しようとしていますが、AlarmManagerBroadcastReceiverを正しく使用する方法がわかりません。私MainActivityAndroidスタジオアラームサービスが自動的に起動しない

私はAlarmManagerのために、私は必要なすべてをインスタンス化している(IntentPendingIntent、と私はTimePickerから受信した時刻を保持するためのカレンダーを使用しています)。私は、受信機がAlarmReceiverと呼ばれ、そのonReceive()で、私は、今のところ、テスト目的のために

Toast.makeText(context, "I'm running", Toast.LENGTH_SHORT).show(); 
Log.e("Receiver", "Receiver entered"); 

が、私は1つであることをアラーム時間を設定したボタンのonClickイベントに

alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent); 

を、このラインを持っています私はアプリをデバッグするたびに現在の時刻から1分です。時間を設定したら、AlarmManagerを設定するボタンを押します。時間がアラーム時間になると、ToastメッセージとLogメッセージは単独では表示されません。アラーム時刻である分の時間にボタンが押された場合にのみ表示されます。

たとえば、アラーム時刻が3:00で、現在の時刻が2:59で、ボタンを押してAlarmManagerを設定したとします。 3時になると、メッセージは表示されません。 3時の1分以内にボタンを押すと表示されます。

これは正常な動作ですか?もしそうなら、メッセージを自動的に表示して、後で着信音に拡張できるようにすべての設定が完了したらどうすればいいですか?

私は時間値が正しいとすることを確保している受信機は、このような何かにmanifest

+0

サービスを開始するためにインテントを渡しましたか? – Dhruv

+0

はい私はしました。私はテストの目的でmp3ファイルを再生するサービスを追加しました。問題は、現在時刻がアラーム時刻になっても自動的に開始しないことです。ボタンを押す必要があります – bitscuit

答えて

0

試しに指定されていること:

private static void setUpAlarm(final Context context, final Intent    intent, final int timeInterval){ 
final AlarmManager am = (AlarmManager)  context.getSystemService(Context.ALARM_SERVICE); 
final PendingIntent pi = PendingIntent.getBroadcast(context, timeInterval, intent, 0); 
am.cancel(pi); 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
{ 
    final AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(System.currentTimeMillis() + timeInterval, pi); 
    am.setAlarmClock(alarmClockInfo, pi); 
} 
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) 
    am.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInterval, pi); 
else 
    am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInterval, pi); 
} 
+0

あなたは間違っています。このコードは新しいAPIを処理しません – Vyacheslav

+0

さらに 'setAlarmClock'は本当にひどいです – Vyacheslav

0

私は本当にこのコードを使用することをお勧めしています:

int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
    if (currentapiVersion < android.os.Build.VERSION_CODES.KITKAT){ 
     am.set(AlarmManager.RTC_WAKEUP, nexttime, pi); 
    } else if (currentapiVersion < android.os.Build.VERSION_CODES.M) { 
      am.setExact(AlarmManager.RTC_WAKEUP, nexttime, pi); 
     } else { 
      am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, nexttime, pi); 
     } 
関連する問題