-
广播接收器---“普通的广播接收器” 1.首先发送广播。 Intent intent=new Intent(); intent.setAction("BC_ONE"); //设置动作(就是给改广播一个名字,用于过滤),与广播接收器的过滤条件匹配 intent.putExtra("msg", "这是我发送的广播");//放入数据 sendBroadcast(intent); //将广播发送出去 2.然后新建一个类 BC1 ,继承 BroadcastReceiver 并实现方法 onReceive(): public void onReceive(Context context, Intent intent) { //该广播接收器注册之后,如果接受到广播,会调用该回掉函数。之前通过回掉函数中的intent来获取信息 String s = intent.getStringExtra("msg"); System.out.printf("receive1收到消息:"+s); } 4.在AndroidManifest.xml中注册广播接收器 <!-- 注册广播接收器,name为全限定名 --> <receiver android:name="com.example.broadcastreceiverdemo.MyBroadcastReceiver1"> <!-- 广播接收器过滤器 ,priority设置优先级,-1000~1000--> <intent-filter android:priority="100"> <!-- 过滤Action为“BC_ONE”的广播,只接受这个 --> <action android:name="BC_ONE"/> </intent-filter> </receiver> 其他知识点总结: 一、优先级 1.通过在xml注册时设置优先级。数越大,优先级越高。就会越先调用 2.可以动态注册,如果动态注册。优先级最大。高于任何xml中注册的。 3.如果动态注册和静态注册都有,则会执行两次onReceive查看全部
-
广播的种类: 1. 普通广播(Normal broadcasts) 所有监听该广播的广播接收者都可以监听到该广播。 2. 有序广播(Ordered broadcasts) 按照接收者的优先级顺序接收广播,优先级别在 intent-filter中的priority中声明,-1000到1000之间,值越大,优先级越高。可以终止广播意图的继续传播。接收者可以篡改内容。 3. 异步广播(粘滞性滞留广播) 不能将处理结果传给下一个接收者,无法终止广播。 普通广播的特点: 1. 同级别接收,次序随机 2. 级别低的后收到广播 3. 接收者不能截断广播的继续传播也不能处理广播 4. 同级别动态注册高于静态注册(动态注册的优先级别更高) 有序广播特点: 1. 同级别接收顺序是随机的 2. 能截断广播的继续传播,高级别的广播接收器收到该广播后,可以决定是否截断该广播。 3. 接收器能截断广播的继续传播,也能处理广播。 4. 同级别动态注册高于静态注册。查看全部
-
组件篇—BroadcastReceiver 1. Boastcast(广播)是一种广泛运用的在应用程序之间传输信息的机制。 2. BroadcastReceiver(广播接受者)是对发送出来的广播进行过滤并响应的一类组件,它就是用来接收来自系统和应用中的广播。 3. 用途: * 当开机完成后系统会产生一条广播;有些程序会接收此广播而启动程序,这就是“自启动”。 * 当网络状态改变时系统会产生一条广播;一般用于提示用户。 * 当电池电量改变时,系统会产生一条广播; * 其他。 为什么需要广播? 假如没有广播,那么,很多事情都要自己做,需要自己想办法去获取数据。 有了广播,我们只需等待广播告诉我们信息。 广播的优点: 1. 大大减少开发的工作量和开发周期 2. 作为应用开发者,只需要掌握 BroadcastReceiver,不需要了解底层实现。 使用方法:发送: 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所在的进程很容易在需要的时候被杀死,因为此时它是空进程(没有任何活动组件的进程就是空进程),一旦宿主进程被杀掉了,那么正在工作的子进程也会被杀死。查看全部
-
插入电话信息 其中的 Data.CONTENT_URI 要导入的包是:android.provider.ContactsContract.Data; 而系统自动匹配的可能是其他包,这时就会出错,所以要检查一下是不是导错包了。 需要添加的权限: <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/> 代码: ContentResolver cr=getContentResolver(); //向联系人中插入一行数据 ContentValues values=new ContentValues(); Uri uri=cr.insert(RawContacts.CONTENT_URI, values); Long raw_contact_id=ContentUris.parseId(uri); values.clear(); //插入人名 values.put(StructuredName.RAW_CONTACT_ID, raw_contact_id);// 先确定主键,然后才能正确地添加信息 values.put(StructuredName.DISPLAY_NAME, "郭富城"); values.put(StructuredName.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);//声明MiME类型是一条记录,而不是很多条查看全部
-
更具联系人ID查询出联系人的邮箱地址---代码 (不用姓名的原因是姓名可能有相同的,而ID是唯一的)查看全部
-
方法属性查看全部
-
记得加上<uses-permission android:name="android.permission.READ_CONTACTS"/> 号码的查询不再像前面那种直接查询,而是必须通过联系人的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中获取数据。查看全部
-
UriMatcher类查看全部
-
uri查看全部
-
ContentProvider与其他几种存储不同(都只是在单独的一个应用程序之中达到一个数据的共享,不能访问其他应用的数据),ContentProvider提供数据,可以在不同应用间 通过继承ContentProvider实现针对数据的增删改查等方法,需要在清单文件中注册 <provider android:name="com.imooc.MusicProvider" android:authorities="com.provider.music" ></provider> 注:注册的anthorities的属性值,是全局唯一的。 第三方的访问能力完全取决于你自定义的ContentProvider,如果定义的ContentProvider只实现查询功能,那么第三方程序就只能做查询的操作,不能做其他的操作。 继承 ContentProvider 之后实现的几个方法: onCreate() :在ContentProvider创建后使用。 Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):根据Uri查询selection指定的条件所匹配的全部记录,并且可以指定查询哪些字段、以什么方式排序。 insert(Uri uri, ContentValues values):根据Uri插入values对应的数据。 delete(Uri uri, String selection, String[] selectionArgs):根据Uri删除selection指定的条件所匹配的全部记录。 update(Uri uri, ContentValues contentValues, Str。。。。):根据Uri修改selection指定的条件所匹配的全部记录。 比较值得注意的如下: getType(Uri uri):返回当前Uri的 MIME 类型,如果当前的Uri包含多条记录,那么 MIME 类型字符串就以 vnd.android.dir/ 开头,如果该Uri对应的数据只有一条记录,那么 MIME 类型字符串就以 vnd.android.cursor.item/ 开头查看全部
-
当应用程序在安装时,系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库应该都是私有的(位于/data/data/<package name>/files),其他程序无法访问。除非在创建时指定了MODE_WORLD_READABLE 或者 MODE_WORLD_WRITEABLE。 创建的文件保存在/data/data/<package name>/files目录 openFileOutput(fileName,MODE):第一个参数是文件的名字,第二个参数是权限,权限可以叠加的。 如果希望文件被其他应用读和写,可以传入: MODE_WORLD_READABLE + MODE_WORLD_WRITEABLE,也就是说,权限是可以合理地叠加在一起。查看全部
-
File文件操作(图为读取文件内容) 输出流刚开始是没有内容的,需要调用FileOutputStream.write()来写入内容;输入流刚开始是有内容,可以调用FileInputStream.read(buffer)将输入流的内容读到buffer中。 1. 创建一个输出流 FileOutputStream outputStream = openFileOutput("xzhang76.txt", MODE_PRIVATE); 然后写入内容 outputStream.write(content.getBytes()); outputStream.close(); 2. 创建一个输入流 FileInputStream inputStream = openFileInput("xzhang76.txt"); 然后从文件中读取并写入内容到ByteArrayOutputStream对象: ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while((len=inputStream.read(buffer))!=-1){ //从文件中读取内容到buffer中 outputStream.write(buffer, 0, len); //把buffer写入到outputStream }查看全部
-
权限与文件存储路径 MODE_PRIVATE - 为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。 MODE_APPEND - 模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。 MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE - 用来控制其他应用是否有权限读写该文件 MODE_WORLD_READABLE - 表示当前文件可以被其他应用读取 MODE_WORLD_WRITEABLE - 表示当前文件可以被其他应用写入查看全部
-
Android中文件存储的操作 1.Activity的openFileOutput()方法可以把数据输出到文件中 2.创建的文件保存在/data/data/<package name>/files目录 3.实现过程与在java中保存数据到文件中是一样的 new File("/mnt/sdcard/test"); 路径指向安卓自带的目录,指向SD卡。 new File("/mnt/extsdcard/test"); 指向外存储卡。 <!-- 在SD卡中创建与删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!-- 向SD卡写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 图中为文件的创建和删除查看全部
举报
0/150
提交
取消