Android中Application类用法

Application类


Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个Application对象,用来存储系统的一些信息。


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类来实现应用程序级的全局变量,这种全局变量方法相对静态类更有保障,直到应用的所有Activity全部被destory掉之后才会被释放掉。



实现步骤:


1、继承Application


public class CustomApplication extends Application
{
    private static final String VALUE = "Harvey";
    
    private String value;
    
    @Override
    public void onCreate()
    {
        super.onCreate();
        setValue(VALUE); // 初始化全局变量
    }
    
    public void setValue(String value)
    {
        this.value = value;
    }
    
    public String getValue()
    {
        return value;
    }
}
注:继承Application类,主要重写里面的onCreate()方法(android.app.Application包的onCreate()才是真正的Android程序的入口点),就是创建的时候,初始化变量的值。然后在整个应用中的各个文件中就可以对该变量进行操作了。


2、在ApplicationManifest.xml文件中配置自定义的Application

<application
        android:name="CustomApplication">
</application>
实例代码:

CustomApplication.java


/**
 * 继承Application
 * 
 * @author admin
 * 
 */
public class CustomApplication extends Application
{
    private static final String VALUE = "Harvey";
    
    private String value;
    
    @Override
    public void onCreate()
    {
        super.onCreate();
        setValue(VALUE); // 初始化全局变量
    }
    
    public void setValue(String value)
    {
        this.value = value;
    }
    
    public String getValue()
    {
        return value;
    }
}

FirstActivity.java


public class FirstActivity extends Activity
{
    private CustomApplication app;
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        app = (CustomApplication) getApplication(); // 获得CustomApplication对象
        
        Log.i("FirstActivity", "初始值=====" + app.getValue()); // 获取进程中的全局变量值,看是否是初始化值
        
        app.setValue("Harvey Ren"); // 重新设置值
        
        Log.i("FirstActivity", "修改后=====" + app.getValue()); // 再次获取进程中的全局变量值,看是否被修改
        
        Intent intent = new Intent();
        intent.setClass(this, SecondActivity.class);
        startActivity(intent);
    }
}

注:只需要调用Context的 getApplicationContext或者Activity的getApplication方法来获得一个Application对象,然后再得到相应的成员变量即可。它是代表我们的应用程序的类,使用它可以获得当前应用的主题和资源文件中的内容等,这个类更灵活的一个特性就是可以被我们继承,来添加我们自己的全局属性。


SecondActivity.java


public class SecondActivity extends Activity
{
    private CustomApplication app;
    
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        app = (CustomApplication) getApplication(); // 获取应用程序


       Log.i("SecondActivity", "当前值=====" + app.getValue()); // 获取全局值
    }
}



AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.test"
    android:versionCode="1"
    android:versionName="1.0">
    <uses-sdk
        android:minSdkVersion="8" />


    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:name="CustomApplication">
        <!-- 将我们以前一直用的默认Application设置成自定义的CustomApplication -->
        <activity
            android:name=".FirstActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action
                    android:name="android.intent.action.MAIN" />
                <category
                    android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


        <activity
            android:name=".SecondActivity"
            android:label="@string/app_name">
        </activity>
    </application>

</manifest>


当然也可以不用在xml中声明,而是自己单独建立一个Myappliction用来全局存储数据和更新数据


public class MyApplication extends Application {

   private static MyApplication mApplication;
   private Account account;

   public List<Theme> themeList;
   public List<Friend> friendList;

   private List<FriendEvent> friendEventList;
   private ThemeDB themeDB;
   private ElementDB elementDB;
   private FriendDB friendDB;
   private FriendEventDB friendEventDB;
   private AccountDB accountDB;
   private List<Element> tmpElementList; //选择元素组成的临时元素数组,用来游戏或制作分享  private List<ServerDataInfo> serverDataList_latest;
   private List<ServerDataInfo> serverDataList_downloadCount;
   private SoundPool soundPool;
   private Map<String, Integer> soundId;

   public static final int EVENT_TYPE_SCORE = 1;
   public static final int EVENT_TYPE_ELEMENT = 2;

