一、Application是什么
Application和Actovotu,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己 的Application,也很简单创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个name属性把自己的 Application的名字定入即可)。
android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局 的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以通过Application来进行一些,数据传递,数据共享 ,数据缓存等操作。
二、Application 配置全局Context
第一步、写一个全局的单例模式的MyApplication继承自Application 覆盖onCreate ,在这个方法里面实例化Application
第二步、配置全局的Context
<application Android:name="com.appstore.service.MyApplication" ></application>
第三步、使用,使用的时候用的时候根据类的名称访问Context
三、Android程序的入口点
其实在android.app.Application这个包的onCreate才是真正的Android入口点,只不过大多数开发者无需重写该类,他的继承关系如下图:
java.lang.Object
? android.content.Context
? android.content.ContextWrapper
? android.app.Application
android.app.Application类包含了4个公开的方法
void onConfigurationChanged(Configuration newConfig)
void onCreate() //这里才是真正的入口点。
void onLowMemory()
void onTerminate()
所以希望大家,记住真正的Android入口点是application的main,你可以看下androidmanifest.xml的包含关系就清楚了,并不是每个应用都必须有Activity的。
四、重写 Application 类的生命周期事件
onCreate()
在应用程序创建的时候被调用,可以实现这个这个方法来创建和实例化任何应用程序状态变量或共享资源。还可以在这个方法里面得到 Application 的单例。
public void onTerminate ()
当终止应用程序对象时调用,不保证一定被调用,当程序是被内核终止以便为其他应用程序释放资源,那么将不会提醒,并且不调用应用程序的对象的onTerminate方法而直接终止进程。
public void onLowMemory()
当系统资源匮乏的时候,我们可以在这里可以释放额外的内存, 这个方法一般只会在后台进程已经结束,但前台应用程序还是缺少内存时调用。可以重写这个方法来清空缓存或者释放不必要的资源。
public void onTrimMemory(int level)
当运行时决定当前应用程序应该减少其内存开销时(通常在进入后台运行的时候)调用,包含一个 level 参数,用于提供请求的上下文。
public void onConfigurationChanged (Configuration newConfig)
与 Activity 不同,配置改变时,应用程序对象不会被终止和重启。如果应用程序使用的值依赖于特定的配置,则重写这个方法来加载这些值,或者在应用程序级处理配置值的改变。
五、数据传递
有一个问题在于,Intent 和 Bundle 所能携带的数据类型都是一些基本的数据类型,如果想实现复杂的数据传递就比较麻烦了,通常需要实现 Serializable 或者 Parcellable 接口。这其实是Android的一种IPC数据传递的方法。如果我们的两个Activity在同一个进程当中为什么还要这么麻烦呢,只要把需要传递的对象的引用传递过去就可以了。
然后通过 Intent 或者其它途径再把这 key 传递给Activity B ,Activity B 就可以根据这个字符串在 HashMap 中取出这个对象了。只要再向下转型 ,就实现了对象的传递。
六、数据共享
定义两个Activity: MainActivity.java 和 MainActivity2.java, 代码是一样的
1 TextView tv;
2 EditText et;
3
4 @Override
5 protected void onCreate(Bundle savedInstanceState) {
6 super.onCreate(savedInstanceState);
7 //setContentView(R.layout.activity_main_activity2);
8 setContentView(R.layout.activity_main2);
9
10 tv = (TextView) findViewById(R.id.tv);
11 et = (EditText) findViewById(R.id.et);
12
13 tv.setText("共享数据:" + getApp().getTextData());
14
15 findViewById(R.id.btnTextData).setOnClickListener(new OnClickListener() {
16 @Override
17 public void onClick(View v) {
18 getApp().setTextData(et.getText().toString());
19 tv.setText("共享数据:" + et.getText().toString());
20 }
21 });
22 }
23
24 public App getApp() {
25 return ((App)getApplicationContext());
26 }
定义一个类App,集成Application
1 public class App extends Application {
2
3 private String textData = "default";
4
5 public void setTextData(String textData) {
6 this.textData = textData;
7 }
8 public String getTextData() {
9 return textData;
10 }
11 }
修改AndroidManifest.xml文件, 使用自定义的Application,两个Activity都是入口:
1 <application
2 android:name="com.carloz.learnapplication.App"
3 android:allowBackup="true"
4 android:icon="@drawable/ic_launcher"
5 android:label="@string/app_name"
6 android:theme="@style/AppTheme" >
7 <activity
8 android:name=".MainActivity"
9 android:label="@string/app_name" >
10 <intent-filter>
11 <action android:name="android.intent.action.MAIN" />
12
13 <category android:name="android.intent.category.LAUNCHER" />
14 </intent-filter>
15 </activity>
16 <activity
17 android:name="com.carloz.learnapplication.MainActivity2"
18 android:label="@string/title_activity_main_activity2" >
19 <intent-filter>
20 <action android:name="android.intent.action.MAIN" />
21
22 <category android:name="android.intent.category.LAUNCHER" />
23 </intent-filter>
24 </activity>
25 </application>
结果,在一个Activity修改App的数据,在另一个Activity都能获取到
七、数据缓存
在 Application 中建立两个 HashMap 一个用于数据的传递,一个用于缓存一些数据。比如有一个Activity需要从网站获取一些数据,获取完之后我们就可以把这个数据先存到Application 当中,当页面跳转到其它 Activity 再回来的时候,就可以直接使用缓存好的数据了。但如果需要cache一些大量的数据,最好是cache一些 (软引用)SoftReference ,并把这些数据cache到本地Rom 上或者 SDCard上。如果在 Application 中的缓存不存在,从本地缓存查找,如果本地缓存的数据也不存在再从网络上获取。