介绍AlarmManager及其保存方式



我正在制作一个使用闹钟服务的应用程序。我还在学习它是如何工作的,但有一件事很不清楚,也没有解释。

假设你在启动应用程序时创建了一个闹钟。这个闹钟被保存在某个地方,因为即使你的应用程序没有运行,它也需要触发,对吗?

如果是这样,我怎么能得到这个警报时,重新启动我的应用程序,所以我不创建一个新的每一次,并有一个无限的警报存储在某个地方?

如果没有,它是如何工作的?我正在考虑使用数据库或json文件,但我有一种感觉,这是没有必要的。

在我的MainActivity类中,我有这个代码来检查警报是否已经存在(这个代码显然是错误的)…

AlarmReceiver alarm;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button b = (Button) findViewById(R.id.button);
    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(alarm != null){
                alarm.cancel();
            }
            alarm = new AlarmReceiver(MainActivity.this);
        }
    });

}

我已经设置了一个BroadcastReceiver当设备重新启动(在android教程中解释)

public class SampleBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
        new AlarmReceiver(context);
    }
}
}

这是AlarmReceiver类本身:

public class AlarmReceiver {
private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
public AlarmReceiver(Context context){
    alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, AlarmBroadcastReceiver.class);
    alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 17);
    calendar.set(Calendar.MINUTE, 30);
    alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
            1000 * 60 * 20, alarmIntent);
    ComponentName receiver = new ComponentName(context, SampleBootReceiver.class);
    PackageManager pm = context.getPackageManager();
    pm.setComponentEnabledSetting(receiver,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);
}
public void cancel(){
    alarmMgr.cancel(alarmIntent);
}
}

和AlarmBroadcastReceiver,它只是启动一个通知(它工作):

public class AlarmBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    new NotificationMessage(context);
}
}

闹钟被保存在某个地方,因为即使你的应用程序没有运行,它也需要触发,对吗?

正确的。

当我重新启动我的应用程序时,我怎么能得到这个警报

你不。这是一个只写的API。

所以我不创建一个新的每一次,并有一个无限的警报存储在某个地方?

只在需要的时候创建一个警报,而不是每次运行你的应用程序。

除此之外,在调用AlarmManager方法时,使用等效的PendingIntent来替换现有告警(或使用cancel()来取消告警)。

我正在考虑使用数据库或json文件,但我有一种感觉,这是没有必要的。

您需要在持久存储中存储足够的信息,以便知道当警报响起时该怎么做。您还需要在持久存储中保存足够的信息,以便在必须重新安排以前安排的警报时,了解需要哪些警报来处理重新启动。

最新更新