怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死相关的知识,希望对你有一定的参考价值。
方法:对于一个service,可以首先把它设为在前台运行:publicvoidMyService.onCreate()super.onCreate();Notificationnotification=newNotification(android.R.drawable.my_service_icon,"my_service_name",System.currentTimeMillis());PendingIntentp_intent=PendingIntent.getActivity(this,0,newIntent(this,MyMainActivity.class),0);notification.setLatestEventInfo(this,"MyServiceNotification,"MyServiceNotificationisRunning!",p_intent);Log.d(TAG,String.format("notification=%s",notification));startForeground(0x1982,notification);//notificationID:0x1982,youcannameitasyouwill.重要设置-------------------------------相较于/data/app下的应用,放在/system/app下的应用享受的特权,比如若在其Manifest.xml文件中设置persistent属性为true,则可使其免受out-of-memorykiller的影响。如应用程序'Phone'的AndroidManifest.xml文件:设置后app提升为系统核心级别,任何情况下不会被kill掉,settings->applications里面也会屏蔽掉stop操作。这样设置前的log:Proc#19:adj=svc/B4067b028255:com.xxx.xxx/10001(started-services)#cat/proc/255/oom_adj设置后的log:PERS#19:adj=core/F406291f0155:com.xxx.xxx/10001(fixed)#cat/proc/155/oom_adj-12#这是CORE_SERVER_ADJ注:init进程的oom_adj为-16(即SYSTEM_ADJ):cat/proc/1/oom_adjAndroid相关部分分析:在文件frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中有以下的代码:finalProcessRecordaddAppLocked(ApplicationInfoinfo)ProcessRecordapp=getProcessRecordLocked(info.processName,info.uid);if(app==null)app=newProcessRecordLocked(null,info,null);mProcessNames.put(info.processName,info.uid,app);updateLruProcessLocked(app,true,true);if((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))==(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))app.persistent=true;app.maxAdj=CORE_SERVER_ADJ;//这个常数值为-12。if(app.thread==null&&mPersistentStartingProcesses.indexOf(app)/sys/module/lowmemorykiller/parameters/minfree这样当可用内存低于90MB的时候便开始杀死"空进程",而当可用内存低于60MB的时候才开始杀死"内容供应节点"类进程。具体的回收实现在ActivityManagerService.java中的函数trimApplications():1.首先移除package已被卸载的无用进程;2.基于进程当前状态,更新oom_adj值,然后进行以下操作:1)移除没有activity在运行的进程;2)如果AP已经保存了所有的activity状态,结束这个AP。3.最后,如果目前还是有很多activities在运行,那么移除那些activity状态已经保存好的activity。更新oom_adj的值:在ActivityManagerService.java文件的ComputeOomAdjLocked()中计算出进程的oom_adj,例如:if(app==TOP_APP)//Thelastapponthelististheforegroundapp.adj=FOREGROUND_APP_ADJ;app.adjType="top-activity";Androidkernel中的lowmemorykillerAndroid的LowMemoryKiller根据需要(当系统内存短缺时)杀死进程释放其内存,源代码在kernel/drivers/misc/lowmemorykiller.c中。简单说,就是寻找一个最合适的进程杀死,从而释放它占用的内存。最合适的进程是:•oom_adj越大•占用物理内存越多一旦一个进程被选中,内核会发送SIGKILL信号将之杀死:for_each_process(p)……if(selected==NULL||p->oomkilladj>selected->oomkilladj||(p->oomkilladj==selected->oomkilladj&&tasksize>selected_tasksize))selected=p;if(selected!=NULL)force_sig(SIGKILL,selected);查看LRU列表:adbshelldumpsysactivity当activitydemo在前台时:包含Service的进程的优先级比较高,在computeOomAdjLocked中将其分为了两小类:staticfinalintMAX_SERVICE_INACTIVITY=30*60*1000;if(nowSECONDARY_SERVER_ADJ)adj=SECONDARY_SERVER_ADJ;app.adjType="started-services";app.hidden=false;if(adj>SECONDARY_SERVER_ADJ)app.adjType="started-bg-services";完全让进程不被kill是不可能的,我们可以通过一些操作,使进程被kill的几率变小:1)提高进程的优先级:*后台操作采用运行于前台的Service形式,因为一个运行着service的进程比一个运行着后台activity的等级高;*按back键使得进程中的activity在后台运行而不是destory,需重载back按键(没有任何activity在运行的进程优先被杀).*依赖于其他优先级高的进程;2)强制修改进程属性:*在进程中设置:setPersistent(true);*在Manifest文件中设置(如上)。 参考技术A 方法:对于一个service,可以首先把它设为在前台运行:publicvoidMyService.onCreate()super.onCreate();Notificationnotification=newNotificationpython如何程序一直运行?
我这里有一段程序,如何让他一直运行?是不是把他部署到服务器上,如果是的话该如何弄?
参考技术A 使用python自带的gui就可以实现,python自带tk,使用tk的mainloop就会让python程序一直运行,只要让gui窗口一直不显示就是一直在后动员运行了。代码示意如下:from
tkinter
import
*
root
=
tk()
root.withdraw()
#
隐藏窗口
root.mainloop()
#
消息循环
把代码以pyw扩展名保存,执行一下,就会让程序一直在后台执行,可以通过任务管理器结束,如下: 参考技术B 设置一个
死循环
,设定一个数为1,用wile做判断。把所有循环设置到这个语句下面,注意需要清零的数值
slark=1
while(slark):
****
以上是关于怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死的主要内容,如果未能解决你的问题,请参考以下文章
怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死