Application 组件设计

 
 

code小生,一个专注 Android 领域的技术平台

公众号回复 Android 加入我的安卓技术群

作者:血色王冠
链接:https://juejin.im/post/5cd5154951882535d137aee3
声明:本文来自
血色王冠投稿,转发等请联系原作者授权

为什么我要封装 application

application 在以前是非常重要的一个地方,刚开始开发时我们会在 application 中存储数据,提供全局公共方法,application 虽然很方便,但是渐渐的我们还是放弃了在 application 里面做其他的工作,现在 application 主要的应用场景是:

但是我在使用 application 时还是遇到了一些问题不好处理:

我想大家都曾为了上面的问题烦恼过吧,也许你已经解决了,也许你只是临时解决了,也许你还没解决。同样这也困扰过我,以前我只是临时解决,代码耦合难看,还没发适应越来越高的复用要求,一处该,处处动,这样的代码不是我想要的,早就该扫到垃圾箱里去了,于是诞生了今天的文章

我对 application 是这样安排的:

话说官方的 Lifecycle 刚出来时我是非常兴奋的,我想这下 app 的生命周期该好用了吧,兴奋的我一看官方压根就没动 application,只是把 Activity 的声明周期函数响应式化了,我是很失望的,也许 google 考虑兼容性吧


回顾下 ActivityLifecycleCallbacks

application 的核心就是这个了,一切的基础都是他在身上做的

public class Application extends ContextWrapper implements ComponentCallbacks2 {    private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks = new ArrayList<ActivityLifecycleCallbacks>();    public interface ActivityLifecycleCallbacks {        void onActivityCreated(Activity activity, Bundle savedInstanceState);        void onActivityStarted(Activity activity);        void onActivityResumed(Activity activity);        void onActivityPaused(Activity activity);        void onActivityStopped(Activity activity);        void onActivitySaveInstanceState(Activity activity, Bundle outState);        void onActivityDestroyed(Activity activity);    }}class Application extends ContextWrapper implements ComponentCallbacks2 {

    private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks = new ArrayList<ActivityLifecycleCallbacks>();

    public interface ActivityLifecycleCallbacks {
        void onActivityCreated(Activity activity, Bundle savedInstanceState);
        void onActivityStarted(Activity activity);
        void onActivityResumed(Activity activity);
        void onActivityPaused(Activity activity);
        void onActivityStopped(Activity activity);
        void onActivitySaveInstanceState(Activity activity, Bundle outState);
        void onActivityDestroyed(Activity activity);
    }
}

我们平时使用 ActivityLifecycleCallbacks 基本都是这个样子的

        this.registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {            override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {                Log.d("AA", "onActivityCreated")            }            override fun onActivityResumed(activity: Activity?) {                Log.d("AA", "onActivityResumed")            }            override fun onActivityStarted(activity: Activity?) {                Log.d("AA", "onActivityStarted")            }            override fun onActivityPaused(activity: Activity?) {                Log.d("AA", "AA")            }            override fun onActivityDestroyed(activity: Activity?) {                Log.d("AA", "onActivityDestroyed")            }            override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {                Log.d("AA", "onActivitySaveInstanceState")            }            override fun onActivityStopped(activity: Activity?) {                Log.d("AA", "onActivityStopped")            }        })

            override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
                Log.d("AA""onActivityCreated")
            }

            override fun onActivityResumed(activity: Activity?) {
                Log.d("AA""onActivityResumed")
            }

            override fun onActivityStarted(activity: Activity?) {
                Log.d("AA""onActivityStarted")
            }

            override fun onActivityPaused(activity: Activity?) {
                Log.d("AA""AA")
            }

            override fun onActivityDestroyed(activity: Activity?) {
                Log.d("AA""onActivityDestroyed")
            }

            override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
                Log.d("AA""onActivitySaveInstanceState")
            }

            override fun onActivityStopped(activity: Activity?) {
                Log.d("AA""onActivityStopped")
            }
        })

跟进源码看看

    public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {        synchronized (mActivityLifecycleCallbacks) {            mActivityLifecycleCallbacks.add(callback);        }    }
        synchronized (mActivityLifecycleCallbacks) {
            mActivityLifecycleCallbacks.add(callback);
        }
    }

注意看是 add 方法,这说明啥,这说明 ActivityLifecycleCallbacks 我们可以添加多个,Activity 会在相应的生命周期函数中发射相关消息

    protected void onCreate(@Nullable Bundle savedInstanceState) {        getApplication().dispatchActivityCreated(this, savedInstanceState);}    void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) {        Object[] callbacks = collectActivityLifecycleCallbacks();        if (callbacks != null) {            for (int i=0; i<callbacks.length; i++) {                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,                        savedInstanceState);            }        }    }
        getApplication().dispatchActivityCreated(this, savedInstanceState);
}

    void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) {
        Object[] callbacks = collectActivityLifecycleCallbacks();
        if (callbacks != null) {
            for (int i=0; i<callbacks.length; i++) {
                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
                        savedInstanceState);
            }
        }
    }

