Android学习之Application类

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值