web-dev-qa-db-ja.com

Android複数のアラームを設定

私は、Androidアプリを時間に沿って複数回警告する(または警告する)必要があるアプリを実装しようとしています。

すでに検索しましたが、見つかった最も近いものは固定数のアラームセットであり、この例は機能しなかったと思います。

アラームの配列など、複数のアラームを動的に設定し、特定のタイムスタンプでそれらのアラームをトリガーするアプローチが存在するかどうかを知りたい。

38
Sammy

複数のアラーム(繰り返しまたは単一)を設定する場合は、異なるPendingIntentrequestCodesを作成するだけです。 requestCodeが同じ場合、新しいアラームは古いアラームを上書きします。

複数の単一アラームを作成し、ArrayListに保持するコードを次に示します。 PendingIntentを配列に保持します。これは、アラームをキャンセルするために必要なものだからです。

// context variable contains your `Context`
AlarmManager mgrAlarm = (AlarmManager) context.getSystemService(ALARM_SERVICE);
ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>();

for(i = 0; i < 10; ++i)
{
   Intent intent = new Intent(context, OnAlarmReceiver.class);
   // Loop counter `i` is used as a `requestCode`
   PendingIntent pendingIntent = PendingIntent.getBroadcast(context, i, intent, 0);
   // Single alarms in 1, 2, ..., 10 minutes (in `i` minutes)
   mgrAlarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
                SystemClock.elapsedRealtime() + 60000 * i, 
                pendingIntent); 

   intentArray.add(pendingIntent);
}

また、この質問を参照してください: アンドロイドで一度に複数のアラームを設定する方法?

91

アラームの繰り返しを設定できます。

この場合:

public void AddAlarm(int requestCode,MutableDateTime dueDate,int repeat) {
        Intent intent = new Intent(context, AlarmReceiver.class);
        intent.putExtra(Constants.RECORD_ID, requestCode);
        intent.putExtra("REPEAT", repeat);
        PendingIntent operation = PendingIntent.getBroadcast(context, requestCode, intent,  PendingIntent.FLAG_ONE_SHOT );
        MutableDateTime due = dueDate.toMutableDateTime();
        switch(repeat){
        case NO_REPEAT:
            due.addMinutes(0);
            break;
        case DAILY:

            due.addDays(1); 
            break;
        case WEEKLY:
            due.addWeeks(1);
            break;
        case MONTHLY:
            due.addMonths(1);
            break;
        case MONTHLY_2:
            due.addWeeks(5);            
            break;
        case YEARLY:
            due.addYears(1);
            break;
        }
        due.add(-(dueDate.getMillis()));
        due.setSecondOfMinute(0);
        dueDate.setSecondOfMinute(0);
        alarm.cancel(operation);
        alarm.set(AlarmManager.RTC_WAKEUP, dueDate.getMillis(), operation);
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, dueDate.getMillis(), due.getMillis(), operation);
}
5
iamkristher

複数のアラームを動的に設定するために使用したアプローチは、単一のアラームを作成することです。次に、アラーム設定クラスで、静的な整数(要求コードとして使用される)が初期化されます。これは、メインアクティビティで[アラームの追加]ボタンをクリックするたびにメインアクティビティから増分されます。例えば。

MainActivity.Java

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

public void addAlarmClick(View v) {
    AlarmActivity.broadcastCode++;
    startActivity(new Intent(this, AlarmActivity.class));
}
}

AlarmActivity.Java

public class AlarmActivity extends AppCompatActivity {`

public static int broadcastCode=0;
/*some code here*/
Intent myIntent = new Intent(AlarmActivity.this, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(AlarmActivity.this,
                            broadcastCode, myIntent, 0);

これが役立つことを願っています。

0
Junaid