- Application是维护全局状态的基类,Android系统会在启动应用进程时创建一个Application对象。application里面的对象变量是属于整个系统的。
- 在启动程序时会创建application对象,所以Application对象诞生于其他任何组件对象之前,并且一直存活,直到应用进程结束。
- 默认情况下系统会为每个应用分配一个进程,进程的名称就是每个项目的包名,当进程启动的时候,系统会创建application对象,并调用对象的onCreate函数。
- application在项目运行过程中不会改变,而activity在切换过程中,会有不断的创建和销毁,服务切换也是创建和销毁,但是application不会改变
- Application对象由Android系统管理,其回调函数都运行于UI线程即主线程,
回调函数有onCreate,onConfigurationChanged即系统配置变更,包括屏幕方向变化,系统语言变化等,onLowMemory释放内存 - application对象全局可访问,且全程陪同应用进程,适合共享全局状态,初始化全应用所需的服务。
- 静态单例也可以实现全局状态的共享
自定义application类
继承Application类,并在AndroidManifest.xml文件中的application下添加name属性,加上自定义的application类。
接下来以一个实例来展示application类的全局应用状态。
两张图片分别对应两个Activity,MyApplication类是Application类的子类,在MyApplication类中声明name变量,为其设置set和get方法。在Activity1和Activity2中获取MyApplication的变量,并在Activity1中设置name变量。
下面是MyApplication的实现:
public class MyApplication extends Application {
public static String name="ann";
public static String getName() {
return name;
}
public static void setName(String name) {
MyApplication.name = name;
}
//Application的创建,第一个创建,比Activity中的onCreate方法调用还要早
@Override
public void onCreate() {
super.onCreate();
Toast.makeText(this, "application_onCreate"+this, Toast.LENGTH_SHORT).show();
}
//监听系统变化的方法,如屏幕旋转,语言更改
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
//回收内存
@Override
public void onLowMemory() {
super.onLowMemory();
}
}
Activity1的实现:
public class Activity1 extends AppCompatActivity implements View.OnClickListener{
private Button setname,getname,startActivity;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setname=(Button)findViewById(R.id.setusername);
getname=(Button)findViewById(R.id.getusername);
startActivity=(Button)findViewById(R.id.startactivity);
setname.setOnClickListener(this);
getname.setOnClickListener(this);
startActivity.setOnClickListener(this);
}
//当从Activity2跳转到Activity1时会调用这个方法,即Activity1恢复
@Override
protected void onResume() {
super.onResume();
Toast.makeText(this, "Activity1"+getApplication(), Toast.LENGTH_SHORT).show();
}
//Activity1到activity2时,Activity1暂停状态
@Override
protected void onPause() {
super.onPause();
Toast.makeText(this, "Activity2"+getApplication(), Toast.LENGTH_SHORT).show();
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.getusername:
//获取application里变量的用法,注意强制类型转换,而且在AndroidManifest文件中一定要添加name属性,否则运行失败
MyApplication myApplication=(MyApplication)getApplication();
//设置name之前获取的是原来的name,设置之后则获取之后的name
String name=myApplication.getName();
Toast.makeText(this, "getname--"+name, Toast.LENGTH_SHORT).show();
break;
case R.id.setusername:
MyApplication myApplication1=(MyApplication)getApplication();
myApplication1.setName("zhangsan");
Toast.makeText(this, "setname"+myApplication1.getName(), Toast.LENGTH_SHORT).show();
break;
case R.id.startactivity:
startActivity(new Intent(Activity1.this,Activity2.class));
break;
}
}
}
Activity2的实现:
public class Activity2 extends AppCompatActivity {
private Button getname;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
getname=(Button)findViewById(R.id.getusername2);
getname.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyApplication myApplication=(MyApplication)getApplication();
String name=myApplication.getName();
//获取的name和Activity1中获取的name相同,说明application的对象是属于全局的。
Toast.makeText(Activity2.this, "getname:"+name, Toast.LENGTH_SHORT).show();
}
});
}
@Override
protected void onResume() {
super.onResume();
Toast.makeText(this, "Activity2-"+getApplication(), Toast.LENGTH_SHORT).show();
}
@Override
protected void onPause() {
super.onPause();
Toast.makeText(this, "Activity2-"+getApplication(), Toast.LENGTH_SHORT).show();
}
}
最后附上别人的Application笔记:
https://blog.csdn.net/pi9nc/article/details/11200969