警报管理器不工作... android.app.ReceiverRestrictedContext

时间:2011-12-13 13:29:06

标签: android alarmmanager

我想从用户定义的类中调用一个对象的方法,比如说2小时的特定时间间隔。输入参数是Context对象。

我使用过清单

中注册的AlarmReceiver广播接收器
<receiver android:name=".AlarmReceiver" android:process=":remote"></receiver>

我正在尝试在特定活动发生时通过广播接收器启动警报管理器。为了接收警报广播,我创建了alarmReceiver。我是否需要任何类型的意图过滤器来接收警报意图???

我的问题是我想在alarmreceiver中使用应用程序上下文,我尝试使用AlarmReceiver的onReceive方法的上下文但它抛出

    android.app.ReceiverRestrictedContext

错误。

此错误的解决方案是什么?如果需要,我将发布我的完整代码......

3 个答案:

答案 0 :(得分:1)

答案 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它会做其他事情,但大多数情况下它会在后台停留)。这提供了更好的电池寿命