0

ContentObserver がトリガーされた理由を知る方法はありますか? たとえば、「content://sms」URI を介して SMS を監視していて、SMS が送受信されている場合、ContentObserver クラス内で SMS タイプを推測する方法はありますか (N を設定できることはわかっています)。別の URI を指定する ContentObservers ですが、ContentObserver クラスから伝える方法があることを願っています)?

ボーナス: 楽しい機微もあります:

2 番目の方法は、API レベル 16 以降でのみ使用できるため、コードが正しく機能するために URI に依存するべきではありません。

コンテンツオブザーバー:

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

ContentObserver クラス:

class SMSObserver extends ContentObserver {     
   public MyObserver(Handler handler) {
      super(handler);           
   }

   @Override
   public void onChange(boolean selfChange) {
      this.onChange(selfChange, null);
      // What SMS type caused this to trigger????????

   }        

   @Override
   public void onChange(boolean selfChange, Uri uri) {
      // What SMS type caused this to trigger????????
   }        
}
4

1 に答える 1

0

以下のケースでは、Onchange を受け取ることができます。

  1. そのデータベースでいずれかの syncadapter がアクティブになっている場合、同期が終了するたびに onchange がトリガーされます。この場合、実際には何も変更されていなくても、onchange を受け取る可能性があります。
  2. データセットに実際の変更がある場合。

変更されたデータを把握するために、可能な URI ごとにオブザーバーを設定することはまったく良い考えではありません。これを使用すると、更新または削除のシナリオを検出できますが、新しい挿入を検出することは問題になります。次のことをお勧めします

単一のオブザーバーを保持します。初期化時に、最初に利用可能なデータ全体を処理できます。次に進むと、column_id、update_timestamp、および合計行数を記憶し続けます。次に onchange が Coulmn_Id、update_timestamp および count で来るとき、その変更の種類を把握できます。発生した

--> column_id が記憶している値よりも大きい行を探します。行が返された場合は、新しい行が挿入されていることは確かです。具体的にクエリを実行できます --> 上記の基準が失敗した場合は、update_timespamp を探す必要があります。最後に、更新された行について教えてください --> 上記の両方の条件が満たされている場合は、削除操作について教えてくれるカウントの違いを探してください。

上記のいずれも発生しない場合は、明らかに何もなかったため、onchange シグナルを無視してください。それが役に立てば幸い。

于 2013-10-01T09:26:30.573 に答える