大家都知道每一个Android程序都要配置一个application,今天我们就来了解一下application的这层神秘的面纱吧。

  1. 什么是Application
  2. Application的生命周期
  3. Application的配置
  4. Application的实战应用
    一、什么是Application
Application和Activity,Service一样,是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己 的Application,也很简单创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个name属性把自己的 Application的名字定入即可)。


    android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (singleton)模式的一个类.且application对象的 生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局 的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以通过Application来进行一些,数据传递,数据共享 等,数据缓存等操作。

二、Application的生命周期

onCreate 在创建应用程序时创建


onTerminate 当终止应用程序对象时调用,不保证一定被调用,当程序是被内核终止以便为其他应用程序释放资源,那么将不会提醒,并且不调用应用程序的对象的onTerminate方法而直接终止进程


onLowMemory 当后台程序已经终止资源还匮乏时会调用这个方法。好的应用程序一般会在这个方法里面释放一些不必要的资源来应付当后台程序已经终止,前台应用程序内存还不够时的情况。


onConfigurationChanged 配置改变时触发这个方法

三、Application的配置

Application的配置很简单,首先我们要创建一个属于自己的application这个类,然后让其继承Application。最后要在清单文件中声明自己新建的application即可。
清单文件中的配置<application android:name=".application.MyAppliaction">

四、Application的实战应用

通常我们配置在application里边的东西都是整个应用程序全局需要用到的,一般都是activity的配置,比如页面跳转,销毁等。
 这里我们看看在实际开发中APPlication如何配置的:
package ledon.com.retrofitdemo.application;

import android.app.Activity;
import android.app.Application;
import android.content.Intent;
import android.os.Bundle;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Created by Administrator on 2017/3/16.
 */

public class MyAppliaction extends Application {
    //存放activity的集合
    private List<Activity> activities;
    //页面切换传递数据的集合
    private Map<String,Object> transmitDataMap;
    /**
     * 利用单例模式获取application
     */

    private static MyAppliaction appliaction=null;
    public static synchronized  MyAppliaction getMyAppliaction(){
        return  appliaction;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        appliaction=this;
        activities=new ArrayList<Activity>();
        transmitDataMap=new HashMap<String, Object>();
    }
    /** 添加activity */
    public void addActivity(Activity activity) {
        if (!hasActivity(activity)) {
            activities.add(activity);
        }
    }

    /** 判断对应activity是否存在 */
    private boolean hasActivity(Activity activity) {

        for (int i = 0; i < activities.size(); i++) {
            Activity a = activities.get(i);
            if (a == activity) {
                return true;
            }
        }
        return false;
    }

    /** 移除对应activity */
    public void removeActivity(Activity activity) {
        if (hasActivity(activity)) {
            activities.remove(activity);
        }
    }

    /** 清除所有activity */
    public void clearActivity() {
        activities.clear();
    }

    /** 销毁当前activity */
    public void destroyActivity(Activity a) {
        removeActivity(a);
        a.finish();
    }

    /** 界面销毁 (1)关闭所有activity */
    public void finishAll() {
        if (activities.size() > 0) {
            for (Activity activity : activities) {
                if (!activity.isFinishing()) {
                    activity.finish();
                }
            }
            clearActivity();
        }
    }

    /** 界面销毁 (2)退出整个程序 */
    public void exit() {
        // wipeMapData();
        // finishAll();
        // 杀死了整个进程
        System.exit(0);
    }

    /**
     * activityPageChange 页面(Activity)切换 TransmitData 传递数据 (包含基本类型数据和非基本类型数据,
     * 非基本类型数据通过传递过去的key值到transmitDataMap中去取 )
     *
     * @param a
     *            当前Activity
     * @param c
     *            要跳转的class
     * @param map
     *            传输数据的键值对 没有时为null
     * @param flags
     *            为要跳转的页面设置的flags 没有时为-1
     * @param isForResult
     *            跳转对应页面时是调用startActivity()还是调用startActivityForResult()
     *            默认时为false,调用startActivity(),此时下一个参数requestCode无效
     * @param requestCode
     *            跳转页面调用startActivityForResult() 对应的请求码
     * @param b
     *            是否关闭当前页面 为true时关闭,false时保留
     */
    public void activityPageChange(Activity a, Class<?> c,
                                   Map<String, Object> map, int flags, boolean isForResult,
                                   int requestCode, boolean b) {
        if (a == null || c == null) {
            return;
        }

        Intent intent = new Intent(a, c);
        Bundle bundle = null;

        if (map != null && map.size() > 0) {
            bundle = new Bundle();
            Set<String> keySet = map.keySet();
            for (String i : keySet) {
                Object o = map.get(i);

                if (o instanceof Integer) {
                    bundle.putInt(i, (Integer) o);
                } else if (o instanceof Double) {
                    bundle.putDouble(i, (Double) o);
                } else if (o instanceof Boolean) {
                    bundle.putBoolean(i, (Boolean) o);
                } else if (o instanceof String) {
                    bundle.putString(i, (String) o);
                } else {// 非基本数据类型
                    saveMapData(i, o);
                    bundle.putString(i, i);
                }

            }

        }

        if (flags != -1) {
            intent.setFlags(flags);
        }

        if (bundle != null) {
            intent.putExtras(bundle);
        }

        if (!isForResult) {
            a.startActivity(intent);
        } else {
            a.startActivityForResult(intent, requestCode);
        }

        if (b) {
            destroyActivity(a);
        }
    }

    /**
     * transmitDataMap存储非基本类型数据
     *
     * @param key
     * @param value
     */
    private void saveMapData(String key, Object value) {
        transmitDataMap.put(key, value);
    }

    /**
     * transmitDataMap获取非基本类型数据
     *
     * @param key
     * @return
     */
    public Object getMapData(String key) {
        return transmitDataMap.get(key);
    }

    /**
     * transmitDataMap清空数据 应当在退出app时调用
     */
    private void wipeMapData() {
        if (transmitDataMap.size() > 0) {
            transmitDataMap.clear();
        }
    }
}

到这里我们的Application配置已经完成了,搭建页面的第一步也已经成功的完成了。我会在下一篇文章中来继续介绍Application如何应用的和我们的基类BaseActivity。