2017-04-26 91 views
0

這裏是我正在註冊ContentObserver聽發來的短信:在哪裏註冊一個必須無限期運行的ContentObserver?

SendSmsObserver smsObeserver = (new SendSmsObserver(new Handler(), context)); 
ContentResolver contentResolver = context.getContentResolver(); 
contentResolver.registerContentObserver(Uri.parse("content://sms"), true, smsObeserver); 

這是SendSmsObserver類:

class SendSmsObserver extends ContentObserver { 

private Context context; 

SendSmsObserver(Handler handler, Context context) { 
    super(handler); 
    this.context = context; 
} 

@Override 
public void onChange(boolean selfChange) { 
    super.onChange(selfChange); 
    queryLastSentSMS(); 
} 

現在的問題是,我應該把頂部三行碼?目前我正在將它寫入Activity的OnCreate方法。但通過這樣做,我每次啓動應用程序時都會調用它。我不知道這是不是好的做法。

我的要求是我應該聽我的活動生命週期外發送的短信。這是按預期工作,但我應該總是在OnCreate方法中註冊它?另外,我想在BroadcastReceiver的onReceive()中放置相同的行,以確保在重新啓動設備後偵聽。

更新:BroadcastReceiver以某種方式不註冊ContentObserver。我也嘗試在BroadcastReceiver中使用getApplicationContext()作爲上下文,但無濟於事。

+0

在Android 7.0+上,您可以使用'JobScheduler'來監視內容更改,類似於ContentObserver。這是非常有用的,因爲你想在舊設備上不太實際。 – CommonsWare

+0

這將是偉大的,但現在我必須針對舊設備。 – Usman

+0

更新:BroadcastReceiver以某種方式未註冊ContentObserver。我也嘗試在BroadcastReceiver中使用getApplicationContext()作爲上下文,但無濟於事 – Usman

回答

1

您可以創建一個在後臺無限期運行的服務(開始粘滯)。在這個服務中你可以添加你的內容觀察者(前三行)。通過這種方式,您可以確保該服務在用戶關閉應用程序後仍能正常工作。

您可以在應用程序類的OnCreate中啓動此服務,也可以在廣播接收器中啓動此服務,以確保它在重新啓動電話後運行。

+0

我會試試這個,並讓你知道 – Usman

+0

這個答案應該可以正常工作,但我已經採取了不同的方法來讀取發送的短信;即:通過查詢發送的消息(如果有)的日期大於最後記錄的日期。我不是每秒鐘更新數據庫,而是現在每當需要時就更新它。所以最終結果幾乎是一樣的,除非用戶在查詢之前刪除了文本。 – Usman