6.3 利用应用环境的全局数据共享

既然外存储设备的读写效率低下,那么寻找全局共享内存区域来进行组件间的数据共享和传输,就成为可以有效提高效率的策略。

应用环境组件android.app.Application [1],就是可以用在同进程中各个组件对象间共享数据的对象。Application对象,会在应用进程被构造之时创建出来,直至这个进程被最终销毁,它贯穿了整个进程的生命周期,因此,可作为全局共享的内存区域来存储数据。

6.3.1 利用应用环境对象共享数据的实现

在实现中,开发者需要派生Application类实现应用自定义的应用环境类,在其中维护全局数据的读取和写入。各个组件对象可以通过给定的接口获取并操作这些数据。

再列举一个示例,继续之前的场景:在邮件应用中维护最近联系人列表。使用应用环境对象,可以减少读取和写入的次数(仅需要在整个进程被构造时进行读取),提升效率,简化流程:


public class MyApplication extends Application{

private String[]recentContacts;

public void onCreate(){

//从文件中读取最近联系人,也可以延迟到第一次使用时进行

recentContacts=readContactsFromFile();

}

//读取接口

public String[]getRecentContacts(){

return recentContacts;

}

//更新接口

public void updateRecentContacts(String contact){

…//更新recentContacts对象

//写入到文件中

saveContactsIntoFile();

}

}


小贴士 在应用环境组件的实现中,需要特别关注数据的写入时机。由于系统再次强行回收进程时,不会通知应用环境对象,因此,不能依赖Application.onTerminate函数进行数据的写入。如果数据的修改不是很频繁,就可以和示例中的updateRecentContacts函数一样,在修改后立刻写入,以确保数据的安全;但如果数据修改比较频繁,通常就会将写入数据的职责交给修改数据的组件对象,它可以选择合适的时机(比如Acitivity.onPause函数被调用时),主动调用写入数据的函数(示例中的saveContactsIntoFile函数),批量地写入修改,以提高性能。

各个组件都可通过不同的接口来获得该进程的应用环境对象,然后调用它的函数,并使用其中的对象。比如:


//在Activity中,可以使用getApplication函数得到应用环境对象

Application application=getApplication();

//读取最近联系人的数据

if(application instanceof MyApplication){

String[]contacts=((MyApplication)application)

.getRecentContacts();

}


[1]关于应用环境组件Application的详细介绍,可以参见第5章的相关内容。