日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Android 内容观察者 ContentObserver 类

發布時間:2023/11/27 生活经验 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 内容观察者 ContentObserver 类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ContentObserver——內容觀察者,目的是觀察特定Uri引起的數據庫的變化

這個是官方的文檔,將的也是比較少

一般使用分為四步,

1、創建內容觀察者 ContentObserver
2、注冊監聽?registerContentObserver
3、刷新數據庫改變??onChange
4、注銷監聽?unregisterContentObserver

下面寫2個demo 監聽手機的飛行模式,和手機的顯示12小時制還是24小時制??對上面的步驟進行說明,可以看下我錄制的一個gif圖

下面直接上代碼了 main 的代碼

public class MainActivity extends AppCompatActivity {// 飛行模式的觀察者private AirPlaneModeContentObserver airPlaneModeContentObserver;// 12or24小時的觀察者private TimeContentObserver timeContentObserver;private TextView airPlaneText;private TextView timeText;@SuppressLint("HandlerLeak")private Handler mHandler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case AirPlaneModeContentObserver.MSG_AIRPLANEMODE:int isAirPlaneModeOpen = (Integer) msg.obj;if (isAirPlaneModeOpen == 1) {airPlaneText.setText("已打開");} else {airPlaneText.setText("已關閉");}break;case TimeContentObserver.MSG_TIME_12_24:int is12Or24Hour = (Integer) msg.obj;if (is12Or24Hour == 12) {timeText.setText("12小時制度");} else {timeText.setText("24小時制度");}default:break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);airPlaneText = findViewById(R.id.mode);timeText = findViewById(R.id.time);// 創建觀察者airPlaneModeContentObserver = new AirPlaneModeContentObserver(MainActivity.this, mHandler);timeContentObserver = new TimeContentObserver(MainActivity.this, mHandler);findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startAirPlaneModeRegister();}});findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startTimeRegister();}});}private void startTimeRegister() {Uri timeUri = Settings.System.getUriFor(Settings.System.TIME_12_24);Log.e("--------main", "timeUri=" + timeUri);ContentResolver contentResolver = getContentResolver();// 注冊contentResolver.registerContentObserver(timeUri, false,timeContentObserver);}private void startAirPlaneModeRegister() {Uri airPlaneModeUri = Settings.System.getUriFor(Settings.System.AIRPLANE_MODE_ON);Log.e("--------main", "airPlaneModeUri=" + airPlaneModeUri);ContentResolver contentResolver = getContentResolver();contentResolver.registerContentObserver(airPlaneModeUri, false, airPlaneModeContentObserver);}@Overrideprotected void onDestroy() {super.onDestroy();getContentResolver().unregisterContentObserver(airPlaneModeContentObserver);getContentResolver().unregisterContentObserver(timeContentObserver);}
}

飛行模式的觀察者代碼

public class AirPlaneModeContentObserver extends ContentObserver {public static final int MSG_AIRPLANEMODE = 1;private Context mContext;private Handler mHandler;/*** Creates a content observer.** @param handler The handler to run {@link #onChange} on, or null if none.*/public AirPlaneModeContentObserver(Context context, Handler handler) {super(handler);mContext = context;mHandler = handler;}@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);try {int isAirPlaneModeOpen = Settings.System.getInt(mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON);// 飛行模式為返回值是1,不是飛行模式返回值是0Log.e("------onChange", " isAirPlaneModeOpen=" + isAirPlaneModeOpen);mHandler.obtainMessage(MSG_AIRPLANEMODE, isAirPlaneModeOpen).sendToTarget();} catch (Settings.SettingNotFoundException e) {e.printStackTrace();}}
}

12or24 小時制觀察者

public class TimeContentObserver extends ContentObserver {public static final int MSG_TIME_12_24 = 2;private Context mContext;private Handler mHandler;/*** Creates a content observer.** @param handler The handler to run {@link #onChange} on, or null if none.*/public TimeContentObserver(Context context, Handler handler) {super(handler);mContext = context;mHandler = handler;}@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);int is12Or24Hour = 0;try {is12Or24Hour = Settings.System.getInt(mContext.getContentResolver(),Settings.System.TIME_12_24);} catch (Settings.SettingNotFoundException e) {e.printStackTrace();}// 12小時制度會返回12 ,24小時制度會返回24 當然我們也可以使用Settings.System.getString()方法Log.e("------onChange", " is12Or24=" + is12Or24Hour);mHandler.obtainMessage(MSG_TIME_12_24, is12Or24Hour).sendToTarget();}
}

代碼也是很簡單,但是需要特別注意下,并不是我們寫前端的注冊了 ContentObserver 數據發生變化我們就能接受到的, 想表達的意思就是,假如現在你需要實現一個邏輯,監聽接口變化,是顯示界面的添加或者刪除,

你需要去確保數據源那邊發生變化的時候,調用了getContentResolver().notifyChange() 方法了,我們寫ContentObserver才會接口到數據變化,否則我們寫了ContentObserver onChange 里面也是沒有數據返回的.

?

// 通知已注冊的觀察者行已更新并嘗試同步更改網絡
public void notifyChange(@NonNull Uri uri, @Nullable ContentObserver observer) {notifyChange(uri, observer, true /* sync to network */);}

?

demo 地址,點擊跳轉到git

?

總結

以上是生活随笔為你收集整理的Android 内容观察者 ContentObserver 类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。