ContentObserver(内容监听者)——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于
数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,
相应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,当然这是与它所监听的Uri MIME Type有关的。
熟悉Content Provider(内容提供者)的应该知道,我们可以通过UriMatcher类注册不同类型的Uri,我们可以通过这些不同的
Uri来查询不同的结果。根据Uri返回的结果,Uri Type可以分为:返回多条数据的Uri、返回单条数据的Uri。
下面是我写的获取短信内容的监听demo:
1.界面
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.smz.g150831android_tell.MainActivity">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取短信内容"
android:id="@+id/tv_main_number"/>
</LinearLayout>
2.实现方法
需要了解更多的可以浏览这个网站:http://blog.csdn.net/qinjuningpublic class MainActivity extends AppCompatActivity { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.tv_main_number); Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Bundle bundle=msg.getData(); textView.setText(bundle.getString("number")); } }; this.getContentResolver().registerContentObserver(Uri.parse("content://sms"),true,new MyObserver(handler)); } class MyObserver extends ContentObserver{ private Handler handler; public MyObserver(Handler handler) { super(handler); this.handler=handler; } @Override public void onChange(boolean selfChange) { Log.i("test","来信息了"); Cursor cursor=MainActivity.this.getContentResolver().query(Uri.parse("content://sms/inbox"),null,null,null,null); if(cursor.moveToNext()){ if(cursor.getString(cursor.getColumnIndex("address")).equals("+8613618420454")){ Log.i("test","来短信了"); String date=cursor.getString(cursor.getColumnIndex("body")); String data[]=date.split(":"); String datas=data[1]; String number=datas.substring(0,4); Log.i("test",number); Message ms=new Message(); Bundle bundle=new Bundle(); bundle.putString("number",number); ms.setData(bundle); handler.sendMessage(ms); } } } } }