当手机断电时,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()
中调用该服务并从该服务设置警报