每次运行APP时,Application类都保持实例化状态。与Activity不同,配置改变不会导致应用程序重启。通过继承Application类,可以完成一下3项工作:
· 对Android运行时广播的应用程序级事件做出相应。
· 在应用程序组件之间传递对象。
· 管理和维护多个应用程序组件使用的资源。
其中,后两项工作通过使用一个单态类能够更好地完成。Application的实现在本质上是单态的,并应作为单态实现,以便提供对其方法和成员变量的访问。
一、扩展和使用Application类
如下程序是扩展了Application类的框架代码,并把它实现为一个单态。
1 public class MyApplication extends Application {
2 private static MyApplication singleton;
3
4 public static MyApplication getInstance(){
5 return singleton;
6 }
7
8 @Override
9 public final void onCreate() {
10 super.onCreate();
11 singleton = this;
12 }
13 }
需要注意的是,在创建新的Application类后,需要在Manifest的application节点中注册它,如下所示:
1 <application
2 android:allowBackup="true"
3 android:name=".MyApplication"
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 </application>
当应用程序开始运行时,Application实现将会得到实例化。创建新的状态变量和全局资源,在程序中我们可以通过以下方式使用它:
1 MyApplication myApp = MyApplication.getInstance();//获取Application类实例化对象
2 myApp.setTest("测试数据");//更改状态变量
3 String test = myApp.getTest();//获取状态变量
我们知道,在Activity传递变量的方式有很多种,(如:Intent传参),但就像有些常用的状态变量(如:用户的userId),如果每次得通过Intent方式传来传去的话,很容易导致逻辑混乱,那么这时候我们就可以将这个常用的公共变量保存到Application类中,无论哪一个Activity需要用到它时,直接从Application类中获取即可,非常方便。下面以一个简单的例子来说明一下通过Application类达到共享变量的效果:
示例说明:创建两个Activity,用其中的一个Activity改变Application中的变量,然后在另一个Activity中验证此变量的改变。(例子很简单,能说明问题即可)先看一下效果图:
1、首先创建MyApplication去继承Application类
1 public class MyApplication extends Application {
2 private static MyApplication singleton;
3 private String test;
4 public static MyApplication getInstance(){
5 return singleton;
6 }
7 public String getTest() {
8 return test;
9 }
10 public void setTest(String test) {
11 this.test = test;
12 }
13 @Override
14 public final void onCreate() {
15 super.onCreate();
16 singleton = this;
17 }
18 }
以上代码,在MyApplication类中,包含了一个MyApplication的实例变量和一个测试变量。
2、在MainActivity中获取MyApplication的实例化对象,并且改变MyApplication中test变量的值。
1 public class MainActivity extends Activity {
2 private MyApplication myApp;
3 EditText etTest;
4 Button bnGo;
5 @Override
6 protected void onCreate(Bundle savedInstanceState) {
7 super.onCreate(savedInstanceState);
8 setContentView(R.layout.activity_main);
9 myApp = MyApplication.getInstance();//获取Application类实例化对象
10 etTest = (EditText)findViewById(R.id.et_test);//绑定控件
11 bnGo = (Button)findViewById(R.id.bn_go);//绑定控件
12 bnGo.setOnClickListener(new OnClickListener() {
13 @Override
14 public void onClick(View arg0) {
15 myApp.setTest(etTest.getText().toString());//改变MyApplication中test变量的值
16 Intent intent = new Intent(MainActivity.this, TestActivity.class);
17 startActivity(intent);
18 }
19 });
20 }
21 }
3、在TestActivity取出MyApplication中的test值并显示在TextView上。
1 public class TestActivity extends Activity {
2 private String test;
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6 setContentView(R.layout.activity_test);
7 TextView tvShow = (TextView)findViewById(R.id.tv_show);
8 test = MyApplication.getInstance().getTest();
9 tvShow.setText(test);
10 }
11 }
二、重写应用程序的生命周期事件
Application类为应用程序的创建和终止,低可用内存和配置改变提供了事件处理程序。
通过重写一下方法,可以为上述几种情况实现自己的应用程序行为:
· onCreate 创建应用程序时调用。可通过重写此方法来实例化应用程序的单态,以及创建和实例化任何应用程序的状态变量和共享资源。
· onLowMemory: 当系统处于资源匮乏状态是,具有良好行为的应用程序可以释放额外的内存。此方法一般只会在后台进程已经终止,但是前台应用程序仍然缺少内存是调用。可通过重写此方法来清空缓存或者释放不必要的资源。
· onTrimMemory:作为onLowMemory的一个特定于应用程序的替代选择,在Android 4.0(API level 13)中引入。
· onConfigurationChanged:在配置改变时,应用程序对象不会被终止和重启。如果应用程序使用到的值需要在配置改变时重新加载,则可以通过重写此方法实现。
以下是重写什么周期事件的代码(没有实现具体功能):
1 public class MyApplication extends Application {
2 private static MyApplication singleton;
3 public static MyApplication getInstance(){
4 return singleton;
5 }
6
7 @Override
8 public final void onCreate() {
9 super.onCreate();
10 singleton = this;
11 }
12
13 @Override
14 public final void onLowMemory() {
15 super.onLowMemory();
16 }
17
18 @Override
19 public void onTrimMemory(int level) {
20 //此方法在Android 4.0(API level 13)中引入,使用时请注意。
21 super.onTrimMemory(level);
22 }
23
24 @Override
25 public void onConfigurationChanged(Configuration newConfig) {
26 super.onConfigurationChanged(newConfig);
27 }
28 }