Android中的消息机制
- Handler+Message消息机制,是用于子线程与主线程的通讯;
- 广播+广播接收者也是消息机制,是重量级别的,四大组件之一,需要激活组件,
是用于组件和组件之间通讯,应用和应用之间通讯
Android广播的理解:
- 发送广播:理解为学校的广播,发出讯息
- 广播接收者:理解为学生听到的广播发出的讯息
Android中无序广播与有序广播
无序广播:
特点一:发送广播后,所有的广播接收者同时接收,这种类型的广播是没有办法中断的
有序广播:
特点一:发送广播后,广播接收者可以指定自己接收的顺序,-1000 到 1000,如果设置为1000,优先级最高,最先接收,如果先接收到了广播,其他的广播接收者就无法接收到了
特点二:属于例外(发送广播的时候,能明确指定广播接收者,一旦明确指定了广播接收者,是无法中断的,指定的这个接收者一定会接收到的)
SharedPreferences的理解与使用
Android 五种数据存储的方式分别为:
- SharedPreferences:以Map形式存放简单的配置参数;
- ContentProvider:将应用的私有数据提供给其他应用使用;
- 文件存储:以IO流形式存放,可分为手机内部和手机外部(sd卡等)存储,可存放较大数据;
- SQLite:轻量级、跨平台数据库,将所有数据都是存放在手机上的单一文件内,占用内存小;
- 网络存储 :数据存储在服务器上,通过连接网络获取数据;
Sharedpreferences是Android平台上一个轻量级的存储类,用来保存应用程序的各种配置信息,其本质是一个以“键-值”对的方式保存数据的xml文件,其文件保存在/data/data//shared_prefs目录下。在全局变量上看,其优点是不会产生Application 、 静态变量的OOM(out of memory)和空指针问题,其缺点是效率没有上面的两种方法高。
1.获取SharedPreferences
要想使用 SharedPreferences 来存储数据,首先需要获取到 SharedPreferences 对象。Android中主要提供了三种方法用于得到 SharedPreferences 对象。
- Context 类中的 getSharedPreferences()方法:
此方法接收两个参数,第一个参数用于指定 SharedPreferences 文件的名称,如果指定的文件不存在则会创建一个,第二个参数用于指定操作模式,主要有以下几种模式可以选择。MODE_PRIVATE 是默认的操作模式,和直接传入 0 效果是相同的。
MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 这两种模式已在 Android 4.2 版本中被废弃。
Context.MODE_PRIVATE: 指定该SharedPreferences数据只能被本应用程序读、写;Context.MODE_WORLD_READABLE: 指定该SharedPreferences数据能被其他应用程序读,但不能写;Context.MODE_WORLD_WRITEABLE: 指定该SharedPreferences数据能被其他应用程序读;Context.MODE_APPEND:该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件;
- Activity 类中的 getPreferences()方法:
这个方法和 Context 中的 getSharedPreferences()方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为 SharedPreferences 的文件名。 - PreferenceManager 类中的 getDefaultSharedPreferences()方法:
这是一个静态方法,它接收一个 Context 参数,并自动使用当前应用程序的包名作为前缀来命名 SharedPreferences 文件。
2.SharedPreferences的使用
SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接口Editor对象实现。使用Preference来存取数据,用到了SharedPreferences接口和SharedPreferences的一个内部接口SharedPreferences.Editor,这两个接口在android.content包中;
1)写入数据://步骤1:创建一个SharedPreferences对象SharedPreferences sharedPreferences= getSharedPreferences(\"data\",Context.MODE_PRIVATE);//步骤2: 实例化SharedPreferences.Editor对象SharedPreferences.Editor editor = sharedPreferences.edit();//步骤3:将获取过来的值放入文件editor.putString(\"name\", “Tom”);editor.putInt(\"age\", 28);editor.putBoolean(\"marrid\",false);//步骤4:提交editor.commit();2)读取数据:SharedPreferences sharedPreferences= getSharedPreferences(\"data\", Context .MODE_PRIVATE);String userId=sharedPreferences.getString(\"name\",\"\");3)删除指定数据editor.remove(\"name\");editor.commit();4)清空数据editor.clear();editor.commit();
注意:如果在 Fragment 中使用SharedPreferences 时,需要放在onAttach(Activity activity)里面进行SharedPreferences的初始化,否则会报空指针 即 getActivity()会可能返回null !
读写其他应用的SharedPreferences 步骤如下(未实践):
1. 在创建SharedPreferences时,指定MODE_WORLD_READABLE模式,表明该SharedPreferences数据可以被其他程序读取;
2. 创建其他应用程序对应的Context;
3. 使用其他程序的Context获取对应的SharedPreferences;
4. 如果是写入数据,使用Editor接口即可,所有其他操作均和前面一致;
try {//这里的com.example.mpreferences 就是应用的包名Context mcontext = createPackageContext(\"com.example.mpreferences\", CONTEXT_IGNORE_SECURITY);SharedPreferences msharedpreferences = mcontext.getSharedPreferences(\"name_preference\", MODE_PRIVATE);int count = msharedpreferences.getInt(\"count\", 0);} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}
广播接收者案例_ip拨号器
不同版本广播的特点
4.0之后 没有运行过的应用是不能收到广播的
在应用管理器中 force stop(强制停止)的应用 收不到广播
无序广播
有序广播
如何区分有序广播 无序广播
动态注册广播接收者
四大组件只有广播接收者可以不在清单文件中注册
。