2011-12-13 71 views
0

我想調用一個對象的方法從用戶定義的類在特定的時間間隔2個小時。輸入參數是一個Context對象。報警管理器不工作... android.app.ReceiverRestrictedContext

我用AlarmReceiver廣播接收器,我在清單

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

註冊我想通過廣播接收器,當特定活動時啓動報警經理。爲了接收報警廣播,我創建了alarmReceiver。我是否需要任何種類的意圖過濾器來接收警報意圖?

我的問題是我想裏面alarmreceiver應用程序上下文,我嘗試使用AlarmReceiver的方法的onReceive的範圍內,但它拋出

android.app.ReceiverRestrictedContext 

錯誤。

此錯誤的任何解決方案?如果需要的話我會公佈我的全部代碼...

回答

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它會做其他事情,但大多數情況下它會保持在後臺)。這提供了更好的電池壽命

+0

它的工作原理......謝謝....另外是我添加名稱的意圖,我正在過濾意圖的名稱...所以不需要指定在意圖的警報接收器。感謝:D – drulabs

+0

命名意圖通常是一個好主意 –

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

我將應用程序上下文傳遞給它。

順便說一句,在您的主類中,您可以聲明一個靜態上下文,然後在需要應用程序上下文的任何其他類中使用它。