有的没的
Application和activity、service、一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个application对象,用来存储系统的一些信息。Android系统会自动为每个程序运行时创建一个Application类的对象且只创建一个,所以说Application是单例模式的一个类。
通常我们不需要指定一个Application的,系统会自动帮我们创建,如果需要创建自己的Application,只需要创建一个类继承Application并在AndroidMainfest.xml文件中的application标签中进行注册(只需要给application标签增加name属性,并添加自己的Application名字即可)。
启动Application时,系统会创建一个PID,即进程ID,所有的Activity都会在此进程上运行,那么我们在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局变量的值,同样,如果某一个Activity中改变了这些全局变量的值,那么在同一个应用中的其他activity中获取到的值也会改变。
这种全局变量方法相对静态类更有保障,直到应用的所有的Activity全部被destory掉才会被释放掉。可以通过Application进行数据传递、数据共享、数据缓存等操作。
Application生命周期
@Override
public void onCreate() {
//程序创建时执行
super.onCreate();
Log.e("infor","onCreate方法");
}
@Override
public void onTrimMemory(int level) {
//程序在内存清理时执行
super.onTrimMemory(level);
Log.e("infor","onTrimMemory方法");
}
@Override
public void onLowMemory() {
//低内存时执行
super.onLowMemory();
Log.e("infor","onLowMemory方法");
}
@Override
public void onTerminate() {
//程序终止时执行
super.onTerminate();
Log.e("infor","onTerminate方法");
}
打开Activity
12-26 10:51:43.382 19766-19766/com.example.xfqlu.activity E/infor: onCreate方法
12-26 10:51:43.383 19766-19766/com.example.xfqlu.activity E/infor: onTrimMemory方法
12-26 10:51:43.435 19766-19766/com.example.xfqlu.activity E/infor: onStart方法
12-26 10:51:43.437 19766-19766/com.example.xfqlu.activity E/infor: onResume方法
12-26 10:51:43.448 19766-19766/com.example.xfqlu.activity E/infor: onTrimMemory方法
HOME键退出应用程序
12-26 10:52:30.072 19766-19766/com.example.xfqlu.activity E/infor: onPause方法
12-26 10:52:30.472 19766-19766/com.example.xfqlu.activity E/infor: onStop方法
12-26 10:52:30.479 19766-19766/com.example.xfqlu.activity E/infor: onTrimMemory方法
重新打开应用程序
12-26 10:54:33.446 22189-22189/com.example.xfqlu.activity E/infor: onRestart方法
12-26 10:54:33.446 22189-22189/com.example.xfqlu.activity E/infor: onStart方法
12-26 10:54:33.447 22189-22189/com.example.xfqlu.activity E/infor: onResume方法
长按MENU键,打开Recent TASK
12-26 10:55:36.051 22189-22189/com.example.xfqlu.activity E/infor: onPause方法
12-26 10:55:36.078 22189-22189/com.example.xfqlu.activity E/infor: onStop方法
12-26 10:55:36.079 22189-22189/com.example.xfqlu.activity E/infor: onTrimMemory方法
彻底关闭应用程序
12-26 10:57:58.111
24771-24771/com.example.xfqlu.activity E/infor: onDestroy方法
Application实现数据共享
1.继承Application
public class TestApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
}
private int index = 888;
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
2.在AndroidMainfest.xml文件中配置自定义的Application
android:name=".TestApplication"
3.在activity中调用并修改,控制台输出index的值为888,将index的值改为999后在另一个activity中调用
private TestApplication app;
private int index;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("eee","第一个被创建");
app = (TestApplication) this.getApplication();
index = app.getIndex();
Log.e("第一个输出index:", String.valueOf(index));
app.setIndex(999);
4.在SecondActivity中调用后,控制台输出index的值为修改后的999
private TestApplication app;
private int index;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
app = (TestApplication) this.getApplication();
Log.e("eee:","跳转到第二个界面");
index = app.getIndex();
Log.e("第二个界面的输出:", String.valueOf(index));
Application实现数据传递
使用Intent和Bundle所能携带的数据类型都是一些基本的数据类型,如果想要实现复杂的数据传递比较麻烦,通常要实现Serializable或者Parcellable接口,这其实是Android的一种IPC数据传递方法,如果两个Activity在同一个进程中就不需要这么麻烦,只要将对象的引用传递过去即可。
基本思路:在Application中创建一个HashMap,以字符串为Key,Object为value,这样HashMap就可以存储任何类型的对象,在Activity-A中把需要传递的对象放入这个HashMap,然后通过Intent或者其他途径再把这个Key传递给Activity-B,Activity-B就可以根据这个字符串在HashMap中取出这个对象了。
1.在Application中定义HashMap
private HashMap map = new HashMap<>();
public HashMap getMap() {
return map;
}
public void setMap(HashMap map) {
this.map = map;
}
2.在Activity-A中将数据通过setMap()传递到Application中
map.put("first","来自第一个activity的数据");
map.put("int",555);
app.setMap(map);
3.在Activity-B中通过getMap()得到HashMap,再通过指定Key值得到指定的value值
String dd = (String) app.getMap().get("first");
int ddd = (int) app.getMap().get("int");
Application实现数据缓存
当有一个Activity需要从网站上获取一些数据的时候,获取完之后我们就可以把这个数据先存到Application中,当页面跳转到其他Activity再回来的时候,就可以直接使用缓存好的数据了,但如果需要缓存一些大量的数据,最好是缓存一些软引用,并把这些数据缓存到本地Rom或者SDcard上,如果在Application中的缓存不存在,从本地缓存查找,如果本地缓存的数据也不存在,再从网络上获取。