5

特定の時間に通知を送信するアラームがあります(その日に連絡先の誕生日がある場合)。

私が必要としているのは、私がアラームを設定するとき、それは毎年同じ日にそして同時に繰り返されるべきであるということです。どうすればそれができますか?

Intent myIntent = new Intent(Main.this, MyAlarmService.class);
pendingIntent = PendingIntent.getService(Main.this, 0, myIntent, 0);

AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);

Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
cal.clear();
cal.set(2012,5,20,18,40);

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

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 60*60*24*365*1000, pendingIntent);

これはAlarmServiceです。

public class MyAlarmService extends Service {
  static final int uniqueID = 1394885;
  private PendingIntent pendingIntent;

  @Override
  public void onCreate() {
    // TODO Auto-generated method stub
    Toast.makeText(this, "MyAlarmService.onCreate()", Toast.LENGTH_LONG).show();

  }

  @Override
  public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    Toast.makeText(this, "MyAlarmService.onBind()", Toast.LENGTH_LONG).show();
    return null;
  }

  @Override
  public void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    Toast.makeText(this, "MyAlarmService.onDestroy()", Toast.LENGTH_LONG).show();
  }

  @Override
  public void onStart(Intent intent, int startId) {
    // TODO Auto-generated method stub

  }

  @Override
  public boolean onUnbind(Intent intent) {
    // TODO Auto-generated method stub
    Toast.makeText(this, "MyAlarmService.onUnbind()", Toast.LENGTH_LONG).show();
    return super.onUnbind(intent);
  }
}

私を手伝ってくれますか?

4

2 に答える 2

8
Intent intent = new Intent(this, MyReceiver.class);
intent.putExtra("key", "Alert");
pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, 0);

alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar calendar=Calendar.getInstance();

// Calendar.set(int year, int month, int day, int hourOfDay, int minute, int second)
calendar.set(2013, Calendar.OCTOBER, 13, 18, 55, 40);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 5*1000, pendingIntent);

このパラメータは、後続のアラームの繰り返し間のミリ秒単位の間隔です。

5 * 1000=5秒

サンプル:

1年=365(日)* 24(時間)* 60(分)* 60(秒)* 1000(秒->ミリ秒);
//うるう年366日

月の値は0から始まるため、次のような定数を使用する方が明確な場合があります。Calendar.OCTOBER

MyReceiver.java

public class MyReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
       Toast.makeText(context,intent.getStringExtra("key"),Toast.LENGTH_SHORT).show();
  }

}

更新:注:API 19(Build.VERSION_CODES.KITKAT)以降、アラーム配信は不正確です。OSは、ウェイクアップとバッテリーの使用を最小限に抑えるためにアラームをシフトします。厳密な配信保証を必要とするアプリケーションをサポートするための新しいAPIがあります。setWindow(int、long、long、PendingIntent)およびsetExact(int、long、PendingIntent)を参照してください。targetSdkVersionがAPI19より前のアプリケーションは、要求されたときにすべてのアラームが正確に配信されるという以前の動作を引き続き確認します。参照

アラームマネージャーの代わりに、 Android21にはJobSchedulerを、古いデバイスにはFirebaseJobDispatcherを使用することをお勧めします

更新:Googleは、WorkManagerを使用したJetPackスケジュールタスクの一部としてWorkManagerをリリースしました

于 2013-10-31T04:27:15.913 に答える
4

を使用してアラームを設定しますalarmManager.set()

Intent myIntent = new Intent(Main.this, MyAlarmService.class);
pendingIntent = PendingIntent.getService(Main.this, 0, myIntent, 0);

AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);

Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
cal.clear();
cal.set(2012,5,20,18,40);

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

そして、アラームが鳴ったら、から翌年のアラームを設定しMyAlarmServiceます。

于 2012-06-20T16:11:09.553 に答える