Диспетчер аварийных сигналов не работает ... android.app.ReceiverRestrictedContext - PullRequest
0 голосов
/ 13 декабря 2011

Я хочу вызвать метод объекта из определенного пользователем класса для определенного интервала времени, скажем, 2 часа. Входным параметром является объект Context.

Я использовал AlarmReceiver Broadcast Receiver, который я зарегистрировал в манифесте

<receiver android:name=".AlarmReceiver" android:process=":remote"></receiver>

Я пытаюсь запустить диспетчер сигналов тревоги через широковещательный приемник, когда происходит определенное действие. Для приема трансляций по тревоге я создал alarmReceiver. Нужен ли какой-либо фильтр намерений для получения намерений тревоги?

Моя проблема в том, что я хочу, чтобы контекст приложения находился внутри alarmreceiver, я пытался использовать контекст метода onReceive AlarmReceiver, но он выдает

    android.app.ReceiverRestrictedContext

ошибка.

Есть ли решение для этой ошибки? При необходимости я опубликую свой полный код ...

Ответы [ 3 ]

1 голос
/ 13 декабря 2011

Вам нужно что-то вроде этого:

 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);
 }

Я передаю ему контекст приложения.

Кстати, в вашем основном классе вы можете объявить статический контекст, а затем использовать его в любом другом классе вашего проекта, когда вы захотите контекст приложения.

1 голос
/ 13 декабря 2011

Я использую этот код для активации периодических сигналов тревоги через широковещательный приемник:

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: широковещательный приемник предпочтительнее, чем сервис, потому что он не работает все время. Когда сервисный метод возвращается, он останавливается и приложение потенциально удаляется (разве что оно делает что-то еще, но в основном оно остается в фоновом режиме). Это обеспечивает лучшее время автономной работы

1 голос
/ 13 декабря 2011
...