2017-04-26 1 views
0

は、私が送信されたSMSに耳を傾ける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(); 
} 

今の質問はどこでの上位3行を置くべきであるということですコード?現在、私はActivityのOnCreateメソッドでそれを書いています。しかし、これを行うことによって、私はアプリが起動されるたびに呼び出すことになります。私はそれが悪い習慣であるかどうかわからない。

私の必要条件は、アクティビティのライフサイクル外で送信されたSMSを聞くことです。これは期待通りに機能していますが、私は常にOnCreateメソッドで登録する必要がありますか?また、BroadcastReceiverのonReceive()に同じ行を入れて、デバイスをリブートした後にリッスンしていることを確認します。

更新:BroadcastReceiverはContentObserverを登録していません。私もgetApplicationContext()をBroadcastReceiverのコンテキストとして使用しようとしましたが、役に立たなかった。

+0

Android 7.0以降では、 'JobScheduler'を使用してコンテンツの変更を監視できます。これは' ContentObserver'に似ています。これは非常に便利です。古いデバイスではあまり実用的ではありません。 – CommonsWare

+0

それは素晴らしいだろうが、今は古いデバイスをターゲットにする必要があります。 – Usman

+0

更新:BroadcastReceiverは何とかContentObserverを登録していません。私はまた、BroadcastReceiverのコンテキストとしてgetApplicationContext()を使用しようとしましたが、無用にしました – Usman

答えて

1

無期限にバックグラウンドで実行するサービスを作成することができます(スティッキー開始)。このサービスでは、コンテンツオブザーバー(最初の3行)を追加することができます。これにより、ユーザーがアプリケーションを終了した後でもサービスが動作していることを確認できます。

このサービスは、アプリケーションクラスのOnCreateおよびブロードキャストレシーバーで開始して、電話機を再起動した後に実行することができます。

+0

私はこれを試してみましょう – Usman

+0

この回答は正しく動作するはずですが、私は送信されたSMSを読むための別のアプローチに頼っています。つまり、最後に記録された日付よりも大きい日付を持つ送信されたメッセージ(存在する場合)を照会することによって。データベースを毎秒最新の状態に保つのではなく、必要に応じていつでも更新しています。最終結果は実質的に同じですが、ユーザーが質問をする前にそのテキストを削除した可能性があります。 – Usman

関連する問題