第5章 全局大喇叭,详解广播机制
在一个IP范围是192.168.0.XXX,子网掩码是255.255.255.0,那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一网络上的所有端口。这样在该网络中的每台主机都将会收到这条广播。
Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容,这些广播可能是来自于系统,也有可能来自于其他应用程序的。
Android中的广播主要分为两种类型,标准广播和有序广播。
标准广播是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接受到这条广播信息,因此它们之间没有任何先后顺序可言。这条广播的效率会比较高,但同时也意味着它是无法被截断的。
有序广播则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够接收到这条广播信息。优先级高的广播接收器就可以先收到这条广播信息,并且前面你的广播接收器还可以截断正在传递的广播。
5.2 动态注册监听网络变化
为了能够简单地解决广播的安全性问题,Android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器只能接受来自本应用程序发出的广播。
本地广播是无法通过静态注册的方法来接受的。因为静态注册主要就是为了让程序在未启动的情况下也能接受到广播,而发送本地广播时,我们的程序是已经启动了,因此也完全不需要使用静态注册的功能。
本地广播的几点优势
1、可以明确知道正在发送的广播不会离开我们的程序,因此不需要担心机密数据泄漏的问题。
2、其他程序无法将广播发送到我们程序的内部,因此不需要担心会有安全漏洞的隐患。
3、发送本地广播比起发送系统全局广播将会更加高效。
第六章 数据存储全方法、详解持久化技术
6.1 持久化技术简介
数据持久化就是指那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍谈不会丢失。保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是处于持久状态的,持久化技术则是提供了一种机制可以让数据在瞬时状态和持久状态之间进行转换。
Android系统主要提供了三种方式用于简单地实现数据持久化功能,即文件存储,Sharedpreference存储以及数据库存储,网络存储。
6.2文件存储
文件存储是Android中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理。所有数据都是原封不动地保存到文件当中的,因而它比较适合用于存储一些简单的文本数据或二进制数据。
6.2.1 将数据存储到文件中
Context类中提供了openFileOutput()方法,可以用于将数据存储到指定的文件夹中。这个方法可以接受两个参数,第一个参数是文件名,第二个参数是文件的操作模式。
这里通过openFileOutput()方法能够得到一个FileOutputStream 对象,然后再借助它构建出一个OutputStreamWriter对象,接着再使用OutputStreamWriter构建出一个BufferedWriter对象,接着再使用OutputStreamWriter构建出一个BufferWriter对象,这样你就可以通过BufferedWriter来将文本内容写入到文件夹中了。
代码在对字符串进行非空判断的时候使用了TextUtis.isEmpty()方法。这是一个非常好用的方法,它可以一次性对两种空值的判断。当传入的字符串等于null或者等于空字符串的时候,这个方法都会返回true。
6.3 sharedPreferences 存储
1、Context 类中getSharedPreferences()方法
第一个参数用于指定SharedPreference文件的名称,如果指定的文件不存在,则会创建一个,sharedPreferences文件都是存放在/data/data/<packagename>/shared_prefs/目录下。第二个参数用于指定操作模式,主要有两种模式可以选择,和直接传入0效果是相同的。表示只有当前的应用程序才可以对这个SharedPreferences文件进行读写。
2、Activity 类中getPreference()方法
这个方法和Context类中的getSharedPreferences方法很相似,不过它只接受一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为sharedPreferences的文件名。
3、PreferenceManager类中的getDefaultSharedPreference()方法
这是一个静态方法,它接受一个Context参数,并自动使用当前应用程序的报名作为前缀来命名SharedPreferences文件。
得到SharedPreferences对象之后,就可以开始向SharedPreferences文件中存储数据了,主要分三步实现:
1、调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。
2、向SharedPreferences.Editor对象中添加数据,比如 ,putboolean ,putString()
3、调用commit()方法将添加的数据提交,从而完成数据存储操作。
6.4 创建数据库
SQLiteOpenhelper有两个非常重要的实例方法,getReadableDatabase()和getWritableDatabase()。这个两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满)getReadabelDatabase()方法返回的对象以只读的方法去打开数据库,而getWritableDatabase()则将出现异常。
SQLiteOpener中有两个构造方法可供重写。
第一个参数是context,第二参数是数据库名,创建数据库时使用的就是这里指定的名称。第三个参数允许我们在查询数据的时候返回一个自定义的curosr,一般都是传入null。第四个参数表示当前数据库的版本号,可用于对数据库进行升级操作。
6.4.3 添加数据
我们对数据进行的操作也就无非四种,即CRUD,其中C代表添加(Create ),R代表查询(Rerieve),U代表更新(Update),D代表删除(Delete)。