我们添加 2个 ActivityLifecycleCallbacks  进去

640?wx_fmt=png

事实证明,的确可以添加多个回调,并且没有问题,这也是我们自己封装 application 组件的基石


类结构

我就不画 UML 类图,因为很简单

640?wx_fmt=png

考虑到我要在 application 组件里添加很多功能进来,那么良好合理的分层就必不可少了,即便是该功能非常简单,直接在 ApplicationManage 里实现更方便,但是基于单一职责原则必须分工明确,现在费点劲,以后省大事

我设计了以下几个角色:

Lifecycle 和 StateManage 都是私有的,不是应该外部可见的。外部只需要注册生命周期的 observer,不需要知道我怎么实现的。同样 外部不需要知道我们怎么管理的 app 当前状态,只需要知道现在 app 是个什么样子。这部分我通过 ApplicationManage 对外提供相应方法

另外我在写消息类型和 app 状态类型时,我考虑了下相应的 type 放在哪里合适,是相应 manage 的内部类,还是专门一个类。内部类方便外界使用,专门的类方便查看代码结构,这就得看实际场景了,Lifecycle 这块我是用的内部类做的,这样逻辑顺延好些代码,exit 这块基本都是对内的,不暴露出来,所以专门维护了一个类


使用效果

class MyApplication : Application() {    override fun onCreate() {        super.onCreate()        ScreenAutoManager.instance.init(this, 1080.0f, ScreenAutoManager.BASE_LINE_WIDTH)        ApplicationManage.init(this)        ApplicationManage.instance.addObserver { lifecycleMessage ->            when (lifecycleMessage.type) {                ApplicationManage.MessageType.MESSAGE_ACTIVITY_CREATE -> {                    if (lifecycleMessage.activity != null) ScreenAutoManager.instance.onActivityCreated(lifecycleMessage.activity)                    Log.d("AA", "MESSAGE_ACTIVITY_CREATE")                }                ApplicationManage.MessageType.MESSAGE_ACTIVITY_START -> {                    if (lifecycleMessage.activity != null) ScreenAutoManager.instance.onActivityStarted(lifecycleMessage.activity)                    Log.d("AA", "MESSAGE_ACTIVITY_START")                }                ApplicationManage.MessageType.MESSAGE_ACTIVITY_RESUME -> {                    if (lifecycleMessage.activity != null) ScreenAutoManager.instance.onActivityResumed(lifecycleMessage.activity)                    Log.d("AA", "MESSAGE_ACTIVITY_RESUME")                }                ApplicationManage.MessageType.MESSAGE_ACTIVITY_PAUSE -> Log.d("AA", "MESSAGE_ACTIVITY_PAUSE")                ApplicationManage.MessageType.MESSAGE_ACTIVITY_STOP -> Log.d("AA", "MESSAGE_ACTIVITY_STOP")                ApplicationManage.MessageType.MESSAGE_ACTIVITY_SAVEINSTANCESTATE -> Log.d("AA", "MESSAGE_ACTIVITY_SAVEINSTANCESTATE")                ApplicationManage.MessageType.MESSAGE_ACTIVITY_DESTROYED -> Log.d("AA", "MESSAGE_ACTIVITY_DESTROYED")                ApplicationManage.MessageType.MESSAGE_APP_START -> Log.d("AA", "MESSAGE_APP_START")                ApplicationManage.MessageType.MESSAGE_APP_EXIT -> Log.d("AA", "MESSAGE_APP_EXIT")                ApplicationManage.MessageType.MESSAGE_APP_FORNT -> Log.d("AA", "MESSAGE_APP_FORNT")                ApplicationManage.MessageType.MESSAGE_APP_BACKGROUD -> Log.d("AA", "MESSAGE_APP_BACKGROUD")            }        }    }