   public List<Element> getTmpElementList() {
      return tmpElementList;
   }

   public void setTmpElementList(List<Element> elementList) {
      if (this.tmpElementList == null)
         this.tmpElementList = new ArrayList<Element>();
      this.tmpElementList.clear();
      this.tmpElementList.addAll(elementList);

   }
   //获取application对象  public static MyApplication getInstance() {
      if (mApplication == null) {
         mApplication = new MyApplication();
         return mApplication;
      }
      return mApplication;
   }

   @Override
   public void onCreate() {
      super.onCreate();
   }

   public void init(Context context) {
      soundPool = new SoundPool(1000, AudioManager.STREAM_MUSIC, 0);
      soundId = new HashMap<String, Integer>();
      PhoneInfo.getPhoneInfo(context);
      // CrashHandler.getInstance().init(context);  HeyYouDBHelper.PATH = Environment.getExternalStorageDirectory().getAbsolutePath();
      HeyYouDBHelper.FILE_PATH = HeyYouDBHelper.PATH + "/Heyyou";
      themeList = new ArrayList<Theme>();
      friendList = new ArrayList<Friend>();
      friendEventList = new ArrayList<FriendEvent>();
      //runnable初始化执行主要是将数据库的东西set进来  MyApplicationInit applicationInit = new MyApplicationInit(context);
      new Thread(applicationInit).start();
   }

   public void setThemeDB(ThemeDB themeDB) {
      this.themeDB = themeDB;
   }

   public void setElementDB(ElementDB elementDB) {
      this.elementDB = elementDB;
   }

   public void setFriendDB(FriendDB friendDB) {
      this.friendDB = friendDB;
   }

   public void setFriendEventDB(FriendEventDB friendEventDB) {
      this.friendEventDB = friendEventDB;
   }

   public void setAccountDB(AccountDB accountDB) {
      this.accountDB = accountDB;
   }

   public Account getAccount() {
      return account;
   }

   public void setAccount(Account account) {
      this.account = account;
   }

   public ThemeDB getThemeDB() {
      return themeDB;
   }

   public ElementDB getElementDB() {
      return elementDB;
   }

   public FriendDB getFriendDB() {
      return friendDB;
   }

   public FriendEventDB getFriendEventDB() {
      return friendEventDB;
   }

   public AccountDB getAccountDB() {
      return accountDB;
   }

   public List<ServerDataInfo> getServerDataList_downloadCount() {
      return serverDataList_downloadCount;
   }

   public void setServerDataList_downloadCount(List<ServerDataInfo> serverDataList_downloadCount) {
      if (this.serverDataList_downloadCount == null)
         this.serverDataList_downloadCount = new ArrayList<ServerDataInfo>();
      else  this.serverDataList_downloadCount.clear();
      this.serverDataList_downloadCount.addAll(serverDataList_downloadCount);
   }

   public List<ServerDataInfo> getServerDataList_latest() {
      return serverDataList_latest;
   }

   public void setServerDataList_latest(List<ServerDataInfo> serverDataList_latest) {
      if (this.serverDataList_latest == null)
         this.serverDataList_latest = new ArrayList<ServerDataInfo>();
      else  this.serverDataList_latest.clear();
      this.serverDataList_latest.addAll(serverDataList_latest);
   }

   public void setFriendsEventsList(List<FriendEvent> list) {
      if (this.friendEventList == null)
         friendEventList = new ArrayList<FriendEvent>();
      else  friendEventList.clear();
      friendEventList.addAll(list);
   }

   public List<FriendEvent> getFriendsEventsList() {
      return this.friendEventList;
   }

}
这个就没有在xnl里面声明,每次用的时候
MyApplication.getInstance().init(Title.this);就好了,
生成以后自己再用里面的变量就可以直接用
MyApplication.getInstance().themeList;来取出来了,
这个application还是自己默认的appliction,myappliction感觉是一个类存储信息的,
不知道我理解的对不对,望大牛发现问题,留言可以

你可能感兴趣的:(android)