Comments (46)
不可避免,当系统内存非常紧张并且轮到 Service 进程被杀的时候,这时候在非 root 的 Android 手机/平板 都是无力回天的;一般来说系统杀掉 Service,过 5-10 秒会再次启动 Service(如果有应急机制)。
其实问题的实质就是:系统重启 Service 后,如何保持与重启前一样?
设置 onStartCommand() 的返回值(这里牵扯到 Service 的启动方式)。
onStartCommand() 有其中两个返回值:
START_STICKY:kill 后会被重启,但重启后调用 onStartCommand(Intent,int,int),但是传进来的 Intent这个参数为 null,
START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
当然还有一种流氓的做法来提升 Service 的优先级:使用startForeground(),但是下拉菜单会显示。
from android-discuss.
从用户角度讲,常驻后台这个事情我非!常!强!烈!的建议大家不要去做。无奈国内的环境才会想要这样干。
update: DELETED
from android-discuss.
微信在基本所有的国内清理软件的白名单里。
当你的应用不能用时,用户会说“什么破手机,连XX都不能用”的话,你的应用久在白名单里了。
服务因内存低被清理后,内存空余时就会自动恢复。
2015-08-19 15:46 GMT+08:00 onceyoung [email protected]:
那也就是说,微信在某些清理软件的白名单里了?不过我发现,杀微信的时候,微信的服务会出现“正在重新启动”这样的情况,说明还是杀掉了,不过自己重启了。
—
Reply to this email directly or view it on GitHub
#49 (comment)
.
from android-discuss.
其实还有一个很 hack 的方法,就是在服务的 onCreate 里面设置 startForeground(FOREGROUND_ID, new Notification.Builder(this).build());
用通知的方式来实现。这个时候其实相当于 app 是没有退出的。
但是这样有个不好的地方就是在原生 Android 会在顶栏提示“XXX正在运行”
from android-discuss.
很想知道WX的那个常驻服务是怎么实现的,怎么杀都杀不死?
自己写得常驻服务使用,强制关闭服务后会自动重启服务,但是使用某些第三方清理程序后,就不会再重启了。
另外贴一个服务相关的帖子.希望给你带来帮助。
http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html
from android-discuss.
如果只是Andorid自身机制,因为内存紧张导致service杀掉,可以采用onStartCommand()设置返回值方式
但如果是被 清理内存软件 杀掉,上面的方式都是失效了。
例如:微信,qq这种的,能看到有两个进程,但是不知道怎么实现的不被杀死,期待有人给出答案或者实现思路。
from android-discuss.
楼上,如果是因为系统内存紧张而把此 Service 杀死,同样也是不执行 onDestory的,所以您说的第二条是行不通的。
from android-discuss.
说个道听途说的,,各个清理内存软件有个白名单.....
from android-discuss.
@stackvoid 谢谢,已经改了
不知道有没有方式应对这种清理内存软件造成的service被杀死?
from android-discuss.
返回START_STICKY
另外可以将Service与UI部分的进程分离开,Service本身后台运行OOM_ADJ值是蛮低的,不会被LowMemoryKiller干掉。
from android-discuss.
@shcalm 从哪听的。。。靠谱不。。。
from android-discuss.
@chriszeng87 MIUI默认不清除QQ和微信的吧,这种应用不小心清了,会被小白骂的
from android-discuss.
做个搬运工,将需要常驻的服务另开进程
http://www.infoq.com/cn/presentations/from-360-development-see-big-mobile-application-development
from android-discuss.
楼上的楼上正解。360之类的就是fork出c进程,多进程守护。死循环在那检查是否还存活,简直丧心病狂。手机能不耗电嘛!哎
from android-discuss.
fork出来子进程 那位楼主说得对
from android-discuss.
@pcqpcq 这个方法我用过 不过在miui上还是会被杀掉 ,请问下你试过吗
from android-discuss.
Dear all,
大家有没有考虑过一个问题,如果系统被 root 了,Service拿到 root 权限并且运行在单进程中,此时我将此 Service 权限无限提升,甚至提升到比 init 进程还高,此时 Service 岂不是永生了(除非掉电)..........
from android-discuss.
@liuchenx 我这里提到的只是核心的实现,要兼容以及稳定还需要其他额外的事情,我没写出来是不想这个做法太多人用。你可以再研究下,有办法兼容的~
from android-discuss.
不建议这么做,只会坑自己和设备性能
from android-discuss.
看看鹅厂的黑科技
手机QQ后台为何清不掉?MIUI工程师:全靠1像素的页面保命
from android-discuss.
startForeground第一个参数传入0的话就不会在通知栏显示啦
from android-discuss.
android 5.0用fork的方法不起作用..因为5.0的代码会把processgroup全部停掉.
一像素的那个还没实验过....
from android-discuss.
@pcqpcq Android 5.0上采用fork的方式是无法起作用的,当父进程被杀死的时候,对应fork出来的子进程会被系统主动调用waitpid将其停止并回收.这修改应该是google觉得之前不作限制的话太流氓了,会影响整个android的运行环境. 可以看得出来,从android4.4开始,会对权限的把控越来越严格,让android系统生态越来越健康
from android-discuss.
from android-discuss.
鹅厂的一像素是怎么做到的,有人能给个思路么
from android-discuss.
是不是宽和高都是1sp?
from android-discuss.
求给思路,一像素。。。(欢迎来这里 : E家课堂 http://www.ejiakt.com)
from android-discuss.
先在手机都带一键杀死功能,引导加入白名单吧
from android-discuss.
目前我也在做这方面的研究,除了fork子进程,还有其他办法吗?根据楼上的说法,好像5.0也没法用了。
from android-discuss.
做前台服务,优先级和前台应用一个级别
2015-08-19 15:20 GMT+08:00 onceyoung [email protected]:
目前我也在做这方面的研究,除了fork子进程,还有其他办法吗?根据楼上的说法,好像5.0也没法用了。
—
Reply to this email directly or view it on GitHub
#49 (comment)
.
from android-discuss.
做前台只能提高服务优先级吧,但被那些垃圾清理之类的软件杀掉的时候,好像并不能解决。
from android-discuss.
引导加白名单
Root想要杀你的时候,你是没有办法的。
2015-08-19 15:36 GMT+08:00 onceyoung [email protected]:
做前台只能提高服务优先级吧,但被那些垃圾清理之类的软件杀掉的时候,好像并不能解决。
—
Reply to this email directly or view it on GitHub
#49 (comment)
.
from android-discuss.
那也就是说,微信在某些清理软件的白名单里了?不过我发现,杀微信的时候,微信的服务会出现“正在重新启动”这样的情况,说明还是杀掉了,不过自己重启了。
from android-discuss.
在系统的限制下,从两个方面考虑,一是提升进程优先级,保证不被轻易的 kill 掉,二是当系统资源短缺不得不 kill 掉我的进程时,期待系统资源充足的时候,重新启动我的服务。
后者,通过在 onStartCommand返回不同的值现实不同的策略,如果想要系统重新启动服务,使用START_STICKY 或者 START_REDELIVER_INTENT。
前者可以通过 startForeground将进程设置为前台进程,除非在系统内存非常缺,否则此进程不会被 kill。还可以通过把 Service 放在单独进程执行,这样占用的内存更少,系统不会盯上它(在系统内存吃紧的情况下会去会砍掉内存占用较多的进程)。
from android-discuss.
加入白名单了就不会被kill掉了吗?
from android-discuss.
这个问题也困扰了我很久,确实,加入各大安全应用商白名单,是一个解决办法,至于NDK开发,也许还是一条探索的路。像魅族系统,它能直接把 极光推送直接kill掉,不能重启。试问,我们要做社交应用的,不能常驻后台,将会是一个大问题。
from android-discuss.
在5.0以上,可以使用NotificationListenerService,这样的话在有Notification发出的时候,app都可以收到,不过因为能够接触到所有其他的应用的通知,比较敏感
from android-discuss.
@a23qws 能否详细说下
from android-discuss.
@aoqianglin
NotificationListenerService,继承自这个类的服务,系统会将此服务作为系统服务的一部分,所以不会被杀死,具体你看看文档就好了,文档是最清楚的
from android-discuss.
@a23qws 这种方式可行性不高,有360手机助手在除了华为上,其他5.0上下都杀不死的原理的建议吗
from android-discuss.
@OnceYoung 你写一个demo把包名改成微信,什么也不做也杀不死,这就是一个微信已经强大到没人去杀他了
from android-discuss.
@aoqianglin
如果你没有尝试过这个方案,就先去试一下。
from android-discuss.
@a23qws 试了,要进入系统权限页面获取权限才行,难道可以破解这个权限?
from android-discuss.
最近在做桌面小控件含时钟,想解决被内存清理杀死的问题。
我观察了墨迹天气,进程都被杀死了,不知道为啥桌面的插件时钟居然没停止。
from android-discuss.
关于widget的存活,我没有深入研究。如果你有发现,告诉我们
Sent from Nylas N1, the extensible, open source
mail client.
On 5月 18 2016, at 2:21 下午, thinking1001 <[email protected]>
wrote:
最近在做桌面小控件含时钟,想解决被内存清理杀死的问题。
我观察了墨迹天气,进程都被杀死了,不知道为啥桌面的插件时钟居然没停止。—
You are receiving this because you were mentioned.
Reply to this email directly or [view it on GitHub](https://github.com
//issues/49#issuecomment-219935477)![](https://githu
b.com/notifications/beacon/AEimvOgcJU53a_KnXhES2X0q3hl5Wk6Wks5qCq_ygaJpZM4DtaM
I.gif)
from android-discuss.
- 双Service方式
- 守护进程
- AccountSync
http://skyseraph.com/2016/06/19/Android/%E4%B8%80%E7%A7%8D%E6%8F%90%E9%AB%98Android%E5%BA%94%E7%94%A8%E8%BF%9B%E7%A8%8B%E5%AD%98%E6%B4%BB%E7%8E%87%E6%96%B0%E6%96%B9%E6%B3%95/
from android-discuss.
Related Issues (20)
- 微信朋友圈是怎么做到点击图片看大图可以一直滑,查看你的所有图片的(从你的第一条可以一直滑到最后一条),是不是做了数据库缓存,然后分页拿?不然这么多数据 intent 传值也会超过限制大小吧。会是什么策略呢? HOT 1
- 【求助】Android9.0 AudioManager丢失音频焦点无效问题
- Retrofit GsonConverterFactory 解析带有转义符的数据 HOT 3
- 各位遇到过对自己的内部存储空间没有访问权限的情况吗? HOT 16
- 【求助】gradle中的依赖报错,已经配置了项目仓库但是还是无法解析是什么原因?
- 华为P20 QQ 微信打开文件-其他应用打开,显示不出自己的应用图标是咋回事 HOT 6
- 怎么在VS上打开github考下来的项目?需要哪些软件?
- 【问答】国产手机如何获取锁屏通知、横幅通知权限是否打开? HOT 5
- 【提问】为什么 codekk 需要 github 用户所有的写入权限
- 【问答】Android 中通过MediaPlayer播放视频如何切换原伴唱 HOT 2
- [问答] 使用蓝牙耳机的麦克风录音的方案有哪些?
- [问答]Android SN就是存储在/vendor/nvdata/APCFG/APRDEB/PRODUCT_INFO的前64位吗?
- []
- [问答] 如何让自己的 app 中禁用第三方软件的 AccessibilityService 对其操作。
- 短视频模替换素材是怎么实现的?
- 怎么限制FlexboxLayout 一行显示的个数再换行
- Android组件化后 本地数据库如何设计 HOT 2
- 怎么限制FlexboxLayout的行数,并且多出的部分在末尾显示.....? HOT 1
- vivo 应用市场的包,无法自动更新 HOT 1
- room 存取操作
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from android-discuss.