Android学习笔记——Application类
最近在看Android源码,发现很多书上所讲的内容在Android源码中都有提及,并且更为详细,因此简单做个学习笔记方便日后复习查看。
之前学习时看到过Application类,但对于它的用途一直没理解。看了遍源码并且写了一个简单的demo来学习下。
Android源码中注释对于Application类的解释如下:
Base class for those who need to maintain global application state. You can provide your own implementation by specifying its name in your AndroidManifest.xml’s application; tag, which will cause that class to be instantiated for you when the process for your application/package is created.
There is normally no need to subclass Application. In most situation, static singletons can provide the same functionality in a more modular way. If your singleton needs a global context (for example to register broadcast receivers), the function to retrieve it can be given a android.content.Context which internally uses android.content.Context#getApplicationContext() Context.getApplicationContext() when first constructing the singleton.
简单翻译下:Application类是维护程序状态的基类。使用扩展的Application类时需要在AndroidManifes.xml文件的application节点处声明,以便在程序运行时扩展的Application可以被实例化。
通常情况下是不需要去继承Application类的。Application类主要的应用是利用单例来提供全局变量。(举了一个广播的例子)
Application类的方法主要有四个:
onCreate方法:此方法是程序运行的真正入口,在程序开始运行后被调用,该调用发生在Activity、Service和Receiver(不包括Content Providers)组件之前。在覆盖此方法时要注意不要做过多的操作,否则会造成程序启动缓慢,还要注意调用父类的方法。可以在此方法内实现程序单例和资源的实例化。
onConfigurationChanged方法:此方法在配置发生改变时调用,是ComponentCallbacks接口要求实现的方法。但与Activity中的方法不同,配置改变时Application不会被重启。
onLowMemory方法:此方法是设备在较低的内存状态下运行时才会调用,主要是要求程序释放部分不需要的内存来降低设备的运行压力,也是ComponentCallbacks接口要求实现的方法。
onTrimMemory方法:此方法在API14及更高的版本中才可以使用。是onLowMemory的替代方法,需要传入level参数,level参数总共7个,表明了程序所处的状态。是ComponentCallbacks2接口要求实现的方法。
Application全局变量demo:
先写MyApplication类
public class MyApplication extends Application {
private static MyApplication myApplication;
private String value;
@Override
public void onCreate() {
super.onCreate();
myApplication = this; // 获取实例
value = null;
}
// get方法
public static MyApplication getMyApplication() {
return myApplication;
}
// set方法
public boolean SetValue(String value) {
this.value = value;
return true;
}
public String GetValue() {
return value;
}
}
然后是两个Activity类
public class Activity1 extends Activity {
private Button button;
private MyApplication myApplication;
private String value;
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity1);
editText = (EditText) this.findViewById(R.id.editText);
button = (Button) this.findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 利用Application设置全局变量值
myApplication = MyApplication.getMyApplication();
value = editText.getText().toString();
myApplication.SetValue(value);
// 跳转到其他Activity
Intent intent = new Intent();
intent.setClass(Activity1.this, Activity2.class);
startActivity(intent);
}
});
}
}
public class Activity2 extends Activity {
private TextView textView;
private MyApplication myApplication;
private String value;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity2);
textView = (TextView) this.findViewById(R.id.textView);
myApplication = MyApplication.getMyApplication();// 利用Application类获取全局变量
value = myApplication.GetValue();
textView.setText(value);
}
}
主要实现在Activity1中,在全局变量value中存入字符串,然后在Activity2中读取此全局变量并且将其展示在TextView中。相比于用传统的Intent传递数据,这种方法在进行较多的数据传递时更为容易,并且不必考虑上下文。
之前看到有人说还可以用来作为缓存,但是要注意及时清除,否则可能造成内存泄漏。还有看到用来完全退出所有Activity,即利用一个LinkedList将所有打开的Activity记录下来,在退出方法中依次finish,也可以在各自的Activity中调用finish方法。
测试图如下:
布局文件很简单就不贴了,Activity1有一个Button用来跳转,一个EditText用来输入值,Activity2有一个TextView用来显示value。