无法在活动中取消AlarmManager

时间:2014-12-12 21:19:44

标签: java android broadcastreceiver alarmmanager

我需要使用BroadcastReceiver启动AlarmManager,它会在Activity中启动Service。

当我这样做的时候:

  static int requestCode =12;

     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.car_search_activity);
        mContext=  this;
         alarms =  (AlarmManager) mContext
                .getSystemService(Context.ALARM_SERVICE);
        intent = new Intent(mContext,
                CarSearchResultsBroadcastReceiver.class);
        pi= PendingIntent.getBroadcast(mContext,
                requestCode , intent, PendingIntent.FLAG_UPDATE_CURRENT);
        alarms.setRepeating(AlarmManager.RTC_WAKEUP,
                System.currentTimeMillis(), 10000, pi);
    }

    @Override
    protected void onPause() {
        Log.i(TAG, "onPause");
        super.onPause();
        PendingIntent.getBroadcast(mContext, requestCode , intent,
                PendingIntent.FLAG_UPDATE_CURRENT).cancel();
        alarms.cancel(pi);
    }

但它不能以这种方式取消并继续执行,即使我在另一个活动

2 个答案:

答案 0 :(得分:0)

对于2个requestCode来电,您有PendingIntent.getBroadcast(Context context, int requestCode, Intent intent, int flags)个不同的{{1}}。 AlarmManager将这些视为不同的PendingIntents。尝试将requestCode int保存为静态,并将其用作onCreate和onPause中的PendingIntent.getBroadcast的requestCode

来自http://developer.android.com/reference/android/app/PendingIntent.html

  

如果您确实需要多个不同的PendingIntent对象同时处于活动状态(例如用作同时显示的两个通知),那么您需要确保关联它们的某些内容有所不同他们有不同的PendingIntents。这可能是Intent.filterEquals考虑的任何Intent属性,或者提供给getActivity(Context,int,Intent,int),getActivities(Context,int,Intent [],int),getBroadcast(Context,int)的不同请求代码整数。 ,Intent,int)或getService(Context,int,Intent,int)。

答案 1 :(得分:0)

编辑回答

建议您尝试以下操作来简化逻辑:将警报与活动分离,并将其设置在扩展的应用程序类上。

使用静态实例创建一个应用程序类,因此您可以调用:

MyApp.instance().startAlarm(MyBroadcastReceiver.class, 10 * 1000);

MyApp.instance().cancelAlarm(MyBroadcastReceiver.class);

警报方法实现的地方是:

    public void startAlarm(Class<?> clazz, int frequencyMs) {
    Context context = NixApplication.instance();
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, clazz);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
    am.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), frequencyMs, pi);
}

public void cancelAlarm(Class<?> clazz) {
    Context context = NixApplication.instance();
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, clazz);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
    am.cancel(pi);
}

只要两种方法中的响应代码相同,响应代码就可以更改为任何int

试试这个,让我知道它是否适合你。

在镜像活动生命周期方法中设置警报,即onCreate()+ onStop()或onResume()+ onPause()。

旧答案

 PendingIntent.getBroadcast(mContext, requestCode , intent,
            PendingIntent.FLAG_UPDATE_CURRENT).cancel();
    alarms.cancel(pi);

设置闹钟时,intent参数的配置是否与取消时相同?

此外,我认为您需要在此处删除对.cancel()的调用:

PendingIntent.FLAG_UPDATE_CURRENT).cancel();

仅在cancel AlarmManager变量上致电alarms