【问题标题】:AlarmManager not starting Activity (when it exists)AlarmManager 未启动 Activity(当它存在时)
【发布时间】:2014-02-13 07:39:05
【问题描述】:

这是我所拥有的:

Intent intent = new Intent();
intent.setClass(context,SomeActivity.class);
PendingIntent pending  = PendingIntent.getActivity(context,requestCode,intent,PendingIntent.FLAG_UPDATE_CURRENT);

AlarmManager alarm = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, someDistantMillis, someIntervalInMillis,pending);

运行正常,即Activity在someDistantMillis启动,在someIntervalInMillis之后重复启动

唯一的问题是,如果SomeActivitysomeIntervalInMillis 之后已经在运行,另一个SomeActivity 实例在堆栈顶部启动。

以下是我想要实现的简要目标:

  1. 开始,AlarmManager 被调用
  2. 如果 SomeActivity 的实例已经在运行,则转到 4) 否则转到 3)
  3. 启动SomeActivity,结束
  4. 什么都不做,结束

任何想法应该如何完成,或者Intent 应该包含哪些标志(FLAG_ACTIVITY_SINGLE_TOP 似乎不起作用)?

【问题讨论】:

  • 尝试将android:launchMode="singleInstance" 添加到清单中的活动标记中。
  • SomeActivity 是您应用的根 Activity(ACTION=MAIN 和 CATEGORY=LAUNCHER 的那个)吗?
  • @PankajKumar 请不要在没有先获得大量其他数据的情况下建议launchMode="singleInstance"。使用这种启动模式可能会解决这个特定问题,但可能会给用户带来很多其他问题。一般来说,singleInstance 启动模式应该只在非常特殊的情况下使用(例如:HOME-screen 更换)。恕我直言,这是个坏建议。
  • @DavidWasser 感谢您的宝贵意见。会照顾。我不知道消极的一面。再次感谢你:)

标签: android android-intent alarmmanager android-pendingintent


【解决方案1】:

在您的Activity 中创建一个静态boolean 成员字段:

public static boolean running = false;

onStart() 方法中将running 设置为true,在onStop() 中设置false。然后在您想确定您的Activity 是否正在运行的地方,只需执行此if 语句:

if(SomeActivity.running) {
   // go to step 4
} else {
   // go to step 3
}

static 关键字在这里至关重要,因为这意味着running 字段对于SomeActivity 类的所有实例都是通用的,因此您不需要访问特定的SomeActivity 对象。

【讨论】:

  • 好主意,猜猜如果没有更好的 com 沿着这条路走下去。是否有更多“Android方法”来处理这个问题?我不喜欢依赖某个静态变量的想法。
  • 请注意,当您在应用之间切换然后尝试重新启动特定应用时,系统会知道是从后台恢复一个Activity还是启动一个新的Activity,因此必须有一些较低级别的从 SDK 处理此问题的逻辑
猜你喜欢
  • 1970-01-01
  • 2021-11-29
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
相关资源
最近更新 更多