-
BroadcastReceiver 5. 在java中动态注册一个BroadcastReceiver IntentFilter intentFilter = new IntentFilter("Broadcast_one"); //设置过滤 MyBroadcastReceiver2 receiver2 = new MyBroadcastReceiver2(); registerReceiver(receiver2, intentFilter); 注意: 1)动态注册的BroadcastReceiver优先级要比静态注册的高 2)动态注册有个弊端:如果当前java的程序结束了,动态注册的接收者将不再能收到广播。所以类似于短信拦截的BroadcastReceiver不能用动态注册。查看全部
-
手势识别原理查看全部
-
BroadcastReceiver用法 1. 发送Broadcast,封装在一个Intent对象中 Intent intent = new Intent(); intent.putExtra("msg", "this is a normal broadcast"); //msg为key,value就是后面的“this is a normal broadcast” intent.setAction("Broadcast_one"); //设置一个action,用于过滤广播 sendBroadcast(intent); 2. 接收端 1)接收者要继承BroadcastReceiver类 public class MyBroadcastReceiver extends BroadcastReceiver { 2)重写onReceive()方法 public void onReceive(Context context, Intent intent) { String string = intent.getStringExtra("msg"); 3. Manifest.xml中要注册一个BroadcastReceiver <receiver android:name="com.example.broadcastreceiverdemo.MyBroadcastReceiver" > <intent-filter android:priority="100" > //设置广播接收的优先级 <action android:name="Broadcast_one"/> //将action设置为过滤条件 </intent-filter> </receiver> 4. 截断广播 abortBroadcast(); //普通广播不能被截断查看全部
-
Broadcast的特点(如图)查看全部
-
Broadcast和BroadcastReceiver 1. 概念: 1)Broadcast一种广泛运用的在应用程序之间传输信息的机制 2)BroadcastReceiver,对发送出来的广播进行过滤接收并响应的一类组件,它可以用来接收来自系统和应用中的广播 3)用途 开机完成后系统会产生一条广播 网络状态改变时系统会产生一条广播 电量改变时系统产生一条广播 2. 为什么要设计广播 大大减少开发工作量和周期(程序员不需要关注底层如何实现,只需要掌握BroadcastReceiver就行了) 3. 使用方法: 1)发送: 将信息装入一个Intent对象,通过调用相应的方法将Intent对象以广播方式发送出去 sendBroadcast()\sendOrderBroadcast()\sendStickyBroadcast() 2)接收: 当Intent发送之后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,匹配成功的话就会调用BroadcastReceiver的onReceive()方法。 所以定义一个BroadcastReceiver的时候都需要实现onReceive()方法 4. 生命周期 生命周期只有5s左右,每次广播来的时候都会创建BroadcastReceiver对象,并调用onReceive()方法。 所以不能在onReceive()做一些耗时操作,可以通过发送Intent给service,由service完成耗时操作。 注意子线程也不行 5. 广播的种类(如图) 注意有序广播是可以终止的,且接收者可以篡改内容查看全部
-
使用ContentResolver插入数据 ContentResolver resolver = getContentResolver(); //向联系人中插入一行数据 ContentValues values = new ContentValues(); Uri uri = resolver.insert(RawContacts.CONTENT_URI, values); //插入数据 long rawContactId = ContentUris.parseId(uri); values.clear(); //插入人名 values.put(StructuredName.RAW_CONTACT_ID, rawContactId); values.put(StructuredName.DISPLAY_NAME, "xtzhang"); values.put(StructuredName.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); resolver.insert(Data.CONTENT_URI, values); 注意对应的权限: <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/> 最后总结: 不管是哪种ContentProvider,都要使用getContentResolver()方法得到ContentResolver类,然后对ContentProvider中的数据进行操作查看全部
-
(接上一笔记) 7. ContentResolver 1)根据id查询email地址 int id=cursor.getInt(cursor.getColumnIndex(Contacts._ID)); Cursor cursor3 = resolver.query(Email.CONTENT_URI, new String[]{Email.ADDRESS, Email.TYPE}, Email.CONTACT_ID+"="+id, null, null); //查询条件是Email.ADDRESS, Email.TYPE //附加的条件是Email.CONTACT_ID+"="+id 2)根据email类型做一些操作 int emailType = cursor3.getInt(cursor3.getColumnIndex(Email.TYPE)); if(emailType == Email.TYPE_HOME){……} 8. 注意 1)使用getContentResolver()方法得到ContentResolver类,然后对ContentProvider中的数据进行操作 Contacts、Phone、Email都是系统自带的ContentProvider 2)contacts、phone和email对应的Uri(query()第一个参数)分别是: Contacts.CONTENT_URI Phone.CONTENT_URI Email.CONTENT_URI 2)三个包名分别来自: import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.CommonDataKinds.Phone;import android.provider.ContactsContract.CommonDataKinds.Email; 3)Cursor类的query()方法第三个参数String selection可以指定条件 4)获取联系人需要一定的权限 <uses-permission android:name="android.permission.READ_CONTACTS"/>查看全部
-
ContentProvider 7. ContentResolver 当外部应用程序需要对ContentProvider中的数据进行操作时就要使用ContentResolver类来完成 1)外部应用程序的Activity中使用getContentResolver()方法获取ContentResolver对象 2)ContentResolver类提供了与ContentProvider类相同签名的四个方法(如图) ContentResolver resolver = getContentResolver(); 然后查询联系人数据库 Cursor cursor = resolver.query(Contacts.CONTENT_URI, new String[]{Contacts._ID,Contacts.DISPLAY_NAME}, null, null, null);//从Contacts里面查询联系人 注意:Contacts的包名是import android.provider.ContactsContract.Contacts; 3)查询某个联系人的电话号码 int id=cursor.getInt(cursor.getColumnIndex(Contacts._ID)); //获取当前联系人(行)的id 然后查询当前联系人的number和number类型 Cursor cursor2 = resolver.query(Phone.CONTENT_URI, new String[]{Phone.NUMBER,Phone.TYPE}, Phone.CONTACT_ID+"="+id, null, null); 注意这里加入了一个条件:Phone.CONTACT_ID+"="+id,要匹配到当前的联系人对应的id number类型可能是Phone.TYPE_HOME和Phone.TYPE_MOBILE或其他类型 可以根据类型做一些操作 int phoneType = cursor2.getInt(cursor2.getColumnIndex(Phone.TYPE)); if(phoneType == Phone.TYPE_HOME){……}查看全部
-
ContentProvider 5. Uri模型,如图 注意:B段(com.imooc.provider)是全局唯一的,和AndroidManifest.xml的android:authorities对应。查看全部
-
ContentProvider 1. 有一个例子可以参考一下: Contacts Storage是一个联系人数据的提供者,它也是一个应用程序,但本身没有UI Contacts应用程序用来读取Contacts Storage的数据,并显示出来。 这样有一个数据的提供者,就可以写其他的APP用来读取。 2. 如图,ContentProvider的使用模型查看全部
-
File文件操作(注意这是3-3的笔记) 输出流刚开始是没有内容的,需要调用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 }查看全部
-
5. 文件操作模式查看全部
-
File类 1. 创建一个File对象 File file = new File("/mnt/sdcard/xzhang76"); 2. 获取当前应用程序默认的数据存储目录 File dir = this.getFilesDir(); 应该是/data/data/<应用程序的包名>/files 3. 获取当前应用程序默认的缓存文件存放目录 File dir2 = this.getCacheDir(); 应该是/data/data/<应用程序的包名>/cache 4. 在当前应用程序包名下创建一个目录 File dir3 = this.getDir("xzhang76", MODE_PRIVATE); 应该是/data/data/com.example.filedemo/app_xzhang76 5. 获取应用程序外部的存储位置/缓存文件存储位置,该目录和内置存储位置的使用是一样的 File dir4 = this.getExternalFilesDir(null); /storage/sdcard0/Android/data/com.example.filedemo/files File dir5 = this.getExternalCacheDir(); /storage/sdcard0/Android/data/com.example.filedemo/cache 注意一点: 开发APP时,应该把数据存放在这两个目录下面,这样卸载之后就会清空这些目录。否则卸载之后就不会清空数据,产生数据垃圾。查看全部
-
1.sharePreferences 2.SQLite 3.Content Provider 4.File查看全部
-
SQLiteOpenHelper 一般的用法是通过创建一个类来继承它,并重写onCreate()和onUpgrade()方法 onCreate()方法是创建数据库时自动回调,如果当前程序中已经有了数据库就不会回调。一般情况下是建库和建表放在onCreate()方法实现中。 用法: 1. 新建一个类继承SQLiteOpenHelper这个类,并重写构造函数,onCreate(),onUpgrade()方法 public class MySQLite extends SQLiteOpenHelper { 2. onCreate() 这里可以做建库和建表的操作 public void onCreate(SQLiteDatabase db) { db.execSQL("create table if not exists stutb(_id integer primary key autoincrement,name text not null,sex text not null,age integer not null)"); ContentValues values = new ContentValues(); values.put("name", "xzhang76"); values.put("sex", "man"); values.put("age", 27); db.insert("stutb", null, values); values.clear(); } 3. 在MainACtivity中 创建一个MySQLite,并通过getWritableDatabase()方法获取一个可写的SQLiteDatabase对象 MySQLite mySQLite = new MySQLite(MainActivity.this, "stu.db", null, 1); SQLiteDatabase writableDatabase = mySQLite.getWritableDatabase(); //获取一个可写的数据库 4. 接下来就可以对这个writableDatabase对象进行操作了 Cursor cursor = writableDatabase.rawQuery("select * from stutb", null);//查询数据库查看全部
举报
0/150
提交
取消