如何让你的App永远在

如何让你的App永远在后台存活:对Android进程守护、闹钟后台被杀死的研究
相关阅读:
公众号:Java和Android架构
关注回复:,,,,,, ,AI,,,c++,J2EE等关键字就能免费获取学习资料视频
最近公司要求要做一个提醒功能,一说到提醒,那肯定就和闹钟差不多的意思,那么肯定就要用到AlarmManager。
但是,我们知道,android系统很坑爹,不同的厂商对rom的定制,导致对进程的管理都不太相同,但是如何做到在各个手机上都能一直保持后台执行呢?。
为了解决这个问题,特地去研究了各种保持进程不被杀死的方法。
下面对几种常见的用法进行了分析,并且给出了我自己发现的一个保持进程运行的方法。
方法1:在原生的Android系统上使用AlarmManager
方法2:通过AIDL实现双进程守护机制
方法3:MarsDaemon第三方库,实现进程常驻
方法4:通过AppWiget,android桌面小组件保持进程的运行
下面是具体分析
方法1:在原生的Android系统上使用AlarmManager
“原生”这个词就对这个方法的限定很大了。我尝试了很多次,在原生的操作系统中,不需要特殊的去调用service处理。直接在某个Activity中通过AlarmManager的set和setRepeating方法设置定时后,就去杀了进程,测试结果显示,闹钟还是可以继续响的。但是这种不去特殊处理的,在第三方的rom基本都是不行的,相信大家每人敢用,因此知道就可以了
方法2:通过AIDL实现双进程守护机制
网上有很多关于AIDL实现双进程守护机制的文章,内容都是差不多,关于这种方法,都是通过在MainFest文件中指定某个Service android:process=":remote",这样就可以使这个service单开一个进程来运行。在主进程中有一个MainService,一旦RemoteService所在进程被杀死,MainService就会立刻去重新启动它,同样的,当MainService被杀死了,RemoteService就会去启动MainService,两个进程的两个Service互相监控来实现进程不销毁。
大致方法为:
1、创建一个IMyAIDLInterface.aidl文件
// IMyAidlInterface.aidl
package com.xiaoqi.
interface IMyAidlInterface {
String getServiceName();
2、创建一个LocalService:
public class LocalService extends Service{
public IBinder onBind(Intent intent) {
public void onCreate() {
super.onCreate();
binder = new MyBinder();
conn = new MyConn();
class MyBinder extends IMyAidlInterface.Stub {
public String getServiceName() throws RemoteException {
return LocalService.class.getSimpleName();
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(LocalService.this, " 本地服务活了", Toast.LENGTH_SHORT).show();
this.bindService(new Intent(LocalService.this,RomoteService.class),conn, Context.BIND_IMPORTANT);
return START_STICKY;
class MyConn implements ServiceConnection{
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("yangqing", "绑定上了远程服务");
public void onServiceDisconnected(ComponentName name) {
Log.i("yangqing", "远程服务被干掉了");
Toast.makeText(LocalService.this, "远程服务挂了", Toast.LENGTH_SHORT).show();
//开启远程服务
LocalService.this.startService(new Intent(LocalService.this,RomoteService.class));
//绑定远程服务
LocalService.this.bindService(new Intent(LocalService.this,RomoteService.class),conn,Context.BIND_IMPORTANT);
public void onDestroy() {
super.onDestroy();
//开启远程服务
LocalService.this.startService(new Intent(LocalService.this,RomoteService.class));
//绑定远程服务
LocalService.this.bindService(new Intent(LocalService.this,RomoteService.class),conn,Context.BIND_IMPORTANT);
3、创建一个RemoteService:
public class RomoteService extends Service{
public IBinder onBind(Intent intent) {
public void onCreate() {
super.onCreate();
conn = new MyConn();
binder = new MyBinder();
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, " 远程服务活了", Toast.LENGTH_SHORT).show();
this.bindService(new Intent(this, LocalService.class), conn, Context.BIND_IMPORTANT);
return START_STICKY;
class MyBinder extends IMyAidlInterface.Stub {
public String getServiceName() throws RemoteException {
return RomoteService.class.getSimpleName();
class MyConn implements ServiceConnection {
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("yangqing", "绑定本地服务成功");
// Toast.makeText(RomoteService.this, "绑定本地服务成功", Toast.LENGTH_SHORT).show();
public void onServiceDisconnected(ComponentName name) {
Log.i("yangqing", "本地服务被干掉了");
Toast.makeText(RomoteService.this, "本地服务挂了", Toast.LENGTH_SHORT).show();
//开启本地服务
RomoteService.this.startService(new Intent(RomoteService.this, LocalService.class));
//绑定本地服务
RomoteService.this.bindService(new Intent(RomoteService.this, LocalService.class), conn, Context.BIND_IMPORTANT);
public void onDestroy() {
super.onDestroy();
//开启本地服务
RomoteService.this.startService(new Intent(RomoteService.this, LocalService.class));
//绑定本地服务
RomoteService.this.bindService(new Intent(RomoteService.this, LocalService.class), conn, Context.BIND_IMPORTANT);
4、在AndroidMainfest文件中注册:
&service android:name="com.xiaoqi.alarmmanagerdemo.LocalService"&
&/service&
&service android:name="com.xiaoqi.alarmmanagerdemo.RomoteService" android:process=":romoteservice"&
&/service&
使用方法:
Intent service = new Intent(this,LocalService.class);
startService(service);
Intent remoteService = new Intent(this,RomoteService.class);
startService(remoteService);
这样就可以了,但是经过测试发现,我们在应用管理中,会发现确实有两个进程,我们单独的去关闭一个,另一个马上就会把它开启,但是如果我们之间去杀进程,发现只有在vivo手机中,确实可以保持不被杀死,但是在其他手机中,整个后台进程还是被杀死了。说明这个方法也不是很可靠的。方法3:MarsDaemon第三方库,实现进程常驻
守护进程也有第三方库,相信很多人都没想到吧
这个库的使用也非常简单,底层通过jni来实现了进程守护,这边就不给出使用方法了,直接在github上看就行了。
但是我实际使用发现,在华为机器上依然不能进程保持运行,只要一清理,后台的闹钟就没有效果了。但是在某些机型上还是可以用的,可靠性比通过AIDL的双进程守护效果好,可是依然不能保证运行。
方法4:通过AppWiget,android桌面小组件保持进程的运行
尝试了网上的很多方法,都是进程一清理,所以程序都被停止了,尤其在华为手机上,360都没法保持一直运行,因此我觉得这个想让后台服务永久运行的想法越来越不可靠。
我在应用商店上下载了一个排行第一的闹钟软件,但是经过多次测试,结果都是一样,想要后台进行,基本是不可能。QQ是通过一个像素点,一直显示在最前,这种黑科技来保持进程一直在,于是我想到了,如果我们添加一个桌面组件来,这样这个组件也是App的一部分, 但它却一直运行在那,这样是否就可以让进程杀死了,程序还是能运行呢?
于是我测试了一下,写了一个很简单AppWidget组件,在AppWifgetProvider中,写了一个简单的闹钟程序,并且让AppWidget中的TextView的数字一直自增1。写完之后我测了一下,发现这个方法是可行的。即使是在华为手机上,我把进程清理了,闹钟还是会响,AppWidget上的数字也一直在更新。
关于AppWidget的写法网上也很多,这边就不具体给出了。在测试这个方法的时候,我发现刚刚下载的闹钟软件也有桌面小组件,我添加了之后,再进行闹钟测试,居然发现,在进程杀死后,闹钟居然可以继续执行,即使是锁屏状态,很明显,这个软件使用的方法和我想到的是一样的。
通过AppWidget来保持进程中代码的执行,这个应该还其他博客中还没有被提到,这个方法相比其他的方法而言,已经是非常可靠的了。但是这个局限也挺大,就是必须通过一个AppWidget来实现。
关于进程守护已经分析完了,如果有什么更好的方法,欢迎大家分析。
Demo下载地址:
关于Java和Android大牛频道
Java和Android大牛频道是一个数万人关注的探讨Java和Android开发的公众号,分享和原创最有价值的干货文章,让你成为这方面的大牛!
我们探讨android和Java开发最前沿的技术:android性能优化 ,插件化,跨平台,动态化,加固和反破解等,也讨论设计模式/软件架构等。由一群来自BAT的工程师组成的团队。
关注即送红包,回复:“百度”
、“阿里”、“腾讯” 有惊喜!!!关注后可用入微信群。群里都是来自百度阿里腾讯的大牛。
欢迎关注我们,一起讨论技术,扫描和长按下方的二维码可快速关注我们。或搜索微信公众号:JANiubility。
公众号:JANiubility
没有更多推荐了,请问怎样才没让安卓app永远不提示更新,想一直用老版本??_百度知道
请问怎样才没让安卓app永远不提示更新,想一直用老版本??
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
看到很多朋友问怎么去除APP STORE的更新提示,大部分FY给出的建议都是用appflow,但是用appflow的话你会发现,只能暂时的去掉更新提示,你再打开一边应用程序会发现那个数字又出来了。在这里给大家介绍一种更加简便,可以一次性解决这个问题的方法: 用ifunbox或者ifile,打开文件var/mobile/applications,找到appflow中提示要更新的软件或游戏的文件夹(如果用ifile的话,在设置里把应用程序名称设置为开),打开相应的文件夹后找到名为:iTunesMetadata.plist 的文件,直接删除,以后这个软件或游戏就永远不会提示更新了!
查看原帖&&
VpnVip资讯教程,软件使用平台。
操作系统/系统故障
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。注册 | 登录
混迹网咖第一人
零基础学产品,BAT产品总监带,2天线下集训+1年在线课程,全面掌握优秀产品经理必备技能。
App Store 里面一直存着在抄袭问题,这一点这些年来我们已经心知肚明。在创新与抄袭之间有着泾渭分明的界限,在我们进一步讨论抄袭问题之前,有必要先探索一番这条界限到底为何,并且对于抄袭者给出更为明确的界定。
作家 Austin Kleon 曾经说过真正的艺术家都是小偷,史蒂夫 o 乔布斯也说过类似的话。(「我们总是对于自己窃取了伟大创意而感到羞愧。」)
艺术家所谓的窃取创意其实是吸取灵感的一种方式。他们从一些了不起的创意中得到启发,然后再加入自己的想法使其成为一个新东西,或者是试图在原有的基础的上将其朝着另一个方向改进。他们的目标是找到现有的最好产品,然后在这个基础上更进一步,或者是为其增添新的用途。这是很多创业者在做的事情,他们的产品灵感源于不同的来源,博采众家之长去创建自己的产品。(可借鉴的部分包括产品发展历史、产品设计、风格、App 功能等等)
而抄袭者完全不照这一套来。他们没有任何想要改进产品的欲望,他们找到一个 App 也不是为了参考或者研究。对他们而言,研发就意味着抄袭与复制。他们会复制别人产品的核心功能、用户界面甚至是产品名称与品牌,他们所做的这一切都是为了从别的 App 手中抢走用户。抄袭者不想要费心去创新,他们唯一所做的事情就是从别人辛苦开发的产品中获取名声或者经济利益。
很明显,我自己团队的开发产品也曾遭遇过抄袭。我们的利益被抄袭者侵害,然而却很少能够做出有效的还击。
面对自己花费了数月(甚至数年)开发的独一无二产品被抄袭,是非常令人沮丧的。如果你从事创意开发工作,或者本身就是一个 App 开发者,你应该积极行动不让那些抄袭犯去烦扰你,并且通过自己的还击让损失降到最低。
被抄袭并非一无是处
不管你信还是不信,被抄袭犯盯上其实也有一些好处。
那些山寨 App 固然很恼人,但是它们进一步证明了你的产品思路是正确的。
有时候,你的产品频频遭批同时也意味着你拥有一帮死忠粉丝。(比如说 Yo,Apple Watch 以及初代 ipad。)
同样的道理,你的产品被人抄袭了也暗示着你确实做出了一款有用或者说有吸引力的产品。正因为你的产品有可取之处,才会被人盯上并试图从中牟利。抄袭者都精明的很,他们明白你的产品可能会在市场中引领风骚,有利可图,因此才会将抄袭你的作品当做一条获利的捷径。
事实上,大多数山寨产品是不能对你的产品或者团队造成真正威胁的。你瞧,他们根本就没有像你一样用心投入产品,他们的山寨 App 中没有血汗与泪水,更没有灵魂。他们抄袭出来的产品也许和你的产品长得很像,但是两者从跟上的 DNA 就是不同的。更进一步说,那些抄袭 App 的人永远只能活在过去,他们所能做的事情就是亦步亦趋在你的产品对外发布新版本的时候再抄一次。
即使是世界上最具创新精神的公司也难免会抄袭别人的产品创意,虽然他们有着强大的资源与用户基础,但是仍然不能取得成功。比如说 Facebook 就无法通过 Poke 或者 Slingshot 去打败 Snapchat。
所以你可以不将当山寨 App 当成一回事,但是你要注意他们的最新动向。如果这些抄袭者已经越界,也许是窃取了你的产品名称,或者是想要复制你的品牌,这些都是不能容忍的。如果你因此气得冒烟,决定采取行动给予反击,我绝对支持!反击一事势在必行,但是又令人无从下手,现在就让我们看看你具体能够做些什么。
如何回击步步紧逼的抄袭者
在你开始反击之前,你首先要做的就是冷静思考。
耐心等待,评估局势,让你暴怒的心情缓和下来。如果你想要打击抄袭者,那么一定要带上一颗冷静的大脑。你的时间和精力是有限的,所以在展开这场战役之前就要仔细考虑。
下面将告诉你我们团队的 App 是如何被人抄袭,以及我们是如何作斗争的故事。
第一个受害者——出现在 iOS 上的山寨 App
2013 年的夏天我们在 iOS 平台上发布了一款名为 Wake Alarm 的闹钟应用,它美观好用,耗费了我们 6 个月的时间进行迭代开发。这款 App 推出以后反响很好,Wake Alarm 迅速成为了排名第一的实用 App,并且打入了收费 App 的前三十榜单。Wake Alarm 在 App Store 中是一款个性突出的产品,它受到了来自 Lifehacker、Fastco、Coolhunting、TUAW 以及 AppAdvice 这些我喜爱的网站的好评。
一开始,我们设计 Wake Alarm 的初衷就是想要在浩如烟海的闹钟类 App 中独树一帜。我们的目标是颠覆人们数年来(也可能是数十年)对于闹钟的固有使用习惯,带给世界一种全新的帮助你起床的产品。如果你曾经使用过 Wake Alarm,就知道可以通过翻转手机、摇动或者拍打来将闹钟暂停,就像小睡。
发布了 App 几个月之后,当我在做一些关键字研究的时候,居然在 App Store 里面发现了一款名为 Wake Alarm Clock 的闹钟应用。真有趣,我点进页面一探究竟。
这款应用的详情页和我自己产品的详情页如出一辙,连截屏上显示的时间 8:24 都似曾相似。
这个闹钟 App 的开发者 Pedro Fernandes 将我的产品功能照搬了过去,翻转、拍打、摇一摇都被他抄了过去。就抄袭功能这件事情本身来说,我觉得这种彻头彻尾的模仿其实是一种奉承,就像苹果首创的下拉刷新如今已经成为 App 中非常普遍的互动设计。然而这款 App 并不仅仅是向我的产品致敬而已,它的应用描述简直就是直接把将我的产品描述复制粘贴过去。
这款 App 起了一个与我们产品类似的名字,与我的产品有着看上去几乎一致的截图和非常类似的功能描述。还等什么呢,我开始与苹果官方联系设法处理这一起侵权纠纷。苹果公司联系了我们,但是对方的开发者并不配合,因此我的维权无法取得实际的进展。当我发现这款山寨 App 并没有得到多少关注之后,就没有再与这个抄袭犯过多纠缠。这款山寨 App 并没有起到它预计中的迷惑用户的目的,它虽然想要伪装成正牌 Wake Alarm,但是并未成功。我虽然一开始准备狠狠回击,但是却不想要浪费过多的时间在一场看上去毫无意义的战斗上。
第二块沦陷的阵地——Android 上也出现了山寨版
不久之后,我开始从朋友那里得到消息说市面上出现了一批山寨 App。其中有一个做的尤为过分,我们的正版 Wake Alarm 只在 iOS 平台的 App Store 中可以下载,而这一款山寨 App 将我们的产品照搬到了 Android 平台上。这个藏在 Android 平台上的山寨产品已经累积了几百万的下载量。不像在 App Store 中的那一个山寨产品,这一款 Android 抄袭者已经成功地欺骗了用户,让他们相信自己所下载的 App 就是我们官方出品。
Google Play 中的山寨 App
App Store 中的原版 App
这已经触及了我们的容忍底线,我决定给予还击。
我所采取的第一步措施就是截图保留证据。同时我还与几位律师取得了联系,指出我才是这款产品的原创者。然后我联系了谷歌公司,我们仍然想要在谷歌的程序之内解决这个问题,不幸的是谷歌方面不能提供给我任何帮助。我们团队还没有开发很多 Android 产品,所以这确实不算是一件特别紧急的事情,但是它却已经成为了一个严重的问题。
不走运的是这件事还没完,我们发现这些山寨产品开始变本加厉、明目张胆地抄袭了。如果你也遇到了一个一直跟在你屁股后面不停抄抄抄并以此迷惑用户的抄袭者,下述反击方法供你参考。
直接与抄袭者对话
就像我在上文中提到的那样,我第一次在 iOS 中看到山寨产品时并没有揪着不放,因为他并没有做得太过明显。但是当我发现这个山寨 App 开始支持 Apple Watch 的时候,我觉得事情的性质已经变了。因为我们自己的官方 App 还未支持 Apple Watch,所以出现在苹果表上的山寨产品会混淆用户的视听。因此我在发现这一情况后立即就像苹果公司提交了侵权报告。
我和这款山寨 App 的开发者互相交换了邮箱,并且打了电话沟通。在电话中他承认自己确实抄袭了我们的产品,并且让用户误以为他所开发的山寨闹钟 App 就是自己要找的 Wake Alarm。在沟通之后他对于产品名称和截图做出了一些修改,我的团队认为修改后的版本还是可以接受的,这事情就算了结了。
时至今日,在我们刚刚发布 Next Keyboard 之后,就已经发现了好几款山寨产品。在我们发布的第一款应用 Pocket Zoo 时,也遇到了类似的问题。
原创者们并不是软弱无力的,你可以通过沟通来解决问题。
公开讨伐抄袭者
我不喜欢让人下不了台,我乐意与全世界分享我的 App,对于公开讨伐、羞辱抄袭者这件事我并没有太大兴趣。
然而有时候你面对抄袭者必须要将行动升级。比如说 Instagram 曾经将一个普通用户的用户名转给一个名人使用,Instagram 的支持团队对于这名普通用户的申诉毫无反应,后者不得已将这件事情写成文章发表在 Medium 上引来了众多关注。直到这件事情被捅出来之后,Instagram 的支持团队才立即开始处理问题,公开道歉,并且为其找回了账户。
公然抄袭是一件可耻的事情。你应该向公众揭示其抄袭者的真面目,让他也感受下什么叫做羞耻。这种做法也许会让抄袭者对自己的所作所为感到内疚或者羞愧,尤其是他所在的圈子都得知此事时。让某人下不了台的感觉并不好,而且实际上这种做法还增加了抄袭者的曝光度,所以要谨慎地使用这一招(通常来说这是忍无可忍的最后一招)。
专注于未来
要记住,抄袭者永远只能跟在你的屁股后面。他们只能从你已经发布的版本中复制粘贴,却不可能偷走你未来的产品计划,除非你自己大嘴巴满世界乱说。他们也偷不走你的忠实用户与市场。
出现抄袭者会令人心情不爽,但是别让他们阻碍你原有的前进步伐。你要做的是将那些抄袭者远远甩在身后,你还有更重要的事情需要去考虑。升级你的产品,仔细思考现有产品中那一部分应该提炼升华,哪一部分应该拓展并进一步创新。倾听你的用户,思索你未来的发展道路,不要总在后视镜里盯着那些追着你跑的抄袭者。
看到自己倾注了心血的产品被全盘抄袭,那是一种糟透了的感受。有人会说,「模仿就是最真诚的恭维方式,」但是这其实也是一种最偷懒的方式。最为一个乐观主义者,你的产品被抄袭了并非一无是处,至少证明你还值得被抄袭,但是说老实话,其负面影响要大得多。
抄袭者一心想要偷懒,这种行为是不能被接受的。如果你的产品的确实用且独特,那么出现抄袭者也是难免的。不要和这些人过多纠缠,除非他们已经在实际上误导了你的用户或者分走了属于你的 App 的注意力,你应该关注未来并且持续开发新产品。切莫因为和抄袭者开撕而让他们增加曝光度。
即便是像 iPhone 这样了不起的产品,也汲取了很多前人的创意。很显然,研发产品的人们会继续从前人那里窃取灵感。我的团队也会这么做。在借鉴灵感与山寨抄袭之间存在着一条界限,那就是看你是否为其添加了更多的创新、个性与改良。真心希望全盘复制的抄袭者会越来越少,希望那些曾经的抄袭者能够转型去对产品做一些实际的改造,加入自己的原创思路。如果能够有更多的人在 App Store 中发布他们的原创产品,那么 App 开发者的生存环境将变得更好,挣得更多,只有这样原创开发者才能获得与他们的辛勤劳动匹配的回报。
文章来源:,由 TECH2IPO / 创见 陈铮 编译,首发于创见科技
版权声明:若该文章涉及版权问题,请联系我们主编,QQ:
收藏已收藏 | 4赞已赞 | 3
混迹网咖第一人
产品经理群
运营交流群
品牌营销群
文案交流群
Axure交流群
关注微信公众号
大家都在问
4个回答10人关注
11个回答12人关注
2个回答5人关注
8个回答8人关注
9个回答13人关注
15个回答16人关注怎样让一款app在手机上永远消失,搜也搜不到_百度知道
怎样让一款app在手机上永远消失,搜也搜不到
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
这个是办不到的,只能卸载删除,只是你手机没有了这款app,但是软件商店或手机浏览器里搜索即可找到,你是没有办法把这些里的app删除的
采纳率:92%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。保持应用后台,熄屏状态下继续运行
如何让你的App永远在后台存活:对进程守护、闹钟后台被杀死的研究。
最近公司要求要做一个提醒功能,一说到提醒,那肯定就和闹钟差不多的意思,那么肯定就要用到AlarmManager。
但是,我们知道,android很坑爹,不同的厂商对rom的定制,导致对进程的管理都不太相同,但是如何做到在各个手机上都能一直保持后台执行呢?。
为了解决这个问题,特地去研究了各种保持进程不被杀死的方法。
下面对几种常见的用法进行了分析,并且给出了我自己发现的一个保持进程运行的方法。
方法1:在原生的Android系统上使用AlarmManager
方法2:通过AIDL实现双进程守护机制
方法3:MarsDaemon第三方库,实现进程常驻
方法4:通过AppWiget,android桌面小保持进程的运行
下面是具体分析
方法1:在原生的Android系统上使用AlarmManager
“原生”这个词就对这个方法的限定很大了。我尝试了很多次,在原生的操作系统中,不需要特殊的去调用service处理。直接在某个Activity中通过AlarmManager的set和setRepeating方法设置定时后,就去杀了进程,测试结果显示,闹钟还是可以继续响的。但是这种不去特殊处理的,在第三方的rom基本都是不行的,相信大家每人敢用,因此知道就可以了
方法2:通过AIDL实现双进程守护机制
网上有很多关于AIDL实现双进程守护机制的文章,内容都是差不多,关于这种方法,都是通过在MainFest文件中指定某个Service android:process=":remote",这样就可以使这个service单开一个进程来运行。在主进程中有一个MainService,一旦RemoteService所在进程被杀死,MainService就会立刻去重新启动它,同样的,当MainService被杀死了,RemoteService就会去启动MainService,两个进程的两个Service互相监控来实现进程不销毁。
大致方法为:
1、创建一个IMyAIDLInterface.aidl文件
//IMyAidlInterface.aidl
packagecom.xiaoqi.
interfaceIMyAidlInterface{
StringgetServiceName();
2、创建一个LocalService:
publicclassLocalServiceextendsService{
publicIBinderonBind(Intentintent){
publicvoidonCreate(){
super.onCreate();
binder=newMyBinder();
conn=newMyConn();
classMyBinderextendsIMyAidlInterface.Stub{
publicStringgetServiceName()throwsRemoteException{
returnLocalService.class.getSimpleName();
publicintonStartCommand(Intentintent,intflags,intstartId){
Toast.makeText(LocalService.this,"本地服务活了",Toast.LENGTH_SHORT).show();
this.bindService(newIntent(LocalService.this,RomoteService.class),conn,Context.BIND_IMPORTANT);
returnSTART_STICKY;
classMyConnimplementsServiceConnection{
publicvoidonServiceConnected(ComponentNamename,IBinderservice){
Log.i("yangqing","绑定上了远程服务");
publicvoidonServiceDisconnected(ComponentNamename){
Log.i("yangqing","远程服务被干掉了");
Toast.makeText(LocalService.this,"远程服务挂了",Toast.LENGTH_SHORT).show();
//开启远程服务
LocalService.this.startService(newIntent(LocalService.this,RomoteService.class));
//绑定远程服务
LocalService.this.bindService(newIntent(LocalService.this,RomoteService.class),conn,Context.BIND_IMPORTANT);
publicvoidonDestroy(){
super.onDestroy();
//开启远程服务
LocalService.this.startService(newIntent(LocalService.this,RomoteService.class));
//绑定远程服务
LocalService.this.bindService(newIntent(LocalService.this,RomoteService.class),conn,Context.BIND_IMPORTANT);
3、创建一个RemoteService:
publicclassRomoteServiceextendsService{
publicIBinderonBind(Intentintent){
publicvoidonCreate(){
super.onCreate();
conn=newMyConn();
binder=newMyBinder();
publicintonStartCommand(Intentintent,intflags,intstartId){
Toast.makeText(this,"远程服务活了",Toast.LENGTH_SHORT).show();
this.bindService(newIntent(this,LocalService.class),conn,Context.BIND_IMPORTANT);
returnSTART_STICKY;
classMyBinderextendsIMyAidlInterface.Stub{
publicStringgetServiceName()throwsRemoteException{
returnRomoteService.class.getSimpleName();
classMyConnimplementsServiceConnection{
publicvoidonServiceConnected(ComponentNamename,IBinderservice){
Log.i("yangqing","绑定本地服务成功");
//Toast.makeText(RomoteService.this,"绑定本地服务成功",Toast.LENGTH_SHORT).show();
publicvoidonServiceDisconnected(ComponentNamename){
Log.i("yangqing","本地服务被干掉了");
Toast.makeText(RomoteService.this,"本地服务挂了",Toast.LENGTH_SHORT).show();
//开启本地服务
RomoteService.this.startService(newIntent(RomoteService.this,LocalService.class));
//绑定本地服务
RomoteService.this.bindService(newIntent(RomoteService.this,LocalService.class),conn,Context.BIND_IMPORTANT);
publicvoidonDestroy(){
super.onDestroy();
//开启本地服务
RomoteService.this.startService(newIntent(RomoteService.this,LocalService.class));
//绑定本地服务
RomoteService.this.bindService(newIntent(RomoteService.this,LocalService.class),conn,Context.BIND_IMPORTANT);
4、在AndroidMainfest文件中注册:
使用方法:
Intentservice=newIntent(this,LocalService.class);
startService(service);
IntentremoteService=newIntent(this,RomoteService.class);
startService(remoteService);
这样就可以了,但是经过测试发现,我们在应用管理中,会发现确实有两个进程,我们单独的去关闭一个,另一个马上就会把它开启,但是如果我们之间去杀进程,发现只有在vivo手机中,确实可以保持不被杀死,但是在其他手机中,整个后台进程还是被杀死了。说明这个方法也不是很可靠的。
方法3:MarsDaemon第三方库,实现进程常驻
地址:https://github.com/Marswin/MarsDaemon
守护进程也有第三方库,相信很多人都没想到吧
这个库的使用也非常简单,底层通过jni来实现了进程守护,这边就不给出使用方法了,直接在github上看就行了。
但是我实际使用发现,在华为机器上依然不能进程保持运行,只要一清理,后台的闹钟就没有效果了。但是在某些机型上还是可以用的,可靠性比通过AIDL的双进程守护效果好,可是依然不能保证运行。
方法4:通过AppWiget,android桌面小组件保持进程的运行
尝试了网上的很多方法,都是进程一清理,所以程序都被停止了,尤其在华为手机上,360都没法保持一直运行,因此我觉得这个想让后台服务永久运行的想法越来越不可靠。
我在应用商店上下载了一个排行第一的闹钟软件,但是经过多次测试,结果都是一样,想要后台进行,基本是不可能。QQ是通过一个像素点,一直显示在最前,这种黑科技来保持进程一直在,于是我想到了,如果我们添加一个桌面组件来,这样这个组件也是App的一部分, 但它却一直运行在那,这样是否就可以让进程杀死了,程序还是能运行呢?
于是我测试了一下,写了一个很简单AppWidget组件,在AppWifgetProvider中,写了一个简单的闹钟程序,并且让AppWidget中的TextView的数字一直自增1。写完之后我测了一下,发现这个方法是可行的。即使是在华为手机上,我把进程清理了,闹钟还是会响,AppWidget上的数字也一直在更新。
关于AppWidget的写法网上也很多,这边就不具体给出了。在测试这个方法的时候,我发现刚刚下载的闹钟软件也有桌面小组件,我添加了之后,再进行闹钟测试,居然发现,在进程杀死后,闹钟居然可以继续执行,即使是锁屏状态,很明显,这个软件使用的方法和我想到的是一样的。
通过AppWidget来保持进程中代码的执行,这个应该还其他博客中还没有被提到,这个方法相比其他的方法而言,已经是非常可靠的了。但是这个局限也挺大,就是必须通过一个AppWidget来实现。
关于进程守护已经分析完了,如果有什么更好的方法,欢迎大家分析。
没有更多推荐了,}

我要回帖

更多关于 陕西养老保险App 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信