读书人

ContentObsever种浅析

发布时间: 2013-03-04 17:22:13 作者: rapoo

ContentObsever类浅析


2、观察系统里短消息的数据库变化的ContentObserver派生类,SMSContentObserver.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; private SMSContentObserver smsContentObserver; /** 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); smsContentObserver = new SMSContentObserver(this, mHandler); //注册内容观察者 registerContentObservers() ; } private void registerContentObservers() { // 通过调用getUriFor 方法获得 system表里的"飞行模式"所在行的Uri Uri airplaneUri = Settings.System.getUriFor(Settings.System.AIRPLANE_MODE_ON); // 注册内容观察者 getContentResolver().registerContentObserver(airplaneUri, false, airplaneCO); // ”表“内容观察者 ,通过测试我发现只能监听此Uri -----> content://sms // 监听不到其他的Uri 比如说 content://sms/outbox Uri smsUri = Uri.parse("content://sms"); getContentResolver().registerContentObserver(smsUri, true,smsContentObserver); } 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; case MSG_OUTBOXCONTENT: String outbox = (String) msg.obj; etSmsoutbox.setText(outbox); break; default: break; } } }; }


?

?

在此基础上,你可以利用ContentObserver去实现短信黑名单以及悄悄发送短信等技巧,具体可以参考我博客中:

??????????????? Android使用ContentObserver监听数据库变化

?

?总结: 使用ContentObserver的情况主要有一下两者情况:

????????????? 1、需要频繁检测的数据库或者某个数据是否发生改变,如果使用线程去操作,很不经济而且很耗时 ;

????????????? 2、在用户不知晓的情况下对数据库做一些事件,比如:悄悄发送信息、拒绝接受短信黑名单等;

?

读书人网 >移动开发

热点推荐