当手机断电时,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()都被初始化并声明为静态?
答案 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()
中调用服务并从该服务设置警报