Android之Application的使用

  1. Application是维护全局状态的基类,Android系统会在启动应用进程时创建一个Application对象。application里面的对象变量是属于整个系统的。
  2. 在启动程序时会创建application对象,所以Application对象诞生于其他任何组件对象之前,并且一直存活,直到应用进程结束。
  3. 默认情况下系统会为每个应用分配一个进程,进程的名称就是每个项目的包名,当进程启动的时候,系统会创建application对象,并调用对象的onCreate函数。
  4. application在项目运行过程中不会改变,而activity在切换过程中,会有不断的创建和销毁,服务切换也是创建和销毁,但是application不会改变
  5. Application对象由Android系统管理,其回调函数都运行于UI线程即主线程,
    回调函数有onCreate,onConfigurationChanged即系统配置变更,包括屏幕方向变化,系统语言变化等,onLowMemory释放内存
  6. application对象全局可访问,且全程陪同应用进程,适合共享全局状态,初始化全应用所需的服务。
  7. 静态单例也可以实现全局状态的共享

自定义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

猜你喜欢

转载自blog.csdn.net/ayangann915/article/details/80601150