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 中设置。

因此,我如何检查是否已经设置了警报管理器。

4

2 回答 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();
}
于 2012-08-31T11:24:44.357 回答
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);

您可能需要更改意图的上下文,使其与接收器中的上下文相同。

另一种解决方法是检测它是否是应用程序的第一次启动,然后才启动它。但是,如果用户在第一次启动之前重启手机会发生什么?

于 2012-08-31T11:27:41.583 回答