在收听BOOT_COMPLETED时,BroadcastReceivers会接收哪个上下文?

时间:2016-12-25 02:16:44

标签: android android-intent android-pendingintent android-alarms android-broadcastreceiver

当手机断电时,Android中的AlarmManagers会丢失所有已注册的闹钟。

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

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()都被初始化并声明为静态?

2 个答案:

答案 0 :(得分:1)

  

当在系统启动时触发广播接收器的<foobar> {foobar} 时,该方法会给出什么上下文参数?我必须知道   上下文,因为我需要上下文来取消在其中设置的警报   上下文。

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

要稍后取消闹钟,您将创建Context,并且可以使用您想要执行此操作的任何onReceive()。警报未链接到特定的PendingIntent,它们仅链接到特定的应用程序。

  

我假设调用MainActivity.dbHelper.loadAlarms()不是   安全,因为MainActivity未在系统启动时初始化。或者是   它是安全的,因为dbhelper和loadAlarms()都是初始化的   声明Context

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

答案 1 :(得分:0)

您的BroadcastReceiver接收的Context类型无关紧要(无论如何,它的ApplicationContext)因为: 1)您不应该使用与Activity关联的DBHelper。相反,将它设为Singleton并在整个应用程序中使用它。 2)应使用AlarmManager设置Service。因此,最好在onReceive()中调用服务并从该服务设置警报