    override fun onCreate() {
        super.onCreate()

        ScreenAutoManager.instance.init(this1080.0f, ScreenAutoManager.BASE_LINE_WIDTH)

        ApplicationManage.init(this)
        ApplicationManage.instance.addObserver { lifecycleMessage ->
            when (lifecycleMessage.type) {
                ApplicationManage.MessageType.MESSAGE_ACTIVITY_CREATE -> {
                    if (lifecycleMessage.activity != null) ScreenAutoManager.instance.onActivityCreated(lifecycleMessage.activity)
                    Log.d("AA""MESSAGE_ACTIVITY_CREATE")
                }
                ApplicationManage.MessageType.MESSAGE_ACTIVITY_START -> {
                    if (lifecycleMessage.activity != null) ScreenAutoManager.instance.onActivityStarted(lifecycleMessage.activity)
                    Log.d("AA""MESSAGE_ACTIVITY_START")
                }
                ApplicationManage.MessageType.MESSAGE_ACTIVITY_RESUME -> {
                    if (lifecycleMessage.activity != null) ScreenAutoManager.instance.onActivityResumed(lifecycleMessage.activity)
                    Log.d("AA""MESSAGE_ACTIVITY_RESUME")
                }
                ApplicationManage.MessageType.MESSAGE_ACTIVITY_PAUSE -> Log.d("AA""MESSAGE_ACTIVITY_PAUSE")
                ApplicationManage.MessageType.MESSAGE_ACTIVITY_STOP -> Log.d("AA""MESSAGE_ACTIVITY_STOP")
                ApplicationManage.MessageType.MESSAGE_ACTIVITY_SAVEINSTANCESTATE -> Log.d("AA""MESSAGE_ACTIVITY_SAVEINSTANCESTATE")
                ApplicationManage.MessageType.MESSAGE_ACTIVITY_DESTROYED -> Log.d("AA""MESSAGE_ACTIVITY_DESTROYED")

                ApplicationManage.MessageType.MESSAGE_APP_START -> Log.d("AA""MESSAGE_APP_START")
                ApplicationManage.MessageType.MESSAGE_APP_EXIT -> Log.d("AA""MESSAGE_APP_EXIT")
                ApplicationManage.MessageType.MESSAGE_APP_FORNT -> Log.d("AA""MESSAGE_APP_FORNT")
                ApplicationManage.MessageType.MESSAGE_APP_BACKGROUD -> Log.d("AA""MESSAGE_APP_BACKGROUD")
            }
        }
    }

改造 application 生命周期管理

我个人是很喜欢 Lifecycle 的,官方人家可是用的 apt 做的,我注解这块写不好,借助的是 Livedata,在 registerActivityLifecycleCallbacks 时发射相应的消息出来

class LifecycleManage {    var lifecycleLivaData: MyLiveData<LifecycleMessage> = MyLiveData()    /**     * 初始化方法     */    fun init(application: Application) {        registerActivityLifecycleCallbacks(application)    }    /**     * 注册 application 生命周期回调函数,在对应的函数回调中发射对应的消息     */    private fun registerActivityLifecycleCallbacks(application: Application) {        if (application == null) return        application.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {            override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_CREATE, activity = activity, savedInstanceState = savedInstanceState))            }            override fun onActivityStarted(activity: Activity?) {                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_START, activity = activity))            }            override fun onActivityResumed(activity: Activity?) {                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_RESUME, activity = activity))            }            override fun onActivityPaused(activity: Activity?) {                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_PAUSE, activity = activity))            }            override fun onActivityStopped(activity: Activity?) {                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_STOP, activity = activity))            }            override fun onActivityDestroyed(activity: Activity?) {                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_DESTROYED, activity = activity))            }            override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_SAVEINSTANCESTATE, activity = activity, savedInstanceState = outState))            }        })    }}
    var lifecycleLivaData: MyLiveData<LifecycleMessage> = MyLiveData()

    /**
     * 初始化方法
     */

    fun init(application: Application) {
        registerActivityLifecycleCallbacks(application)
    }

    /**
     * 注册 application 生命周期回调函数,在对应的函数回调中发射对应的消息
     */

    private fun registerActivityLifecycleCallbacks(application: Application) {
        if (application == nullreturn

        application.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {

            override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_CREATE, activity = activity, savedInstanceState = savedInstanceState))
            }

            override fun onActivityStarted(activity: Activity?) {
                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_START, activity = activity))
            }

            override fun onActivityResumed(activity: Activity?) {
                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_RESUME, activity = activity))
            }

            override fun onActivityPaused(activity: Activity?) {
                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_PAUSE, activity = activity))
            }

            override fun onActivityStopped(activity: Activity?) {
                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_STOP, activity = activity))
            }

            override fun onActivityDestroyed(activity: Activity?) {
                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_DESTROYED, activity = activity))
            }

            override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_SAVEINSTANCESTATE, activity = activity, savedInstanceState = outState))
            }
        })
    }
}

然后大家通过 ApplicationManage 实现注册 observer

    fun addObserver(tag: String? = null, lifecycle: Lifecycle? = null, observer: (lifecycleMessage: LifecycleMessage) -> Unit) {        lifecycleManage.lifecycleLivaData.addObserver(tag, lifecycle, observer)    }Unit) {
        lifecycleManage.lifecycleLivaData.addObserver(tag, lifecycle, observer)
    }

