<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" android:name=".MyApplication"> <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
最关键的问题:Application的onCreate()方法才是整个Android程序的入口点,
Android系统自动会为每个程序运行时创建一个Application类的对象,且只创建一个,所以Application可以说是单例(singleton)模式的一个类。
通常我们是不需要指定一个Application的,系统会自动帮我们创建
如果需要创建自己的Application,那也很简单!
创建一个类继承Application并在AndroidManifest.xml文件中的application标签中进行注册(只需要给application标签增加name属性,并添加自己的 Application的名字即可)。
启动Application时,系统会创建一个PID,即进程ID,所有的Activity都会在此进程上运行。那么我们在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局变量的值,换句话说,我们在某一个Activity中改变了这些全局变量的值,那么在同一个应用的其他Activity中值就会改变。
Application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以可以通过Application来进行一些,如:数据传递、数据共享和数据缓存等操作。Android系统自动会为每个程序运行时创建一个Application类的对象,且只创建一个,所以Application可以说是单例(singleton)模式的一个类。
package com.example.mytry; import android.app.Application; /** * Created by tingting.liu on 2017/10/31. */ public class MyApplication extends Application { private String value; @Override public void onCreate() { super.onCreate(); } public void setValue(String value){ this.value =value; } public String getValue(){return value;} }
这是常见的最简单的application的应用
我们谈到Application对象是全局的,单例的,既然是单例应该有一个类方法能让我们获得这个单例对象才是,但Application本身没有,我们只能在自定义的时候想办法。
Application是系统的一个组件,也就有自己的生命周期函数,让人感到意外的是他的生命周期函数中居然也有onCreate(),onCreate是被自动调用的,我们可以利用这点来获得这个Application对象。
在AppContext中加入如下几行代码:
public static AppContext getInstance(){
return instance;
}
@Override
public void onCreate(){
super.onCreate();
instance =this;
}
这样我们就能在app工程的任何地方通过AppContext.getInstance()来获得Application全局对象。比如我定义了一个工具类,在工具内中我们需要使用
Context的getExternalFilesDir()方法。但是这个工具类没有直接的办法获取到context,于是我们可以
return AppContext.getInstance().getExternalFilesDir(null);