每次运行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 }