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

FallenPanda 发布于 2013/08/12 16:33
阅读 23K+
收藏 2

最近在开发一个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时间不长,如有说错的地方大神们请见谅,口下留情...希望能给些建议,万分感谢!


加载中
0
JavenFang
JavenFang

Hi, 楼主,

我是极光推送 Javen。 

坦率地说,我们设计 JPush SDK stopPush 功能时,还真没有太考虑一个应用想要:退出时要杀死自己的情况。

因为,这不是一个好的实践,很明显是违反 Android/iOS 操作系统的设计的。智能手机 OS 设计的一个基本概念就是:App 的生命周期 OS 自己来管理。

一个应用退出后,进程是否立即退出,应该是 OS 层面来统一管理维护的。 如果你的 App 有 Servcie 长驻,的确整个进程被杀死(以释放必要的资源)的概率会小些。

JPush 提供 Push Service,大多数时候的应用场景是:应用在未使用时也能够收到消息。所以默认是 Service 长驻后台的。 JPush 提供 stopPush 方法,为有特殊需要的应用场景提供方便,PushService 不会长驻内存。   但为了维护完整性,JPush service 还是会被触发短期运行。



FallenPanda
FallenPanda
不过发现会出现一个特别小概率的事件... 用户退出——请求清空别名——用户登陆——设置别名——清空别名超时再次尝试——设置别名成功——清空别名成功...
FallenPanda
FallenPanda
谢谢你的回答~发问题的时候才初学Android几个月...对APP的生命周期还不是很理解,特别是带后台常驻进程的...见笑了... 现在我采用清空别名的方式,让用户退出之后只会收到appkey级的推送。
0
neavo
neavo
Activity都finish掉,自己的Service都stopSelf掉,其他的就别管了,本来Google就不希望大家手动去结束一个APP
FallenPanda
FallenPanda
主要是这个极光推送的PushService,无法控制...官方提问,也是草草的给出答案JPushInterface.stopPush(this),所以我做的最坏打算也是这样的...不管了...再加个持久层属性,是否已手动退出,围绕它做判断了...但是感觉这是不是弯路呢....
0
j
joln
额。关注一下,顺便咨询一下用JPUSH的感受,开发难度和调试成本如何,支持多少用户
FallenPanda
FallenPanda
还不错,推送及时率不错(看网络环境 - -),整合也很简单,自定义消息扩展性非常大...需求要求不高的话是个很好的选择。
0
q
quentin_chen
调用 JPushInterface.stopPush 之后服务会停止,但是服务在几分钟后会启动同步一下客户端SDK的状态,同步之后服务就不再启动了。所以stopPush是可以停止极关推送的服务的。
0
月满江天
月满江天

作为一个普通用户,十分反感国产手机应用退出后,还驻留一堆服务在内存里面。

于是我用Autostarts(自启管理)禁用了所有程序的自启意图。

每次应用退出后,都手动去“应用-正在运行”里面手动关闭所有服务。

可即便是这样,还是会有一堆垃圾服务不知何时就偷偷冒出来,占用大量的内存、CPU和网络流量。

哎,android上的流氓太多,等有钱还是换一个iphone吧。。。

FallenPanda
FallenPanda
其实一样的,只是 IOS 统一管理了 后台推送服务,google对于Android推送也有GCM,只是你懂的,国内无法稳定使用,没办法呀...
返回顶部
顶部