如何检查警报是否已设置并运行

3

我有一个接收器,它会在手机启动后自动启动:

<receiver android:name=".OnBootReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>

</receiver>

在接收器中,我设置了一个像这样的闹钟:

AlarmManager  mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

        Intent i=new Intent(context, LocationPoller.class);

        i.putExtra(LocationPoller.EXTRA_INTENT,
                  new Intent(context, LocationReceiver.class));
        i.putExtra(LocationPoller.EXTRA_PROVIDER,
                 LocationManager.GPS_PROVIDER);



         PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);
          mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                        SystemClock.elapsedRealtime(),
                        PERIOD,
                        pi);

它的功能很好,除了当用户安装应用程序时,闹钟直到用户重新启动手机才会设置。

为了解决这个问题,我需要从我的Activity中检查AlarmManager是否已经设置,如果没有,则需要从Activity中设置。

那么,如何检查AlarmManager是否已经设置呢?


你可以查看以下链接:https://dev59.com/mm455IYBdhLWcg3wD_6Z - Basher51
2个回答

4

你唯一能做的就是在用户第一次安装并打开应用时,在SharedPreference中设置一个标志,告诉你是否设置了闹钟。如果没有设置,则设置闹钟。

在你的主要Activity中,在onCreate方法中检查。

SharedPreferences spref = getSharedPreferences("TAG", MODE_PRIVATE);

 Boolean   alaram_set = spref.getBoolean("alarm_set_flag", false);  //default is false

if(!alaram_set){
//create your alarm here then set the flag to true

 SharedPreferences.Editor editor = spref.edit();
        editor.putBoolean("alarm_set_flag", true); // value to store
        editor.commit();
}

如果我在不同的虚拟机中运行AlarmManager,而我的活动使用选项“android:process =”:remote”,这是否有效? - user836026
1
如果您想从不同的进程访问共享首选项而不是MODE_PRIVATE,请使用MODE_MULTI_PROCESS。 - confucius

2
不幸的是,您无法查询AlarmManager以获取当前警报。
解决问题的最佳选择是取消当前警报并设置新警报。
您只需要创建一个与接收器中的意图匹配的意图。 此处有更多信息 因此,请将此添加到您的活动中。
   AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

     Intent i=new Intent(context, LocationPoller.class);

        i.putExtra(LocationPoller.EXTRA_INTENT,
                  new Intent(context, LocationReceiver.class));
        i.putExtra(LocationPoller.EXTRA_PROVIDER,
                 LocationManager.GPS_PROVIDER);

        PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);
    // Cancel alarms
    try {
        AlarmManager.cancel(pi);
    } catch (Exception e) {
        Log.e(TAG, "AlarmManager update was not canceled. " + e.toString());
    }
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                        SystemClock.elapsedRealtime(),
                        PERIOD,
                        pi);

您可能需要更改意图的上下文,以使其与接收器中的上下文相同。
另一种解决方法是检测它是否是应用程序的第一次启动,然后仅在那时启动它。但是如果用户在第一次启动之前重新启动手机会发生什么呢?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接