4

Android手機報警管理器在手機斷電時會丟失所有註冊的報警。偵聽BOOT_COMPLETED時,BroadcastReceivers會接收哪些上下文?

我用下面的廣播接收器在啓動時的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

上下文的類型並不重要,更重要的是你不應該自己處理。在框架或Google庫中有多種解決方案。第一個選項:Job sheduler api。第二選項:使用GcmNetworkMamager計劃的任務。等... –

回答

1

設置報警當廣播接收機的onReceive被觸發在系統引導時,什麼情況下給定參數,該方法?我必須知道 的背景,因爲我需要上下文來取消在該背景中設置的警報。

在這種情況下,您將在onReceive()中獲得全球應用程序Context。但是,這是無關緊要的。你不需要知道。

要稍後取消警報,您將創建一個PendingIntent,並且您可以使用任何想要執行此操作的Context。警報沒有鏈接到特定的Context,它們僅鏈接到特定的應用程序。

我假設調用MainActivity.dbHelper.loadAlarms()不是 安全的,因爲MainActivity沒有在系統啓動初始化。或者是 它是安全的,因爲dbhelper和loadAlarms()都已初始化,並且 聲明爲static

如果dbHelper確實static,並在創建實例初始化(onCreate()),則此調用的罰款。一般來說,在活動上調用靜態方法是不被接受的,因爲假設Activity已經被正確設置,很容易做一些愚蠢的事情。將這樣的靜態方法移動到一個通用實用程序類,這不是一個Activity,而只包含static方法。這看起來不那麼可疑。

0

不要緊,你的廣播接收器接收哪些類型的Context(在任何情況下,其ApplicationContext),因爲: 1)你不應該用它與Activity相關的DBHelper。相反,使它成爲一個Singleton並在整個應用程序中使用它。 2)您的AlarmManager應使用Service來設置。因此,它的好主意,叫你onReceive()服務,並根據服務

+0

哦,這是有道理的。那麼DBHelper應該是靜態方法的靜態類嗎?或者,與將其作爲單身人士實施它有什麼不同?我不確定,因爲使DBHelper可初始化意味着我必須將它作爲變量保存在某處。因此,假設我的實現是線程安全的,那麼不同的活動將實例化該單例。 – SMP

+0

單身不同於靜態。一個簡單的谷歌搜索導致這個:https://gist.github.com/Akayh/5566992 –

+0

不要使用單身。 –

相關問題