最近在开发一个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 推送服务完全被停止。具体表现为:
如果我要实现,退出应用,一个是完全退出,一个是后台运行,后台运行简单,关闭所有activity就行了...那如果是完全退出应用,即退出时关闭极光推送服务(或者理解为不再接受推送),要怎么办呢?或者说有什么好的策略呢?有更好的APP退出策略(涉及有后台Service的)求分享...
看了JPush虽然提供设置接收推送时间,但是...看了说明(如果不在该时间段内收到消息,当前的行为是:推送到的通知会被扔掉。)就直接放弃了...
本人初学Android时间不长,如有说错的地方大神们请见谅,口下留情...希望能给些建议,万分感谢!
Hi, 楼主,
我是极光推送 Javen。
坦率地说,我们设计 JPush SDK stopPush 功能时,还真没有太考虑一个应用想要:退出时要杀死自己的情况。
因为,这不是一个好的实践,很明显是违反 Android/iOS 操作系统的设计的。智能手机 OS 设计的一个基本概念就是:App 的生命周期 OS 自己来管理。
一个应用退出后,进程是否立即退出,应该是 OS 层面来统一管理维护的。 如果你的 App 有 Servcie 长驻,的确整个进程被杀死(以释放必要的资源)的概率会小些。
JPush 提供 Push Service,大多数时候的应用场景是:应用在未使用时也能够收到消息。所以默认是 Service 长驻后台的。 JPush 提供 stopPush 方法,为有特殊需要的应用场景提供方便,PushService 不会长驻内存。 但为了维护完整性,JPush service 还是会被触发短期运行。
作为一个普通用户,十分反感国产手机应用退出后,还驻留一堆服务在内存里面。
于是我用Autostarts(自启管理)禁用了所有程序的自启意图。
每次应用退出后,都手动去“应用-正在运行”里面手动关闭所有服务。
可即便是这样,还是会有一堆垃圾服务不知何时就偷偷冒出来,占用大量的内存、CPU和网络流量。
哎,android上的流氓太多,等有钱还是换一个iphone吧。。。
######其实一样的,只是 IOS 统一管理了 后台推送服务,google对于Android推送也有GCM,只是你懂的,国内无法稳定使用,没办法呀...版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。