-
怎样用好 BroadcastReceiver ?查看全部
-
有序广播的代码几乎和普通广播如出一辙: case R.id.btn_send2: // 发送有序广播 Intent intent2 = new Intent(); intent2.putExtra("msg2","这是一条有序广播"); intent2.setAction("BC_TWO"); sendOrderedBroadcast(intent2,null); // 第二个参数是权限,接收者需要权限才能收到广播,这里直接写为null。 break; 代码上的差别就是一句:sendOrderedBroadcast(intent2,null); 功能上的差别才比较明显:有序广播可以被截断或者被处理。查看全部
-
动态注册 在 MainActivity 的onCreate()方法里面直接注册: IntentFilter intentFilter = new IntentFilter("BC_ONE"); // 动态注册所需的过滤器 BC3 bc3 = new BC3(); // 动态注册的对象 registerReceiver(bc3,intentFilter); // 接收器的动态注册 如图,在截图的上面部分。查看全部
-
普通广播的示例: 1. 先在主界面设置一个Button,设置点击事件doClick。 2. 在 MainActivity 中实现方法doClick(): public void doClick(View view){ switch (view.getId()){ case R.id.btn_send1: // 发送普通广播 Intent intent = new Intent(); // 发送信息就要创建一个Intent intent.putExtra("msg","这是一条普通广播"); // 设置一个标识,用于过滤(会在注册的时候用到) intent.setAction("BC_ONE");// 其实这里最好使用完整类名,但因为只是举个例子,所以写成“BC_ONE” // 将intent发送出去 sendBroadcast(intent); break; } } 然后新建一个类 BC1 ,继承 BroadcastReceiver 并实现方法 onReceive(): public void onReceive(Context context, Intent intent) { String s = intent.getStringExtra("msg"); System.out.printf("receive1收到消息:"+s); } 最后,在配置文件 AndroidManifest中注册接收者: <receiver android:name=".BC1"> <intent-filter android:priority="100"> <action android:name="BC_ONE"></action> </intent-filter> </receiver> 其中 android:priority="100" 是把优先级设置为100,一般的范围是-1000到1000。 ----------------- 截断广播: abortBroadcast(); 普通广播之下,若在优先级较高的BC2的类里面添加: abortBroadcast(); 是不能截断广播的,BC1仍然会收到广播,并且系统会报错。查看全部
-
广播的种类: 1. 普通广播(Normal broadcasts) 所有监听该广播的广播接收者都可以监听到该广播。 2. 有序广播(Ordered broadcasts) 按照接收者的优先级顺序接收广播,优先级别在 intent-filter中的priority中声明,-1000到1000之间,值越大,优先级越高。可以终止广播意图的继续传播。接收者可以篡改内容。 3. 异步广播(粘滞性滞留广播) 不能将处理结果传给下一个接收者,无法终止广播。 普通广播的特点: 1. 同级别接收,次序随机 2. 级别低的后收到广播 3. 接收者不能截断广播的继续传播也不能处理广播 4. 同级别动态注册高于静态注册(动态注册的优先级别更高) 有序广播特点: 1. 同级别接收顺序是随机的 2. 能截断广播的继续传播,高级别的广播接收器收到该广播后,可以决定是否截断该广播。 3. 接收器能截断广播的继续传播,也能处理广播。 4. 同级别动态注册高于静态注册。查看全部
-
使用方法: 发送: 1. 把信息装入一个 Intent对象(如Action、Category) 2. 通过调用相应的方法将 Intent对象以广播方式发送出去: sendBroadcast() sendOrderBroadcast() sendStickyBroadcast() 接收: 当 Intent 发送以后,所有已经注册的 BroadcastReceiver 会检查注册时的 IntentFilter 是否与发送的 Intent 相匹配,若匹配则就会调用 BroadcastReceiver的 onReceive()方法。所以当我们定义一个 BroadcastReceiver 的时候,都需要实现 onReceive()方法。 注意:BroadcastReceiver需要注册 * 静态注册 * 代码注册 注意!!!! 1. BroadcastReceiver 生命周期只有十秒左右。 2. BroadcastReceiver 里面不能做一些耗时操作(就是因为生命周期短) 3. 耗时操作应该通过发送 Intent 给 Service,由Service来完成 4. 不能使用子线程。使用子线程不可靠!因为BroadcastReceiver生命周期太短,可能接收都结束了,子线程还没结束。接收器一旦结束了,Receiver所在的进程很容易在需要的时候被杀死,因为此时它是空进程(没有任何活动组件的进程就是空进程),一旦宿主进程被杀掉了,那么正在工作的子进程也会被杀死。查看全部
-
组件篇—BroadcastReceiver 1. Boastcast(广播)是一种广泛运用的在应用程序之间传输信息的机制。 2. BroadcastReceiver(广播接受者)是对发送出来的广播进行过滤并响应的一类组件,它就是用来接收来自系统和应用中的广播。 3. 用途: * 当开机完成后系统会产生一条广播;有些程序会接收此广播而启动程序,这就是“自启动”。 * 当网络状态改变时系统会产生一条广播;一般用于提示用户。 * 当电池电量改变时,系统会产生一条广播; * 其他。 ---------------- 为什么需要广播? 假如没有广播,那么,很多事情都要自己做,需要自己想办法去获取数据。 有了广播,我们只需等待广播告诉我们信息。 广播的优点: 1. 大大减少开发的工作量和开发周期 2. 作为应用开发者,只需要掌握 BroadcastReceiver,不需要了解底层实现。查看全部
-
自定义的ContentProvider很难,需要自己去写一整套的ContentProvider,而且实际意义也不大,一般是企业实现多个程序的数据共享的时候才会用到。 也就是说,自定义的 ContentProvider 是为了解决多个程序的数据共享的问题。查看全部
-
插入电话信息 其中的 Data.CONTENT_URI 要导入的包是:android.provider.ContactsContract.Data; 而系统自动匹配的可能是其他包,这时就会出错,所以要检查一下是不是导错包了。 需要添加的权限: <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/> -------------------- 代码: values.put(StructuredName.RAW_CONTACT_ID,raw_contact_id); values.put(StructuredName.DISPLAY_NAME,"张三"); values.put(StructuredName.MIMETYPE,StructuredName.CONTENT_ITEM_TYPE);//声明MiME类型是一条记录,而不是很多条 uri = cr.insert(Data.CONTENT_URI ,values); values.clear(); // 插入电话信息,需要指定电话号码以及类型,尤其是类型,比较容易忘记去添加 values.put(Phone.RAW_CONTACT_ID,raw_contact_id); // 先确定主键,然后才能正确地添加信息 values.put(Phone.NUMBER,"1333333333"); values.put(Phone.MIMETYPE,Phone.CONTENT_ITEM_TYPE); cr.insert(Data.CONTENT_URI,values);查看全部
-
// 根据联系人的ID去查询联系人的邮箱地址(截图有误) Cursor c2 = cr.query(Email.CONTENT_URI,new String[]{Email.DATA,Email.TYPE},Email.CONTACT_ID+"="+id,null,null); if (c2!=null){ while (c2.moveToNext()){ int type = c2.getInt(c2.getColumnIndex(Email.TYPE)); if (type == Email.TYPE_WORK){ Log.i("info","工作邮箱:"+Email.DATA); } } c2.close(); } ------------ 最后,别忘了关闭游标c。查看全部
-
号码的查询不再像前面那种直接查询,而是必须通过联系人的Id去查找对应的电话,如果不这么做,查出来的电话号码可能不是当前联系人的电话号码。 依然需要通过ContentResolver来查询(在上节课的游标循环之内),然后返回一个游标Cursor,再通过游标去查询号码。这样就形成了“游标套游标”。 需要导入的包:android.provider.ContactsContract.CommonDataKinds.Phone; 1. 查询的 Uri : Phone.CONTENT_URI。 2. 查询的内容:号码除了数字以外,还有分类型(例如移动号码、家庭号码),所以对应两个属性:Phone.NUMBER,Phone.TYPE。查询内容就是 new String[]{Phone.NUMBER,Phone.TYPE}。 3. 查询条件,是根据 Id 去查的,写做 Phone.CONTACT_ID+"="+id。注意等号一定要加引号。 4. 最后两个属性这里不需要,都写成 null 就可以了。 ------------- 通过游标查询电话之后,记得关闭游标c1。注意这里的关闭是在 if (c1!=null)语句块之内,如果写到外面则会存在空指针异常。查看全部
-
ContentProvider: 1. 使用 ContentResolver 操作 ContentProvider 中的数据: 当外部应用需要对 ContentProvider 中的数据进行增删改查的时候,可以使用 ContentResolver 类来完成。 2. 使用 Activity 提供的 getContentResolver() 方法获取 ContentResolver 对象。 3. ContentResolver 类提供了与 ContentProvider 类相同签名的四个方法: -- public Uri insert(Uri uri,ContentValues values).该方法用于往ContentProvider里面添加数据。 -- public int delete(Uri uri,String selection,String[] selectionArgs).该方法从ContentProvider中删除数据。 -- public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs).该方法用于更新ContentProvider里面的数据。 -- public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder).该方法用于从ContentProvider中获取数据。查看全部
-
本章要实现的功能 1. 使用系统提供的 ContentProvider - 查询联系人 - 增加联系人 2. 使用自定义的ContentProvider - 自定义 ------------------ 必须添加的权限:<uses-permission android:name="android.permission.READ_CONTACTS"/> ----------------- 查询方法——query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder)的解析: 联系人的Uri地址:ContactsContrac。Contacts.CONTENT_URI。 查询的内容(projection),可以直接自定义一个数组表示:new String[]{Contacts._ID,Contacts.DISPLAY_NAME},其中 Contacts._ID,Contacts.DISPLAY_NAME 都是系统写死了的常量,都可以直接调用,分别表示主键和人名。 查询的条件(selection):不需要的话就写 null,另外selectionArgs也写成null。 排序(sortOrder)采用默认排序,所以也写成 null。查看全部
-
UriMatcher类 如果match()匹配失败,则返回 -1,也就是 UriMatcher.NO_MATCH。查看全部
-
何为 Uri ?查看全部
举报
0/150
提交
取消