Androidのcontent providerの2:データベース属性の追加とContentObserverによるデータベースのリスニング
2999 ワード
作業中にスレッドを開いて大量のクエリーを行い、あるデータベース値の送信変化を検出する必要がある場合があります.これによるオーバーヘッドが大きく、ContentObserverを利用してこの問題を完璧に解決しました.ここでまとめます.
(1)ContentObserver--コンテンツオブザーバは、特定のUriによるデータベースの変化を観察(捕捉)することを目的とし、データベース内のトリガに類似した対応する処理を行い、観察されたUriが変化するとトリガーされる.主な方法は次のとおりです.
A,public final void registerContentObserver(Uriuri,boolean notifyForDescents,ContentObserver observer)機能:指定されたUriにContentObserver派生クラスインスタンスを登録し、指定されたUriが変更された場合、そのインスタンスの対象処理をコールバックする.パラメータ:uri、観察する必要があるUri;notifyForDescentsはfalseで正確なマッチングを表し、すなわちUriのみをマッチングし、trueでは派生したUriを同時にマッチングすることができ、一般的にtrueである.observer,ContentObserverの派生クラスインスタンス.
B,public final void unregisterContentObserver(ContentObserver observer),機能:所与のUriの観察を取り消す
C,public void ContentObserver(Handler handler)、機能:すべてのContentObserverの派生クラスがこの構築方法を呼び出す必要がある.パラメータ:handler、Handlerオブジェクト.メインスレッドHandler(UIを更新できます)でも、任意のHandlerオブジェクトでも構いません.
D,void onChange(boolean selfChange)、機能:観察されたUriが変化した場合、この方法をコールバックして処理する.すべてのContentObserverの派生クラスは、このメソッドを再ロードして論理を処理する必要があります.
(2)ContentObserverを使用する前提はシステムデータベースに既にこの変数があることであり、この変数を確立する方法はframeworks/base/core/java/android/provider/Settingsを修正することである.JAva、例えば属性「SILVAN_LIU」を追加する場合
これを追加するとSystem.getInt(getContentResolver(), Settings.System.SILVAN_LIU,0)とSettings.System.putInt(getContentResolver(), Settings.System.SILVAN_LIU,0)SILVAN_を入手し設定するLIUの属性値.(3)設定中のスイッチが切り替わったときに、対応するサービスがオンまたはオフになる(アイコン表示または非表示)ことを監視するための例.
インポートするクラス:
グローバル変数:
サービスのonCreateで完了:
ContentObserverインスタンスの構築をサービスクラスで完了し、onChangeリロード処理を完了します.
サービスのonDestroy関数では、このContentObserverを逆登録する必要があります.
(3)まとめ:ContentObserverを使用する場合、主に両者の状況がある:A、頻繁に検出する必要があるデータベースやデータが変化しているかどうか、スレッドを使用して操作すると、経済的ではなく、時間がかかる.B、ユーザーが知らないうちにデータベースに対していくつかの事件をします.例えば、こっそり情報を送信したり、メールのブラックリストを拒否したりします.
参考原文:http://blog.csdn.net/xxxsz/article/details/7480354参考原文:http://www.cnblogs.com/slider/archive/2012/02/14/2351702.html
(1)ContentObserver--コンテンツオブザーバは、特定のUriによるデータベースの変化を観察(捕捉)することを目的とし、データベース内のトリガに類似した対応する処理を行い、観察されたUriが変化するとトリガーされる.主な方法は次のとおりです.
A,public final void registerContentObserver(Uriuri,boolean notifyForDescents,ContentObserver observer)機能:指定されたUriにContentObserver派生クラスインスタンスを登録し、指定されたUriが変更された場合、そのインスタンスの対象処理をコールバックする.パラメータ:uri、観察する必要があるUri;notifyForDescentsはfalseで正確なマッチングを表し、すなわちUriのみをマッチングし、trueでは派生したUriを同時にマッチングすることができ、一般的にtrueである.observer,ContentObserverの派生クラスインスタンス.
B,public final void unregisterContentObserver(ContentObserver observer),機能:所与のUriの観察を取り消す
C,public void ContentObserver(Handler handler)、機能:すべてのContentObserverの派生クラスがこの構築方法を呼び出す必要がある.パラメータ:handler、Handlerオブジェクト.メインスレッドHandler(UIを更新できます)でも、任意のHandlerオブジェクトでも構いません.
D,void onChange(boolean selfChange)、機能:観察されたUriが変化した場合、この方法をコールバックして処理する.すべてのContentObserverの派生クラスは、このメソッドを再ロードして論理を処理する必要があります.
(2)ContentObserverを使用する前提はシステムデータベースに既にこの変数があることであり、この変数を確立する方法はframeworks/base/core/java/android/provider/Settingsを修正することである.JAva、例えば属性「SILVAN_LIU」を追加する場合
public static final String SILVAN_LIU = "silvan_liu";
public static final String[] SETTINGS_TO_BACKUP ={
~
+SILVAN_LIU
~
}
これを追加するとSystem.getInt(getContentResolver(), Settings.System.SILVAN_LIU,0)とSettings.System.putInt(getContentResolver(), Settings.System.SILVAN_LIU,0)SILVAN_を入手し設定するLIUの属性値.(3)設定中のスイッチが切り替わったときに、対応するサービスがオンまたはオフになる(アイコン表示または非表示)ことを監視するための例.
インポートするクラス:
import android.content.ContentResolver;
import android.database.ContentObserver;
グローバル変数:
ContentResolver cr = null;
サービスのonCreateで完了:
cr = mContext.getContentResolver();
cr.registerContentObserver(
Uri.parse("content://settings/system/xxxx"), // URI
true,
m_xxxxyObserver); //ContentObserver ,
ContentObserverインスタンスの構築をサービスクラスで完了し、onChangeリロード処理を完了します.
private ContentObserver m_xxxxObserver = new ContentObserver(new Handler()){
public void onChange(boolean selfChange){
updateSettingsValues();
}
};
private void updateSettingsValues() {
mIsxxxxOn= Settings.System.getInt(cr,"isxxxxEnabled",0) == 1 ? true : false;
if(mIsxxxxyOn == true){
// ,
}
else{
// ,
}
}
サービスのonDestroy関数では、このContentObserverを逆登録する必要があります.
cr.unregisterContentObserver(m_xxxxObserver);
(3)まとめ:ContentObserverを使用する場合、主に両者の状況がある:A、頻繁に検出する必要があるデータベースやデータが変化しているかどうか、スレッドを使用して操作すると、経済的ではなく、時間がかかる.B、ユーザーが知らないうちにデータベースに対していくつかの事件をします.例えば、こっそり情報を送信したり、メールのブラックリストを拒否したりします.
参考原文:http://blog.csdn.net/xxxsz/article/details/7480354参考原文:http://www.cnblogs.com/slider/archive/2012/02/14/2351702.html