然后是使用

        ApplicationManage.instance.addObserver { lifecycleMessage ->            when (lifecycleMessage.type) {                ApplicationManage.MessageType.MESSAGE_ACTIVITY_CREATE -> {                    if (lifecycleMessage.activity != null) ScreenAutoManager.instance.onActivityCreated(lifecycleMessage.activity)                    Log.d("AA", "MESSAGE_ACTIVITY_CREATE")                }                ApplicationManage.MessageType.MESSAGE_ACTIVITY_START -> {                    if (lifecycleMessage.activity != null) ScreenAutoManager.instance.onActivityStarted(lifecycleMessage.activity)                    Log.d("AA", "MESSAGE_ACTIVITY_START")                }                ApplicationManage.MessageType.MESSAGE_ACTIVITY_RESUME -> {                    if (lifecycleMessage.activity != null) ScreenAutoManager.instance.onActivityResumed(lifecycleMessage.activity)                    Log.d("AA", "MESSAGE_ACTIVITY_RESUME")                }                ApplicationManage.MessageType.MESSAGE_ACTIVITY_PAUSE -> Log.d("AA", "MESSAGE_ACTIVITY_PAUSE")                ApplicationManage.MessageType.MESSAGE_ACTIVITY_STOP -> Log.d("AA", "MESSAGE_ACTIVITY_STOP")                ApplicationManage.MessageType.MESSAGE_ACTIVITY_SAVEINSTANCESTATE -> Log.d("AA", "MESSAGE_ACTIVITY_SAVEINSTANCESTATE")                ApplicationManage.MessageType.MESSAGE_ACTIVITY_DESTROYED -> Log.d("AA", "MESSAGE_ACTIVITY_DESTROYED")                ApplicationManage.MessageType.MESSAGE_APP_START -> Log.d("AA", "MESSAGE_APP_START")                ApplicationManage.MessageType.MESSAGE_APP_EXIT -> Log.d("AA", "MESSAGE_APP_EXIT")                ApplicationManage.MessageType.MESSAGE_APP_FORNT -> Log.d("AA", "MESSAGE_APP_FORNT")                ApplicationManage.MessageType.MESSAGE_APP_BACKGROUD -> Log.d("AA", "MESSAGE_APP_BACKGROUD")            }        }when (lifecycleMessage.type) {
                ApplicationManage.MessageType.MESSAGE_ACTIVITY_CREATE -> {
                    if (lifecycleMessage.activity != null) ScreenAutoManager.instance.onActivityCreated(lifecycleMessage.activity)
                    Log.d("AA""MESSAGE_ACTIVITY_CREATE")
                }
                ApplicationManage.MessageType.MESSAGE_ACTIVITY_START -> {
                    if (lifecycleMessage.activity != null) ScreenAutoManager.instance.onActivityStarted(lifecycleMessage.activity)
                    Log.d("AA""MESSAGE_ACTIVITY_START")
                }
                ApplicationManage.MessageType.MESSAGE_ACTIVITY_RESUME -> {
                    if (lifecycleMessage.activity != null) ScreenAutoManager.instance.onActivityResumed(lifecycleMessage.activity)
                    Log.d("AA""MESSAGE_ACTIVITY_RESUME")
                }
                ApplicationManage.MessageType.MESSAGE_ACTIVITY_PAUSE -> Log.d("AA""MESSAGE_ACTIVITY_PAUSE")
                ApplicationManage.MessageType.MESSAGE_ACTIVITY_STOP -> Log.d("AA""MESSAGE_ACTIVITY_STOP")
                ApplicationManage.MessageType.MESSAGE_ACTIVITY_SAVEINSTANCESTATE -> Log.d("AA""MESSAGE_ACTIVITY_SAVEINSTANCESTATE")
                ApplicationManage.MessageType.MESSAGE_ACTIVITY_DESTROYED -> Log.d("AA""MESSAGE_ACTIVITY_DESTROYED")

                ApplicationManage.MessageType.MESSAGE_APP_START -> Log.d("AA""MESSAGE_APP_START")
                ApplicationManage.MessageType.MESSAGE_APP_EXIT -> Log.d("AA""MESSAGE_APP_EXIT")
                ApplicationManage.MessageType.MESSAGE_APP_FORNT -> Log.d("AA""MESSAGE_APP_FORNT")
                ApplicationManage.MessageType.MESSAGE_APP_BACKGROUD -> Log.d("AA""MESSAGE_APP_BACKGROUD")
            }
        }

可以看到这里 app 的启动,退出,前后台切换我也都发送相关的消息了

实现不难,思路就使用 livedata 在合适的位置转发一下数据,官方的 Lifecycle 也是这个思路做的


判断 app 启动,退出,前后台切换

我想大家都关心这个,相信大家也都有自己的实现,基本思路都是在 registerActivityLifecycleCallbacks 里更新计数器判断 app 状态,这里我也是一样的,只不过多了一步罢了

我标识了 app 的3种状态: app state 默认是 no - app没启动

val STATE_APP_NO: Int = 31val STATE_APP_FORNT: Int = 32val STATE_APP_BACKGROUD: Int = 33Int = 31
val STATE_APP_FORNT: Int = 32
val STATE_APP_BACKGROUD: Int = 33

