我需要使用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);
}
但它不能以这种方式取消并继续执行,即使我在另一个活动
答案 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
。