【问题标题】:static AlarmManager in AndroidAndroid中的静态AlarmManager
【发布时间】:2013-08-13 08:23:34
【问题描述】:

我正在 Android 中开发一个简单的任务应用程序,我需要通过 AlarmManager 创建通知。我的问题是我有一些应该删除的警报 - 因此它们的通知 - 但它们不是,所以我决定 - 在 Delete alarm from AlarmManager using cancel() - Android 等帖子之后将 AlarmManager 设为静态变量,以便可以从整个应用程序。 我这样做的方式是在我的主类中使用以下方法:

public static AlarmManager getAlarmManagerInstance() {
        if (sAlarmManager == null && sContext != null)
            sAlarmManager = (AlarmManager) sContext
                    .getSystemService(Context.ALARM_SERVICE);
        return sAlarmManager;
    }

并且在sContext 变量中将以这种方式实例化:

@Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.activity_main);
        sContext = this;
        initActionBar();
    }

从这个变量创建一个单例模式是个好主意吗?有没有更好的办法?

非常感谢。

【问题讨论】:

  • 使用相同的 id 来创建待处理的意图......这将做同样的工作
  • 但我正在使用我想要创建/修改的任务的 ID 来创建待处理的意图,例如 PendingIntent pendingFirstAlarmIntent = PendingIntent.getBroadcast( this, mGoal.getId().intValue(), intent, PendingIntent.FLAG_ONE_SHOT);.. 还是一样吗?跨度>
  • 是的,这是一样的...如果这不是取消警报,请尝试使用不同的标志...
  • 显示您尝试使用的代码。
  • @Squonk 问题已更新,非常感谢

标签: android singleton alarmmanager


【解决方案1】:

Android 文档说:

你不直接实例化这个类;相反,通过 Context.getSystemService(Context.ALARM_SERVICE) 检索它。

AlarmManager 只是一个提供对系统警报服务的访问的类。

这些服务是在系统中运行的,所以不要关心它们,只需使用 AlarmManager 作为与它们交互的接口即可。

因此,每次您需要访问此服务时,只需按照文档所述检索它即可:

Context.getSystemService(Context.ALARM_SERVICE)

【讨论】:

    【解决方案2】:

    我建议不要创建静态警报。

    您应该遵循 cmets 中给出的建议,使用为您的 PendingIntents 提供的 ID,这样您就可以在应用程序中的任何位置取消/更新警报。

    我建议不要使用静态警报的原因:

    可能会发生以下情况,您安排警报并对其进行静态引用,然后用户重新启动电话。您的警报消失了,对它的静态引用也消失了。

    如果您需要警报在这种情况下工作,您应该在共享首选项/数据库/文件中写入它们的 ID 和所需信息,并在启动或其他适合您应用的事件上重新安排它们。

    【讨论】:

    • 但我已经拥有BroadcastReceiverACTION_BOOT_COMPLETED 权限,因此它可以在重新启动手机时从数据库重新创建警报。我只是不明白在PendingIntent 中使用ID 是什么意思,因为我认为我们传递给PendingIntent 的参数应该是任务的ID,而不是警报。
    • 如果你没有输入 ID,那么当你创建一个 PendingIntent 并使用一个 Intent 启动相同的活动/服务(不同的额外值不计算在内)Android 将无法在它们之间产生差异,因为你当您安排它们时将它们打包到警报中,最终结果将是每次您创建新警报时,旧警报都会在您不知情的情况下自动取消。既然你说你的 AlarmManagers 与你的通知相关联,那么你应该使用不同的 ID,如果你给他们唯一的 ID,可能使用与通知相同的 ID
    • stackoverflow.com/questions/7496603/… ...还可以考虑为您的意图设置一个操作,如果您不喜欢为 PendingIntent 设置 ID,您可以通过这种方式过滤它们。
    • 我不确定我是否在关注你,但是,我将任务 ID 用作通知的 ID,以及创建这些警报的待处理意图......所以现在,我还应该创建不同的 AlarmManagers 吗?我将创建的每个警报一个,具有与任务相同的 ID 还是什么?现在迷路了
    • 我现在也迷路了 :) 。就像上面的答案所说,您实际上并没有创建警报,而是将它们安排为服务。如果您需要按不同的时间表完成工作和/或执行不同的操作,您应该安排多个警报。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 2014-01-19
    • 1970-01-01
    相关资源
    最近更新 更多