美文网首页如何做一个崩溃率少于千分之三噶应用appandroid开发android
[Android]如何做一个崩溃率少于千分之三噶应用app(2)

[Android]如何做一个崩溃率少于千分之三噶应用app(2)

作者: CangWang | 来源:发表于2016-08-21 09:44 被阅读5385次

    以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。

    [Android]如何做一个崩溃率少于千分之三噶应用app--章节列表

    我建立了一个关于Android架构学习的群,里面可以进一步进行组件化学习的交流。

    群号是316556016,也可以扫码进群。我在这里期待你们的加入!!!

    在这里先提一个问题,你是否考虑过在App里面加入自定义的栈来管理Activity?为何需要这样管理Activity呢?

    很多人会想到Activity本来不就已经有栈管理的方式啦,有可以自定义它启动排列的规则,例如standard,singleTop,singleTask等。那自定义管理Activity的在于哪里呢?

    如果你只是考虑想要如何完全退出栈内的全部Activity的话,这编文章应该是需要的。

    我们很多情况下想完全退出App,会做一个自定义的栈来管理相应的Activity。

    但是条条大路通罗马,完全退出App,并不一定需要自定义的栈来作管理。

    这里推荐的方法。

    1.你需要一个事件总线,例如EventBus,或者你本来工程就有自己写好的事件总线。

    2.很多情况下,我们写Activity都会继承一个例如命名为BaseActivity基类,此类里面作一些共性的操作。

    看到这里是否有一定的头绪,想到我想如何做?那就继续往下看吧

    1.我们先定义一个AppExitEvent的类,用于EventBus的事件传输(如果不清楚EventBus是什么,那就请自己恶补一下吧)

    2.在我们的BaseActivity 的onCreate里面注册EventBus,onDestroy里面注销EventBus

    注册 注销

    3.然后定义一个send的方法

    发送AppExitEvent

    4.然后定义接收事件,用finish结束Activity

    接收事件

    这里所有栈内的继承于BaseActivity的Activty都会接收到事件,然后调用finish结束Activity

    5.这样App就只会有一个结束出口,想要完全退出程序的时候,只要调用sendExitEvent的方法

    这样做的优点,不需要做到用自定义栈去管理Activity,但是能将自己想要信号传送到每一个Activity。

    如果我们想要在推出前加入一些操作,例如想发一个广播,需要如何做?

    那么我们可以在sendExitEvent里面,发送event前,写一个广播就可以了。

    这里确定要完全退出app,还推荐在finish后使用System.exit(0),这样会写提示虚拟机kill掉进程。

    *2016.12.09更新

    推荐System.exit(0),是为了提示系统的一些缓存也做出退出操作,我曾经遇到过,不使用这个,会出现登录的账号没有完全退出,下次登录会提示账号的问题。

    如果有更加好的建议和想法,欢迎在评论留言。

    相关文章

      网友评论

      • ITIan:这个如果不继承Base的界面不就退不了,比如启动了第三方库的界面
        ITIan:@CangWang 比如微信授权登录/支付就是调用SDK的activity,但毕竟比较少https://www.jianshu.com/p/75a5c24174b2这篇文章主要也是通过ActivityLifecycleCallbacks实现,我看了楼下的那篇文章,就是第二种方法,我觉得还是最原始的方法比较通用点,并不是所有项目都用eventBUS
        CangWang:但是你三房库,一般不提供Activity的,提供View的居多,如果直接Activity,那应该是否回调的方法。
        CangWang:@ITIan 这的确是个问题
      • 炎之铠:可以参考下这个
        http://blog.csdn.net/totond/article/details/72960211
        炎之铠:@CangWang 互相学习嘛,我从你这里也学到很多,我是这篇博客的作者,如果有新的不同的想法也希望提出来,哈哈
        CangWang:@炎之铠 这个资料非常好,谢谢分享
      • 黑白咖:签到
        不懂完全退出app的含义是什么,系统的栈空了,自然就回到桌面了。自定义栈+弱引用是可以的,只是这样的栈能用来做什么…
      • yangyirunning:我记得,EventBus从3.0开始,注册和注销的动作就不能写在Base基类中了,会抛出重复注册的异常
      • 五香鱼cc:然并卵,退出activity的方式很多,eventbus来做是不是大材小用了
        CangWang:@五香鱼cc 那请教你更好的方法,更有有效的方法。
      • 宇宙只有巴掌大:这跟设计有关系了,一个好的app层级结构 是不需要 自定义栈管理的
        CangWang:@宇宙只有巴掌大 要看App层级的复杂程度
      • 78f78f232537:好像是有内存泄漏问题。EventBus是单例全局唯一,生命周期是Application级别的,在所有的Activity中都register到EventBus中,Activity退出时也无法销毁。 注册的时候可以注册一个WeakReference,而不是直接register当前Activity。这样,既不影响Activity回收,也可以做到一次关闭所有Activity。
        CangWang:@liangchi 用过你就知道了
        a4c08081f9ed:真的假的
      • CoderChoy:为什么我在finish后使用System.exit(0)退出不了呢?比如我当前有a,b,c,d四个activity,我在调用sendExitEvent,这时候app确实退出了,然后一闪就恢复回到了c。。。不调用System.exit(0)就没问题。System.exit(0)应该要在最后一个activity的finish后面才调吧?怎么保证这一点呢?
      • 华清松:支持
      • gzfgeh:a到b到c到d,d成功回到a,不成功回到c,还是自定义栈方便
        越小河流域:a可以用singeTask模式,d成功用startActivity a回到a
        CangWang:@gzfgeh 当安卓本身的栈分配机制不满足的时候,那时使用自定义栈管理才适合的
      • 明朗__:BaseActivity里面使用EventBus有内存泄漏的危险 个人感觉若
        明朗__:如果有多个Activity继承了BaseActivity 这些Activity里面onCreate()里面也有注册EventBus 这些Activity在相互启动的时候 BaseActivity里面的EventBus 应该做不到解注册
        CangWang:@明朗__ 请问一下你觉得会泄露的地方在哪里呢,这样做没有隐式持有相关的context对象吧
        CangWang:@明朗__ 请问一下你觉得会泄露的地方在哪里呢,这样做没有隐式持有相关的context对象吧
      • 满月写:第5条:虽然不用自定义栈去管理Activity,但其实是将管理的工作交给了EventBus,而且还要自定义Event,这样做也不好
        CangWang:@满月写 嗯嗯,你说得有理,但是eventbus实现还是比栈简单,而且通过eventbus可以捕获意外的错误。
      • 妙法莲花1234:android.os.Process.killProcess(android.os.Process.myPid());
        System.exit(0);

        这两个方法我都加上了。。。
        CangWang:@追风917 然后发现出现问题?你这样做,如果没问题应该是比较安全的,完全退出进程,这样会减少登录的问题。
      • 妙法莲花1234:帅气的我赶紧用RxBus重构了一下, 谢谢咯!
      • Neo_duan:我觉得用栈管理比较好,这样你可以在任何地方获取当前最顶部的Activity,比如要在adapter的item点击退出界面,只要杀掉移除栈中顶部activity,还可以在任何地方弹Dialog等
        CangWang:@Neo_duan 栈管理其实有点重,如果不是需要调整顺序等操作,还是不要使用栈管理增加复杂度
      • Waizau:在一年前,我也用了eventbus去kill掉程序,比用broadcast好用,啊哈哈哈
      • 小胡子0113:get到了,今天刚刚还有群友在讨论这个问题,怎么完全退出app。 :+1:
        CangWang:@隐_颖 多谢关注,都是写小技能的分享

      本文标题:[Android]如何做一个崩溃率少于千分之三噶应用app(2)

      本文链接:https://www.haomeiwen.com/subject/ggmvsttx.html