开发者社区> 问答> 正文

关于APP退出,极光推送服务、以及其他三方服务的处理问题:配置报错 

最近在开发一个Android版的客户端,里面基本的业务功能都实现了,现在进入了最后一个阶段...调试阶段...
但是遇到了一个问题,就是APP退出...
因为APP需要推送功能,于是加入了极光推送(JPush),另外里面还加入了 百度地图、百度定位插件。
因为使用了三方插件,它们都需要初始化,一般都选择在MainApplication(继承了Application类)的onCreate方法中初始化避免重复初始化带来的时间消耗。所以在应用程序退出时,我们同样需要关闭他们、释放资源
在网上查了下关于APP退出的资料,再看看OSChina里面的退出方法了解到(整个项目框架就是在OSchina客户端基础上搭的,在此谢谢将此项目开源的大神们!辛苦了!)
2.2版本之前

finishAllActivity();//结束所有Activity
ActivityManager activityMgr= (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
//关闭应用
//与当前应用相关的应用、进程、服务等也会被关闭。
//会发送 ACTION_PACKAGE_RESTARTED广播。
activityMgr.restartPackage(context.getPackageName());
System.exit(0);//退出应用

2.2版本之后官方建议使用
killBackgroundProcesses(String packageName)替代restartPackage(String packageName)
先使用此2种方法吧。测试,都可以退出应用,后台也没有输出任何东西,让后呢,后台服务到底有没有关闭呢,去设置-应用程序-运行中里看看吧;果然没有关闭掉,1个进程和1个服务——PushService依然挺立,应该可以理解为,其他初始化过的三方插件也没有主动关闭吧(百度地图的 service 是android:process=":remote" 一个全局的进程;而百度定位没有service,不知道会不会随着应用终止一起释放资源...)
好吧,我理解为这些服务需要我退出前需先手动关闭,再退出程序
查了下极光推送的官方API,得到JPushInterface.stopPush(getApplicationContext())
好的先关闭三个插件服务,再结束所有Activity,再退出应用。
进入设置-应用程序里面看看,OK没有了!但是...突然发现日志中打印的记录发现MainApplication的onCreate方法被调用了...三个服务重新又被初始化了...再看设置-应用程序里面,进程又有了...只是启动时间重新计算了...说明,我们退出应用成功了...只是什么地方又触发了MainApplication重新启动...
去看看配置文件,发现极光推送服务的PushService的配置

<service     android:name="cn.jpush.android.service.PushService"     android:enabled="true"     android:exported="false">     <intent-filter>         <action android:name="cn.jpush.android.intent.REGISTER" />         <action android:name="cn.jpush.android.intent.REPORT" />         <action android:name="cn.jpush.android.intent.PushService" />         <action android:name="cn.jpush.android.intent.PUSH_TIME" />                     </intent-filter> </service> <receiver     android:name="cn.jpush.android.service.PushReceiver" android:enabled="true" >     <intent-filter android:priority="1000">         <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />   <!--Required  显示通知栏 -->         <category android:name="包名" />     </intent-filter>     <intent-filter>         <action android:name="android.intent.action.USER_PRESENT" />  <!-- 锁屏解除事件 -->         <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />  <!-- 网络切换事件 -->     </intent-filter>     <!-- Optional -->     <intent-filter>         <action android:name="android.intent.action.PACKAGE_ADDED" /> <!-- 应用程序安装 -->         <action android:name="android.intent.action.PACKAGE_REMOVED" /> <!-- 应用程序卸载 -->         <data android:scheme="package" />     </intent-filter> </receiver>
我只能理解就是它了...不死的小强 - -
可是JPushInterface.stopPush(getApplicationContext())的解释是:
调用了本 API 后,JPush 推送服务完全被停止。具体表现为:
  • JPush Service 不在后台运行
  • 收不到推送消息
  • JPushInterface.init 这个初始化方法调用,不能初始化 JPush 使得可以收到推送
  • 极光推送所有的其他 API 调用都无效
如果官方给的这个方法仅仅暂时关闭服务,而注册过的事件又会再次启动服务,那这个关闭还有什么意义呢... 如果我要实现,退出应用,一个是完全退出,一个是后台运行,后台运行简单,关闭所有activity就行了...那如果是完全退出应用,即退出时关闭极光推送服务(或者理解为不再接受推送),要怎么办呢?或者说有什么好的策略呢?有更好的APP退出策略(涉及有后台Service的)求分享... 看了JPush虽然提供设置接收推送时间,但是...看了说明(如果不在该时间段内收到消息,当前的行为是:推送到的通知会被扔掉。)就直接放弃了... 本人初学Android时间不长,如有说错的地方大神们请见谅,口下留情...希望能给些建议,万分感谢!

展开
收起
kun坤 2020-06-02 17:22:03 2107 0
1 条回答
写回答
取消 提交回答
  • Hi, 楼主,
    我是极光推送 Javen。 
    坦率地说,我们设计 JPush SDK stopPush 功能时,还真没有太考虑一个应用想要:退出时要杀死自己的情况。
    因为,这不是一个好的实践,很明显是违反 Android/iOS 操作系统的设计的。智能手机 OS 设计的一个基本概念就是:App 的生命周期 OS 自己来管理。
    一个应用退出后,进程是否立即退出,应该是 OS 层面来统一管理维护的。 如果你的 App 有 Servcie 长驻,的确整个进程被杀死(以释放必要的资源)的概率会小些。
    JPush 提供 Push Service,大多数时候的应用场景是:应用在未使用时也能够收到消息。所以默认是 Service 长驻后台的。 JPush 提供 stopPush 方法,为有特殊需要的应用场景提供方便,PushService 不会长驻内存。   但为了维护完整性,JPush service 还是会被触发短期运行。

    ######不过发现会出现一个特别小概率的事件... 用户退出——请求清空别名——用户登陆——设置别名——清空别名超时再次尝试——设置别名成功——清空别名成功...######谢谢你的回答~发问题的时候才初学Android几个月...对APP的生命周期还不是很理解,特别是带后台常驻进程的...见笑了... 现在我采用清空别名的方式,让用户退出之后只会收到appkey级的推送。######Activity都finish掉,自己的Service都stopSelf掉,其他的就别管了,本来Google就不希望大家手动去结束一个APP######主要是这个极光推送的PushService,无法控制...官方提问,也是草草的给出答案JPushInterface.stopPush(this),所以我做的最坏打算也是这样的...不管了...再加个持久层属性,是否已手动退出,围绕它做判断了...但是感觉这是不是弯路呢....######额。关注一下,顺便咨询一下用JPUSH的感受,开发难度和调试成本如何,支持多少用户######还不错,推送及时率不错(看网络环境 - -),整合也很简单,自定义消息扩展性非常大...需求要求不高的话是个很好的选择。######调用 JPushInterface.stopPush 之后服务会停止,但是服务在几分钟后会启动同步一下客户端SDK的状态,同步之后服务就不再启动了。所以stopPush是可以停止极关推送的服务的。###### 作为一个普通用户,十分反感国产手机应用退出后,还驻留一堆服务在内存里面。
    于是我用Autostarts(自启管理)禁用了所有程序的自启意图。
    每次应用退出后,都手动去“应用-正在运行”里面手动关闭所有服务。
    可即便是这样,还是会有一堆垃圾服务不知何时就偷偷冒出来,占用大量的内存、CPU和网络流量。
    哎,android上的流氓太多,等有钱还是换一个iphone吧。。。 ######其实一样的,只是 IOS 统一管理了 后台推送服务,google对于Android推送也有GCM,只是你懂的,国内无法稳定使用,没办法呀...

    2020-06-02 17:32:38
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
女性移动App安全攻防战 立即下载
汇聚云计算的生态核能——云市场,云上APP Store 立即下载
千万级用户直播App——服务端架构设计和思考 立即下载

相关实验场景

更多