我想从用户定义的类中调用一个对象的方法,比如说2小时的特定时间间隔。输入参数是Context对象。
我使用过清单
中注册的AlarmReceiver广播接收器<receiver android:name=".AlarmReceiver" android:process=":remote"></receiver>
我正在尝试在特定活动发生时通过广播接收器启动警报管理器。为了接收警报广播,我创建了alarmReceiver。我是否需要任何类型的意图过滤器来接收警报意图???
我的问题是我想在alarmreceiver中使用应用程序上下文,我尝试使用AlarmReceiver的onReceive方法的上下文但它抛出
android.app.ReceiverRestrictedContext
错误。
此错误的解决方案是什么?如果需要,我将发布我的完整代码......
答案 0 :(得分:1)
您可以尝试以下链接: 1)AlarmManager and BroadcastReceiver instead of Service - is that bad ? (Timeout)
2)Android AlarmManager and BroadcastReceiver running in background Service
3)android: running a background task using AlarmManager
您也可以使用服务进行警报: 为此,您可以使用此链接:http://android-er.blogspot.com/2010/10/simple-example-of-alarm-service-using.html
答案 1 :(得分:1)
你需要这样的东西:
public RepeatAlarm(Context context, Bundle extras, int timeoutInSeconds){
AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, RepeatAlarm.class);
intent.putExtra(REMINDER_BUNDLE, extras);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Calendar time = Calendar.getInstance();
time.setTimeInMillis(System.currentTimeMillis());
time.add(Calendar.SECOND, timeoutInSeconds);
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(),timeoutInSeconds*1000, pendingIntent);
}
我将应用程序上下文传递给它。
在主类中,您可以声明一个静态上下文,然后在需要应用程序上下文时在项目的任何其他类中使用它。
答案 2 :(得分:1)
我使用此代码通过广播接收器激活定期警报:
public class UpdateReceiver extends BroadcastReceiver {
public static final String LOG_TAG = "camerawatch.alarmactivator";
public static final String ACTION = "de.pribluda.android.camerawatch.UPDATE_ALARM";
public static void activate(Context context) {
AlarmManager alarmService = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(ACTION);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE);
Log.d(LOG_TAG, "pending intent: " + pendingIntent);
// if no intent there, schedule it ASAP
if (pendingIntent == null) {
pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
// schedule new alarm in 15 minutes
alarmService.setInexactRepeating(AlarmManager.RTC, System.currentTimeMillis(),300000, pendingIntent);
Log.d(LOG_TAG, "scheduled intent: " + pendingIntent);
}
}
@Override
public void onReceive(Context context, Intent intent) {
Log.d(LOG_TAG, "received intent: " + intent);
CameraWidgetProvider.displayCurrentState(context);
}
}
注意,激活是在静态方法中完成的,所以我几乎可以在任何地方调用它。 如果且没有这样的未决意图,我会安排警报。至于上下文 - 它几乎可以在任何地方使用 - 在广播接收器中的活动(它是上下文本身)(serice方法参数)等。
PS:广播接收器比服务更受欢迎,因为它不会一直运行。当服务方法返回时,它会被停止并且应用程序可能被处理掉(unles它会做其他事情,但大多数情况下它会在后台停留)。这提供了更好的电池寿命