判断逻辑如下:

注意:onActivityStarted 这个函数即表示 onStart,也表示 onRestart ,所以在计数时要更外小心,因为 start  的原因 oncreate 不适合计数器++了,要不会和 start  重复

这样我们也可以返回 app 当前的状态了,不用再用 AM 来判断了,AM 很多人反应部分手机无效,其实返回 app 状态的这个小功能非常实用的,在推送时我们要判断 app 是不是启来了,因为由不同的操作


优雅的退出 app

我这里思路很简单,就是主界面下面垫一个透明无界面的 Activity,我们想退出 app 时启动这个 Activity,在 onNewIntent 里面 finish 页面就行了,不过这个功能有侵入行:

// 退出 appApplicationManage.instance.exitmanage.exitApp()// 代理方法启动主界面ApplicationManage.instance.exitmanage.startActivityProxy(this, Intent(this@SplaseActivity, MainActivity::class.java))// 屏蔽主界面返回按键默认操作override fun onBackPressed() {//  super.onBackPressed()}
ApplicationManage.instance.exitmanage.exitApp()

// 代理方法启动主界面
ApplicationManage.instance.exitmanage.startActivityProxy(this, Intent(this@SplaseActivity, MainActivity::class.java))

// 屏蔽主界面返回按键默认操作
override fun onBackPressed() {
//  super.onBackPressed()
}

具体代码

我知道大家都懒得看 demo,这代码长也得贴出来

