編輯:關於Android編程
為了監聽指定的ContentProvider的數據的改變,需要通過ContentResolver向指定Uri注冊CotentObserver監聽器。ContentResolver提供了如下方法來注冊監聽器:
publicfinal void registerContentObserver(Uriuri, boolean notifyFZ喎?/kf/ware/vc/" target="_blank" class="keylink">vckRlc2NlbmRlbnRzLCBDb250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIpCjwvcD4KPHA+ICCyzsr9o7p1cmkgOrjDvODM/cb3y/m84Mz9tcRDb250ZW50UHJvdmlkZXK1xFVyaaGjPC9wPgo8cD4gICAgICAgICBub3RpZnlGb3JEZXNjZW5kZW50cyCjus6qZmFsc2Ugse3Kvr6ryLfGpcXko6y8tNa7xqXF5LjDVXJpLM6qdHJ1ZSCx7cq+v8nS1M2syrHGpcXkxuTFycn6tcRVcmmhozwvcD4KPHA+ICAgICAgICAgIG9ic2VydmVyo7pDb250ZW50T2JzZXJ2ZXLFycn6tcS84Mz9xvfKtcD9oaM8L3A+CjxwPjxzdHJvbmc+IMihz/vXorLhvODM/cb3o7o8L3N0cm9uZz48L3A+CjxwPiAgICBwdWJsaWMgZmluYWx2b2lkICB1bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKENvbnRlbnRPYnNlcnZlciBvYnNlcnZlcik8L3A+CjxwPiAgICAguabE3KO6yKHP+7bUuPi2qFVyabXEuduy7DwvcD4KPHA+ss7K/aO6IG9ic2VydmVyIENvbnRlbnRPYnNlcnZlcrXExcnJ+sDgyrXA/aGjIDwvcD4KPHA+ICAgICAgICBDb250ZW50T2JzZXJ2ZXKhqqGqxNrI3bnbsuzV36OsxL+1xMrHuduy7Ciytte9KczYtqhVcmnS/cbwtcTK/b7dv+K1xLHku6+jrLzMtvjX9tK70KnP4NOmtcS0psDto6zL/MDgJiMyMDI4NDvT2sr9vt2/4ry8yvXW0LXEtKW3osb3KFRyaWdnZXIpo6y1sUNvbnRlbnRPYnNlcnZlcsv5uduy7LXEVXJpt6LJ+rHku6/KsaOsseO74bSlt6LL/KGjtKW3osb3t9bOqrHttKW3osb3oaLQ0LSlt6LG96Osz+DTprXYQ29udGVudE9ic2VydmVy0rK31s6qobCx7aGwQ29udGVudE9ic2VydmVyoaKhsNDQobFDb250ZW50T2JzZXJ2ZXKjrLWxyLvV4srH0+vL/Mv5vODM/bXEVXJpIE1JTUUgVHlwZdPQPC9wPgo8cD4gudi1xKGjICAgICAgICAgPC9wPgo8aDE+PHN0cm9uZz5Db250ZW50T2JzZXJ2ZXLA4L3pydyjujwvc3Ryb25nPjwvaDE+CjxwPr3TytW72LX3tcS4/LjExNrI3aGjsdjQ69PJsbvM7bzTtb3Su7j2Q29udGVudE9ic2VydmFibGW21M/zyrXP1qGjPC9wPgo8aDI+PHN0cm9uZz4gubnU7Le9t6ijujwvc3Ryb25nPjwvaDI+Cjx0YWJsZSBib3JkZXI9"0" cellspacing="0" cellpadding="0" width="560">
Public Constructors
ContentObserver(Handler handler)
onChange() will happen on the provider Handler.
說明:所有 ContentObserver的派生類都需要調用該構造方法
參數:handler Handler對象。可以是主線程Handler(這時候可以更新UI 了),也可以是任何Handler對象。
Public Methods
boolean
deliverSelfNotifications()
Returns true if this observer is interested in notifications for changes made through the cursor the observer is registered with.
final void
dispatchChange(boolean selfChange)
void
onChange(boolean selfChange)
This method is called when a change occurs to the cursor that is being observed.
說明:
void onChange(booleanselfChange)
功能:當觀察到的Uri發生變化時,回調該方法去處理。所有ContentObserver的派生類都需要重載該方法去處理邏輯。
參數:selfChange 回調後,其值一般為false,該參數意義不大(我也不懂,理解方法最重要)。
觀察特定Uri的步驟如下:
1、 創建我們特定的ContentObserver派生類,必須重載父類構造方法,必須重載onChange()方法去處理回調後的功能實現
2、 利用context.getContentResolover()獲得ContentResolove對象,接著調用registerContentObserver()方法去注冊內容觀察者
如://為content://sms的數據改變注冊監聽器getContentResolver().registerContentObserver(Uri.parse
("content://sms"), true, new SmsObserver(new Handler()));
3、 由於ContentObserver的生命周期不同步於Activity和Service等,因此,在不需要時,需要手動的調用unregisterContentObserver()去取消注冊。
字段
說明
_id
短信序號,如100
thread_id
對話的序號,如100,與同一個手機號互發的短信,其序號是相同的
address
發件人地址,即手機號,如+86138138000
person
發件人,如果發件人在通訊錄中則為具體姓名,陌生人為null
date
日期,long型,如1346988516,可以對日期顯示格式進行設置
protocol
協議0SMS_RPOTO短信,1MMS_PROTO彩信
read
是否閱讀0未讀,1已讀
status
短信狀態-1接收,0complete,64pending,128failed
type
短信類型1是接收到的,2是已發出
body
短信具體內容
service_center
短信服務中心號碼編號,如+8613800755500
package com.jph.monitorsms; import java.text.SimpleDateFormat; import java.util.Date; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.widget.TextView; import android.widget.Toast; import android.app.Activity; import android.database.ContentObserver; import android.database.Cursor; /** * Describe: * 獲取用戶正在發送的短信 * 本實例通過為content://sms的數據改變注冊監聽器來 * 獲取手機正在發送的消息。 * @author JPH * Date:2014.07.20 * */ public class MonitorSms extends Activity { TextView txtView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); txtView=(TextView)findViewById(R.id.txtView); //為content://sms的數據改變注冊監聽器 getContentResolver().registerContentObserver(Uri.parse ("content://sms"), true, new SmsObserver(new Handler())); } //一個繼承自ContentObserver的監聽器類 class SmsObserver extends ContentObserver{ public SmsObserver(Handler handler) { super(handler); // TODO Auto-generated constructor stub } @Override public void onChange(boolean selfChange) { // TODO Auto-generated method stub //查詢發送向箱中的短信 Cursor cursor=getContentResolver().query(Uri.parse( "content://sms/outbox"), null, null, null, null); //遍歷查詢結果獲取用戶正在發送的短信 while (cursor.moveToNext()) { StringBuffer sb=new StringBuffer(); //獲取短信的發送地址 sb.append("發送地址:"+cursor.getString(cursor.getColumnIndex("address"))); //獲取短信的標題 sb.append("\n標題:"+cursor.getString(cursor.getColumnIndex("subject"))); //獲取短信的內容 sb.append("\n內容:"+cursor.getString(cursor.getColumnIndex("body"))); //獲取短信的發送時間 Date date=new Date(cursor.getLong(cursor.getColumnIndex("date"))); //格式化以秒為單位的日期 SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 hh時mm分ss秒"); sb.append("\n時間:"+sdf.format(date)); System.out.println("查詢到的正在發送的短信:"+sb.toString()); Toast.makeText(MonitorSms.this, sb.toString(), Toast.LENGTH_LONG).show(); txtView.setText(sb.toString()); } super.onChange(selfChange); } } }
知識點目錄 10.1 布局優化 10.1.1 Android UI渲染機制 10.1.2 避免Overdraw 10.1.3 優化布局層級 10.1.4 避免嵌套過多無用
1、概述AIDL在android系統中的作用AIDL,Android Interface definition language的縮寫,它是一種android內部進程通信
文件存儲是 Android 中最基本的一種數據存儲方式,它不對存儲的內容進行任何的格式化處理,所有數據都是原封不動的保存到文件當中的。概述文件存取的核心就是輸入流和輸出流
Software License .box { overflow:hidden