广播接收器在侦听BOOT_COMPLETED时接收哪些上下文?



当手机断电时,Android 中的 AlarmManagers 会丢失所有注册的警报。

我使用以下广播接收器在安卓启动时触发:

public class AlarmBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
Cursor alarmCursor = MainActivity.dbHelper.loadAlarms();
// Iterate through every stored alarm and set those alarms.
// ....
alarmCursor.close();
}
}
}
  • 当广播接收器的 onReceive 在系统启动时触发时,该方法的上下文参数是什么?我必须知道上下文,因为我需要上下文来取消在该上下文中设置的警报。

  • 我假设对MainActivity.dbHelper.loadAlarms()的调用是不安全的,因为MainActivity在系统启动中没有初始化。或者它是否安全,因为 dbhelper 和 loadAlarms() 都被初始化并声明为静态?

当广播接收器的onReceive在系统启动时触发时,为该方法提供了什么上下文参数?我必须知道 上下文,因为我需要上下文来取消其中设置的警报 上下文。

在这种情况下,您将获得onReceive()中的全局应用程序Context。但是,这无关紧要。你不需要知道。

要稍后取消警报,您将创建一个PendingIntent,您可以使用任何您想要执行此操作Context。警报不链接到特定的Context,它们只链接到特定的应用程序。

我假设对 MainActivity.dbHelper.loadAlarms() 的调用不是 安全,因为主活动未在系统启动中初始化。或者是 它是安全的,因为 dbhelper 和 loadAlarms() 都已初始化并且 宣布static

如果dbHelper确实在创建实例时static并初始化(而不是在onCreate()),那么这个调用就可以了。通常,在活动上调用静态方法是不受欢迎的,因为假设Activity已正确设置,很容易做一些愚蠢的事情。最好将此类静态方法移动到通用实用程序类中,该类不是Activity,仅包含static方法。这看起来不那么可疑。

您的 BroadcastReceiver 接收哪种类型的Context并不重要(无论如何,它的ApplicationContext),因为: 1)您不应该使用与Activity相关联的DBHelper。相反,请将其设置为单一实例并在整个应用中使用它。 2) 您的AlarmManager应使用Service进行设置。因此,最好在onReceive()中调用该服务并从该服务设置警报

相关内容

  • 没有找到相关文章

最新更新