/** * 作者 : BloodCrown * 时间 : 2019-05-08 21:33 * 描述 : *  application 封装类,在方便提供 application 上下文对象的同时, *  也提供了一些功能 * * 功能 : *  1. Application 上下文代理,任何模块都不必关心 application 具体的实现类型 *  有 ApplicationManage 在时刻都能获取全局上下文对象 * *  2. 提供优雅退出 app 的功能,通过在主页面下面添加一个透明的 activity + singleTask 实现优雅退出 * *  3. Application 的生命周期实现响应式,像 EventBus,RxBus 那样响应消息就行,另外我还添加了 *  app 启动,退出,切入后台,切回前台的相应进来 * *  4. 在实现功能3时,实现了 app 当前状态的保存,极大的方便了我们在注入推送时判断 app 是否启动等操作 * *  最后说一点,我没有使用 ActivityManage 来判断 app 状态,因为 ActivityManage 存在适配问题, *  总有那么一小撮手机就是不配合,臣妾也是没办法呀~ * */class ApplicationManage {    companion object Help {        // 饿汉式单例,加上同步限制,这样可以避免 application 操作类单例为null 的情况        val instance: ApplicationManage by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {            return@lazy ApplicationManage()        }        // 标准初始化方法,        fun init(application: Application) {            instance.init(application)        }    }    // 全局上下文对象    var application: Application? = null    // 退出 app 工具类    var exitmanage: ExitManage = ExitManage()    // app 全局生命周期管理类,使用 livedata 实现,考虑其若是外部可见,就能使用他乱发射数据,数据私有    private var lifecycleManage: LifecycleManage = LifecycleManage()    // app 状态管理类,也是私有,这个实现绝对是不对外的,大家关心结果就好了,由 ApplicationManage 衔接    private var stateManage: StateManage = StateManage()    /**     * 初始化方法私有,由静态方法衔接     */    private fun init(application: Application) {        this.application = application        lifecycleManage.init(application)        stateManage.initStateManage(lifecycleManage)    }    /**     * 添加监听     */    fun addObserver(tag: String? = null, lifecycle: Lifecycle? = null, observer: (lifecycleMessage: LifecycleMessage) -> Unit) {        lifecycleManage.lifecycleLivaData.addObserver(tag, lifecycle, observer)    }    /**     * 解绑     */    fun removeobserver(tag: String) {        lifecycleManage.lifecycleLivaData.removeOberver(tag)    }    /**     * 获取当前 app 状态     */    fun getCurrentState(): Int {        return stateManage.STAET_CURRENT    }    /**     * 消息类型     */    class MessageType {        companion object {            // 对应 activity 的生命周期            @JvmField            val MESSAGE_ACTIVITY_CREATE: Int = 11            @JvmField            val MESSAGE_ACTIVITY_RESUME: Int = 12            @JvmField            val MESSAGE_ACTIVITY_START: Int = 13            @JvmField            val MESSAGE_ACTIVITY_PAUSE: Int = 14            @JvmField            val MESSAGE_ACTIVITY_STOP: Int = 15            @JvmField            val MESSAGE_ACTIVITY_DESTROYED: Int = 16            @JvmField            val MESSAGE_ACTIVITY_SAVEINSTANCESTATE: Int = 17            // app 启动,退出,切换到前台,切换到后台            @JvmField            val MESSAGE_APP_START: Int = 21            @JvmField            val MESSAGE_APP_EXIT: Int = 25            @JvmField            val MESSAGE_APP_FORNT: Int = 22            @JvmField            val MESSAGE_APP_BACKGROUD: Int = 23        }    }}
class ApplicationManage {

    companion object Help {

        // 饿汉式单例,加上同步限制,这样可以避免 application 操作类单例为null 的情况
        val instance: ApplicationManage by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
            return@lazy ApplicationManage()
        }

        // 标准初始化方法,
        fun init(application: Application) {
            instance.init(application)
        }
    }

    // 全局上下文对象
    var application: Application? = null
    // 退出 app 工具类
    var exitmanage: ExitManage = ExitManage()
    // app 全局生命周期管理类,使用 livedata 实现,考虑其若是外部可见,就能使用他乱发射数据,数据私有
    private var lifecycleManage: LifecycleManage = LifecycleManage()
    // app 状态管理类,也是私有,这个实现绝对是不对外的,大家关心结果就好了,由 ApplicationManage 衔接
    private var stateManage: StateManage = StateManage()

    /**
     * 初始化方法私有,由静态方法衔接
     */

    private fun init(application: Application) {
        this.application = application
        lifecycleManage.init(application)
        stateManage.initStateManage(lifecycleManage)
    }

    /**
     * 添加监听
     */

    fun addObserver(tag: String? = null, lifecycle: Lifecycle? = null, observer: (lifecycleMessageLifecycleMessage) -> Unit) {
        lifecycleManage.lifecycleLivaData.addObserver(tag, lifecycle, observer)
    }

    /**
     * 解绑
     */

    fun removeobserver(tag: String) {
        lifecycleManage.lifecycleLivaData.removeOberver(tag)
    }

    /**
     * 获取当前 app 状态
     */

    fun getCurrentState()Int {
        return stateManage.STAET_CURRENT
    }

    /**
     * 消息类型
     */

    class MessageType {

        companion object {
            // 对应 activity 的生命周期
            @JvmField
            val MESSAGE_ACTIVITY_CREATE: Int = 11
            @JvmField
            val MESSAGE_ACTIVITY_RESUME: Int = 12
            @JvmField
            val MESSAGE_ACTIVITY_START: Int = 13
            @JvmField
            val MESSAGE_ACTIVITY_PAUSE: Int = 14
            @JvmField
            val MESSAGE_ACTIVITY_STOP: Int = 15
            @JvmField
            val MESSAGE_ACTIVITY_DESTROYED: Int = 16
            @JvmField
            val MESSAGE_ACTIVITY_SAVEINSTANCESTATE: Int = 17

            // app 启动,退出,切换到前台,切换到后台
            @JvmField
            val MESSAGE_APP_START: Int = 21
            @JvmField
            val MESSAGE_APP_EXIT: Int = 25
            @JvmField
            val MESSAGE_APP_FORNT: Int = 22
            @JvmField
            val MESSAGE_APP_BACKGROUD: Int = 23
        }
    }
}
/** * 作者 : BloodCrown * 时间 : 2019-05-08 21:38 * 描述 : */class LifecycleManage {    var lifecycleLivaData: MyLiveData<LifecycleMessage> = MyLiveData()    /**     * 初始化方法     */    fun init(application: Application) {        registerActivityLifecycleCallbacks(application)    }    /**     * 注册 application 生命周期回调函数,在对应的函数回调中发射对应的消息     */    private fun registerActivityLifecycleCallbacks(application: Application) {        if (application == null) return        application.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {            override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_CREATE, activity = activity, savedInstanceState = savedInstanceState))            }            override fun onActivityStarted(activity: Activity?) {                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_START, activity = activity))            }            override fun onActivityResumed(activity: Activity?) {                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_RESUME, activity = activity))            }            override fun onActivityPaused(activity: Activity?) {                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_PAUSE, activity = activity))            }            override fun onActivityStopped(activity: Activity?) {                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_STOP, activity = activity))            }            override fun onActivityDestroyed(activity: Activity?) {                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_DESTROYED, activity = activity))            }            override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_SAVEINSTANCESTATE, activity = activity, savedInstanceState = outState))            }        })    }}
class LifecycleManage {
    var lifecycleLivaData: MyLiveData<LifecycleMessage> = MyLiveData()

    /**
     * 初始化方法
     */

    fun init(application: Application) {
        registerActivityLifecycleCallbacks(application)
    }

    /**
     * 注册 application 生命周期回调函数,在对应的函数回调中发射对应的消息
     */

    private fun registerActivityLifecycleCallbacks(application: Application) {
        if (application == nullreturn

        application.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {

            override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_CREATE, activity = activity, savedInstanceState = savedInstanceState))
            }

