广播机制1
发送方不关心接受方是否接收到数据 不关心如何处理数据 发送方只负责发送数据
Android广播机制介绍
发送事件
BroadcastReceiver作用
BroadcastReceiver的编写方法
编写一个类 继承BroadcastReceiver
实现其中的onReceive方法
在manifest文件中注册
当action的intent为指定actioin时 触发receiver
<receiver android:name=".类名">
<intent-filter>
<action android:name="android.intent.action.EDIT" />
</intent-filter>
</receiver>
使用广播
Intent intent = new Intent();
intent.setAction(Intent.ACTION_EDIT);
TestActivity.this.sendBroadcast(intent);//发送广播
一个intent由action和data2部分构成(方法/动作+数据)
BroadcastReceiver的生命周期
每次发送广播 都生成一个新的Receiver
一旦onReceive方法返回 Receiver对象就被认为过期
本来想好好整理格式什么的 后来有点问题只好算了 直接复制了 也没整理格式。。主要方便自己随便哪里都可以看到 到时候再回想
ContentProvider初步
1 ContentProvider基本概念
为存储和获取数据提供了统一的接口
可以在不同应用程序之间共享数据
Android为常见的一些数据提供了ContentProvider(音频 图片 通信录等等)
ContentProvider使用表的形式来组织数据
ContentProvider所提供的函数
query inset update delete getType onCreate
2 Uri 统一资源标识符
每个ContentProvider都拥有一个公共的URI,用于表示这个ContentProvider所提供的数据
Android所提供的ContentProvider都存放在android.provider包中
3 ContentProvider的实现方法
(自己实现一个并不常见 使用内置较多)
1 定义一个CONTENT_URI常量
public static final Uri CONTENT_URI=Uri.parse("content://com.example.abc(AUTHORITY变量)/a/b");一般用类名等
定义常量 列名 必须有_ID(INTEGER PRIMARY KEY AUTOINCREMENT 如果使用sqllite3的话 type)
数据类型通过CONTENT_TYPE和CONTENT_TYPE_ITEM确定
CONTENT_TYPE vnd.android.cursor.dir(代表整张表)/vnd.namename
CONTENT_TYPE_ITEM vnd.android.cursor.item(某一条)/vnd.namename
表的结构可以通过implementBaseColumns来达到目的
2 定义一个类,继承ContentProvider
UriMatcher 用于匹配URI
uriMatcher.addURI("AUTHORITY变量","路径/#(id)",匹配常量)
userProjectionMap 一个<String,String>的HashMap
userProjectionMap.put(列名,列名的别名)
3 实现query insert update delete onCreate getType等方法
getType方法 根据传入的URI 返回该URI所表示的数据类型
eg:
switch(uriMatcher.match(uri)){
case 匹配常量1:
return 数据类型(CONTENT_TYPE)
case 匹配常量2:
return 数据类型2(CONTENT_TYPE_ITEM)
}
实现insert(Uri uri,ContentValue values)方法
eg:
通过sqllite操作
返回值为代表刚刚插入数据的Uri
实现onCreate方法
eg:
dh=new DatabaseHelper(getContext(),数据库名);
return true;
实现query方法
eg:
用到SQLiteQueryBuiler对象
qb.setTables(表名)
qb.setProjectionMap (之前创建的HashMap别名彪)
对单条 qb.appendWhere()
4 在AndroidManifest.xml中声明
<provider android:name="包名+类名"
android:authorities="包名+类名" /> 这里的authorities一定要与定义的常量一致
使用自定义ContentProvider
new ContentValues()存放要存入的值
uri=getContentResolver().inset(要插入的uri,contentValues)
1 注册BroadcastReceiver的方法
BroadcastReceiver用于监听被广播的事件(Intent)
2种注册方法
(1)在应用程序代码中注册
注册BroadcastReciver:
registerReceiver(receiver,filter);
取消注册:
unregisterReceiver(receiver);
如果一个BroadcastReceiver用于更新UI,那么通常用代码方式
在Activity启动时注册BroadcastReceiver,在Activity不可见后取消注册
eg:
//生成一个BroadcastReceiver对象
smsReceiver = new SMSReceiver();//比如
//生成一个IntentFilter对象
IntentFilter filter = new IntentFilter();
//为filter添加一个Action
filter.addAction(android.provider.Telphony.SMS_RECEIVED);
//注册 (同理 解除绑定Activity.this.unregisterReceiver(smsReceiver);)
Activity.this.registerReceiver(smsReceiver,filter);
在Receiver类的onReceive方法中
通过Bundle bundle=intent.getExtras()得到intent中的数据
Object[] myOBJpdus=(Object[])bundle.get("pdus");
Bundle对象的一个属性pudus
SmsMessage[] message=new SmsMessage(myOBJpdus.length);
创建SmsMessage数组
通过for循环得到短消息内容
for(int i=0;i<myOBJpdus.length;i++){
message[i]=SmsMessage.createFromPdu((byte[])myOBJpuds[i]);
System.out.println(message[i].getDisplayMessageBody());
调用SmsMessage的getDisplayMessageBody()方法得到最终内容
}
(2)在AndroidManifest.xml中注册
注意 该方法注册时 即使应用程序已经关闭 仍保持活动状态 继续监听广播
<receiver android:name="类">
<intent-filter>
<action ....../>
</intent-filter>
</receiver>
2 Android内置的BroadcastActions
ACTION_CAMERA_BUTTON
ACTION_BATTERY_LOW
ACTION_DATE_CHANGED
ACTION_POWER_CONNECTED
ACTION_REBOOT
ACTION_SCREEN_ON
SDK中的Intent部分中的BroadcastAction
******
在DDMS中的EmulatorControl中可以模拟发送短信等其他事项