編輯:關於Android編程
很久都沒有更新博客了,最近在忙著公司的培訓,一方面是有點忙,一方面是自己懶,所以一直沒更新。好了,言歸正傳,今天簡單的介紹一下Android中的ContentObserver。
ContentObserver翻譯成中文就是內容觀察者,目的是觀察(捕捉)特定Uri引起的數據庫的變化,繼而做一些相應的處理。ContentObserver一般和系統或第三方程序提供的Provider一起使用,這些Provider一般情況下會有一個Uri,然後ContentObserver就去監聽這些Uri數據的變化,然後做出相應的處理。
使用ContentObserver的步驟我這裡總結如下:
1 首先創建一個ContentObserver的子類,然後實現裡面的onChange方法,監聽的Uri中的數據發生變化的時候,會調用onchange方法。
2 注冊ContentObserver。
下面簡單的列出例子代碼:
ContentObserver的子類
package com.qin.contentobserver; import android.content.Context; import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; import android.provider.*; import android.provider.Settings.SettingNotFoundException; import android.util.Log; //用來觀察system表裡飛行模式所在行是否發生變化 , “行”內容觀察者 public class AirplaneContentObserver extends ContentObserver { private static String TAG = "AirplaneContentObserver" ; private static int MSG_AIRPLANE = 1 ; private Context mContext; private Handler mHandler ; //此Handler用來更新UI線程 public AirplaneContentObserver(Context context, Handler handler) { super(handler); mContext = context; mHandler = handler ; } /** * 當所監聽的Uri發生改變時,就會回調此方法 * * @param selfChange 此值意義不大 一般情況下該回調值false */ @Override public void onChange(boolean selfChange) { Log.i(TAG, "-------------the airplane mode has changed-------------"); // 系統是否處於飛行模式下 try { int isAirplaneOpen = Settings.System.getInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON); Log.i(TAG, " isAirplaneOpen -----> " +isAirplaneOpen) ; mHandler.obtainMessage(MSG_AIRPLANE,isAirplaneOpen).sendToTarget() ; } catch (SettingNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
這裡面我們可以看出我們定義了一個帶參數的構造方法,其中第二個參數是Handler,這是因為我們自定義的AirplaneContentObserver,在程序運行的時候,是非主線程,在Android中非主線程是無法修改UI的。所以這裡我們如果想要去修改UI需要先發送一個消息給Handler,然後主線程中的Handler在接收到發送過來的消息之後,會調用handleMessage方法,然後再去做一些處理或者更新UI,所以這裡的Handler參數,需要在主線程中創建,然後再調用的時候傳遞到該類的對象裡面。
下面給出MainActivity.java類:
package com.qin.contentobserver; import android.app.Activity; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.*; import android.util.Log; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { private TextView tvAirplane; private EditText etSmsoutbox; // Message 類型值 private static final int MSG_AIRPLANE = 1; private static final int MSG_OUTBOXCONTENT = 2; private AirplaneContentObserver airplaneCO; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tvAirplane = (TextView) findViewById(R.id.tvAirplane); etSmsoutbox = (EditText) findViewById(R.id.smsoutboxContent); // 創建兩個對象 airplaneCO = new AirplaneContentObserver(this, mHandler); //注冊內容觀察者 registerContentObservers() ; } private void registerContentObservers() { // 通過調用getUriFor 方法獲得 system表裡的"飛行模式"所在行的Uri Uri airplaneUri = Settings.System.getUriFor(Settings.Global.AIRPLANE_MODE_ON); // 注冊內容觀察者 // 第二個參數false 為精確匹配 getContentResolver().registerContentObserver(airplaneUri, false, airplaneCO); } private Handler mHandler = new Handler() { public void handleMessage(Message msg) { System.out.println("---mHanlder----"); switch (msg.what) { case MSG_AIRPLANE: int isAirplaneOpen = (Integer) msg.obj; if (isAirplaneOpen != 0) tvAirplane.setText("飛行模式已打開"); else if (isAirplaneOpen == 0) tvAirplane.setText("飛行模式已關閉"); break; default: break; } } }; }在上面的代碼中我們注冊了一個監聽手機飛行模式變化的一個內容觀察者,當我們修改我們飛行模式的值得時候,在頁面上顯示的結果也會發生相應的改變。
例子工程的下載地址:http://download.csdn.net/detail/mengxiangyue/7169579
接上一篇。 主要研究下bitmap和drawable的使用,以及兩者的區別。 先看測試代碼: = Build.VERSION_CODES.HONEYCOMB_MR1
google可能為了安全考慮,在5.1.+後調用activitymanager.getRunningAppProcesses()方法只能返回你自己應用的進程,那如何在5.
話不多說開弄:打開eclipse,左上角File=》New=》Android Application Projicet,如圖: Next,Next,Next,N
概述:常用的布局類型並不能滿足所有需求,這時就會用到ViewGroup。ViewGroup作為一個放置View的容器,並且我們在寫布局xml的時候,會告訴容器(凡是以la