            override fun onActivityStarted(activity: Activity?) {
                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_START, activity = activity))
            }

            override fun onActivityResumed(activity: Activity?) {
                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_RESUME, activity = activity))
            }

            override fun onActivityPaused(activity: Activity?) {
                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_PAUSE, activity = activity))
            }

            override fun onActivityStopped(activity: Activity?) {
                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_STOP, activity = activity))
            }

            override fun onActivityDestroyed(activity: Activity?) {
                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_DESTROYED, activity = activity))
            }

            override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
                lifecycleLivaData.sendValue(LifecycleMessage(type = ApplicationManage.MessageType.MESSAGE_ACTIVITY_SAVEINSTANCESTATE, activity = activity, savedInstanceState = outState))
            }
        })
    }

}
class LifecycleMessage(var type: Int, var activity: Activity? = null, var savedInstanceState: Bundle? = null) {}var type: Intvar activity: Activity? = nullvar savedInstanceState: Bundle? = null) {
}
/** * 作者 : BloodCrown * 时间 : 2019-05-09 21:32 * 描述 : */class StateManage {    companion object stateType {        // 没启动,前台,后台        @JvmField        val STATE_APP_NO: Int = 31        @JvmField        val STATE_APP_FORNT: Int = 32        @JvmField        val STATE_APP_BACKGROUD: Int = 33    }    var STAET_CURRENT: Int = STATE_APP_NO    var aliveActivitys: Int = 0    fun initStateManage(lifecycleManage: LifecycleManage) {        if (lifecycleManage == null) return        addObserver(lifecycleManage)    }    /**     * 添加管理器     */    private fun addObserver(lifecycleManage: LifecycleManage) {        if (lifecycleManage == null) return        lifecycleManage.lifecycleLivaData.addObserver {            when (it.type) {                ApplicationManage.MessageType.MESSAGE_ACTIVITY_CREATE -> {                    // 标记是没启动,那么触发 create 一定是app 启动                    if (STAET_CURRENT == STATE_APP_NO) {                        STAET_CURRENT = STATE_APP_FORNT                        lifecycleManage.lifecycleLivaData.sendValue(LifecycleMessage(ApplicationManage.MessageType.MESSAGE_APP_START))                    }                }                ApplicationManage.MessageType.MESSAGE_ACTIVITY_START -> {                    // 活动 ac 数量为0,并且当前标记是 app 在后台,那么此时触发 start,那么就是切会到前台来了                    if (aliveActivitys == 0 && STAET_CURRENT == STATE_APP_BACKGROUD) {                        STAET_CURRENT = STATE_APP_FORNT                        lifecycleManage.lifecycleLivaData.sendValue(LifecycleMessage(ApplicationManage.MessageType.MESSAGE_APP_FORNT))                    }                    aliveActivitys++                }                ApplicationManage.MessageType.MESSAGE_ACTIVITY_STOP -> {                    aliveActivitys--                    if (aliveActivitys == 0 && STAET_CURRENT == STATE_APP_FORNT) {                        STAET_CURRENT = STATE_APP_BACKGROUD                        lifecycleManage.lifecycleLivaData.sendValue(LifecycleMessage(ApplicationManage.MessageType.MESSAGE_APP_BACKGROUD))                    }                }                ApplicationManage.MessageType.MESSAGE_ACTIVITY_DESTROYED -> {                    if (aliveActivitys == 0) {                        STAET_CURRENT = STATE_APP_NO                        lifecycleManage.lifecycleLivaData.sendValue(LifecycleMessage(ApplicationManage.MessageType.MESSAGE_APP_EXIT))                    }                }            }        }    }}
class StateManage {

    companion object stateType {

        // 没启动,前台,后台
        @JvmField
        val STATE_APP_NO: Int = 31
        @JvmField
        val STATE_APP_FORNT: Int = 32
        @JvmField
        val STATE_APP_BACKGROUD: Int = 33
    }

    var STAET_CURRENT: Int = STATE_APP_NO
    var aliveActivitys: Int = 0

    fun initStateManage(lifecycleManage: LifecycleManage) {
        if (lifecycleManage == nullreturn

        addObserver(lifecycleManage)
    }

    /**
     * 添加管理器
     */

    private fun addObserver(lifecycleManage: LifecycleManage) {
        if (lifecycleManage == nullreturn
        lifecycleManage.lifecycleLivaData.addObserver {
            when (it.type) {
                ApplicationManage.MessageType.MESSAGE_ACTIVITY_CREATE -> {
                    // 标记是没启动,那么触发 create 一定是app 启动
                    if (STAET_CURRENT == STATE_APP_NO) {
                        STAET_CURRENT = STATE_APP_FORNT
                        lifecycleManage.lifecycleLivaData.sendValue(LifecycleMessage(ApplicationManage.MessageType.MESSAGE_APP_START))
                    }
                }

                ApplicationManage.MessageType.MESSAGE_ACTIVITY_START -> {
                    // 活动 ac 数量为0,并且当前标记是 app 在后台,那么此时触发 start,那么就是切会到前台来了
                    if (aliveActivitys == 0 && STAET_CURRENT == STATE_APP_BACKGROUD) {
                        STAET_CURRENT = STATE_APP_FORNT
                        lifecycleManage.lifecycleLivaData.sendValue(LifecycleMessage(ApplicationManage.MessageType.MESSAGE_APP_FORNT))
                    }
                    aliveActivitys++
                }

                ApplicationManage.MessageType.MESSAGE_ACTIVITY_STOP -> {
                    aliveActivitys--
                    if (aliveActivitys == 0 && STAET_CURRENT == STATE_APP_FORNT) {
                        STAET_CURRENT = STATE_APP_BACKGROUD
                        lifecycleManage.lifecycleLivaData.sendValue(LifecycleMessage(ApplicationManage.MessageType.MESSAGE_APP_BACKGROUD))
                    }
                }

                ApplicationManage.MessageType.MESSAGE_ACTIVITY_DESTROYED -> {
                    if (aliveActivitys == 0) {
                        STAET_CURRENT = STATE_APP_NO
                        lifecycleManage.lifecycleLivaData.sendValue(LifecycleMessage(ApplicationManage.MessageType.MESSAGE_APP_EXIT))
                    }
                }
            }
        }
    }

}
class ExitActivity : AppCompatActivity() {    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_exit)    }    override fun onNewIntent(intent: Intent?) {        super.onNewIntent(intent)        if (intent == null) return        val action: Int = intent.getIntExtra(ExitMessage.MESSAGE_ACTION, ExitMessage.ACTION_EXIT)        when (action) {            ExitMessage.ACTION_EXIT -> this@ExitActivity.finish()            else -> this@ExitActivity.finish()        }    }}

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_exit)
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        if (intent == nullreturn

        val action: Int = intent.getIntExtra(ExitMessage.MESSAGE_ACTION, ExitMessage.ACTION_EXIT)
        when (action) {
            ExitMessage.ACTION_EXIT -> this@ExitActivity.finish()
            else -> this@ExitActivity.finish()
        }
    }

}
class ExitManage {    fun exitApp(): Boolean {        if (ApplicationManage.instance.application == null) return false        var intent = Intent(ApplicationManage.instance.application, ExitActivity::class.java)        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)        ApplicationManage.instance.application?.startActivity(intent)        return true    }    fun exitAppBySystem() {        System.exit(0)    }    fun startActivityProxy(activity: Activity, intentYou: Intent) {        if (activity == null) return        var intentExit = Intent(activity, ExitActivity::class.java)        intentExit.putExtra(ExitMessage.MESSAGE_ACTION, ExitMessage.ACTION_EXIT)        activity.startActivity(intentExit)        activity.startActivity(intentYou)    }}

    fun exitApp()Boolean {
        if (ApplicationManage.instance.application == nullreturn false

        var intent = Intent(ApplicationManage.instance.application, ExitActivity::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        ApplicationManage.instance.application?.startActivity(intent)
        return true
    }

    fun exitAppBySystem() {
        System.exit(0)
    }

    fun startActivityProxy(activity: Activity, intentYou: Intent) {
        if (activity == nullreturn

        var intentExit = Intent(activity, ExitActivity::class.java)
        intentExit.putExtra(ExitMessage.MESSAGE_ACTION, ExitMessage.ACTION_EXIT)

        activity.startActivity(intentExit)
        activity.startActivity(intentYou)
    }

}
object ExitMessage {    val MESSAGE_ACTION: String = "message_action"    val ACTION_EXIT: Int = 101}
    val MESSAGE_ACTION: String = "message_action"
    val ACTION_EXIT: Int = 101
}

能看到这里的都是相当给面子的了~


最后吐槽下吧

锁屏,解锁时我即便按照下面的设置设了

android:screenOrientation="portrait"android:configChanges="orientation|screenSize|keyboardHidden"

但是蛋疼的有的手机就是不给面子,还是会走1-2遍 activity 销毁,重建的过程,太蛋疼了,手头的 meizu 16h就这样,好在这样的手机只是少部分,但是带给我们的影响就是前后台切换的消息会走好几次,这我也没办法,昨天下午一下午的时间就是在找资料搞订这个,一下午的时间过去了也不行,算了就这样吧,大家记得android 这啃爹玩意完事不是 100% 有些偏差就得了,我监听锁屏,解锁广播,发现最后才收到广播,声明周期函数早就执行完了,广播才来还有个P用啊

唉,一下午的时间身心俱疲啊~

我知道高玩们是看不上我这篇文章的,不喷我就是好的了,全当是自娱自乐吧

640?wx_fmt=jpeg

支持,「在看」640

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值