方法:对于一个service,可以首先把它设为在前台运行:public void MyServiceonCreate() { superonCreate(); Notification notification = new Notification(androidRdrawablemy_service_icon, "my_service_name", SystemcurrentTimeMillis()); PendingIntent p_intent = PendingIntentgetActivity(this, 0, new Intent(this, MyMainActivityclass), 0); notificationsetLatestEventInfo(this, "MyServiceNotification, "MyServiceNotification is Running!", p_intent); Logd(TAG, Stringformat("notification = %s", notification)); startForeground(0x1982, notification); // notification ID: 0x1982, you can name it as you will}重要设置-------------------------------相较于/data/app下的应用,放在/system/app下的应用享受更多的特权,比如若在其Manifestxml文件中设置persistent属性为true,则可使其免受out-of-memory killer的影响。如应用程序'Phone'的AndroidManifestxml文件: <application android:name="PhoneApp" android:persistent="true" android:label="@string/dialerIconLabel" android:icon="@drawable/ic_launcher_phone"> </application>设置后app提升为系统核心级别,任何情况下不会被kill掉, settings->applications里面也会屏蔽掉stop *** 作。这样设置前的log: Proc #19: adj=svc /B 4067b028 255:comxxxxxx/10001 (started-services) # cat /proc/255/oom_adj设置后的log: PERS #19: adj=core /F 406291f0 155:comxxxxxx/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/ActivityManagerServicejava中有以下的代码: final ProcessRecord addAppLocked(ApplicationInfo info) { ProcessRecord app = getProcessRecordLocked(infoprocessName, infouid); if (app == null) { app = newProcessRecordLocked(null, info, null); mProcessNamesput(infoprocessName, infouid, app); updateLruProcessLocked(app, true, true); } if ((infoflags&(ApplicationInfoFLAG_SYSTEMApplicationInfoFLAG_PERSISTENT)) == (ApplicationInfoFLAG_SYSTEMApplicationInfoFLAG_PERSISTENT)) { apppersistent = true; appmaxAdj = CORE_SERVER_ADJ; // 这个常数值为-12。 } if (appthread == null && mPersistentStartingProcessesindexOf(app) < 0) { mPersistentStartingProcessesadd(app); startProcessLocked(app, "added application", appprocessName); } return app; }可见要想成为core service (即appmaxAdj = CORE_SERVER_ADJ(-12)),应用程序需要FLAG_SYSTEM和FLAG_PERSISTENT两个标志,FLAG_SYSTEM指的是应用位于/system/app下,FLAG_PERSISTENT就是指persistent属性。而对于frameworks/base/services/java/com/android/server/SystemServerjava,则调用 ActivityManagerServicesetSystemProcess();把自己的 appmaxAdj 设置成SYSTEM_ADJ,即-16。原理:Android中的进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程的回收。由此带来三个问题: 1) 回收规则: 什么时候回收与回收哪一个? 2) 避免误杀: 如何阻止被回收? 3) 数据恢复与保存: 被回收了怎么办? Android将进程分为6个等级,它们按优先级顺序由高到低依次是: 1前台进程( FOREGROUND_APP) 2可视进程(VISIBLE_APP ) 3 次要服务进程(SECONDARY_SERVER ) 4后台进程 (HIDDEN_APP) 5内容供应节点(CONTENT_PROVIDER) 6空进程(EMPTY_APP) 特征:1如果一个进程里面同时包含service和可视的activity,那么这个进程应该归于可视进程,而不是service进程。2另外,如果其他进程依赖于它的话,一个进程的等级可以提高。例如,一个A进程里的service被绑定到B进程里的组件上,进程A将总被认为至少和B进程一样重要。3系统中的phone服务被划分到前台进程而不是次要服务进程 在android中,进程的oom_adj值也就代表了它的优先级。oom_adj值越高代表该进程优先级越低。文件/initrc中有以下属性设置: setprop roFOREGROUND_APP_ADJ 0 setprop roVISIBLE_APP_ADJ 1 setprop roSECONDARY_SERVER_ADJ 2 setprop roHIDDEN_APP_MIN_ADJ 7 setprop roCONTENT_PROVIDER_ADJ 14 setprop roEMPTY_APP_ADJ 15/initrc中,将PID为1的进程(init进程)的oom_adj设置为SYSTEM_ADJ(-16): # Set init its forked children's oom_adj write /proc/1/oom_adj -16查看本机设置:cat /sys/module/lowmemorykiller/parameters/adj0,1,2,7,14,15 回收时机:文件/initrc中: setprop roFOREGROUND_APP_MEM 1536 // 6M setprop roVISIBLE_APP_MEM 2048 // 8M setprop roSECONDARY_SERVER_MEM 4096 // 16M setprop roHIDDEN_APP_MEM 5120 // 20M setprop roCONTENT_PROVIDER_MEM 5632 // 224M setprop roEMPTY_APP_MEM 6144 // 24M这些数字也就是对应的内存阈值,一旦低于该值,Android便开始按顺序关闭相应等级的进程。注意这些数字的单位是page: 1 page = 4 kB。所以上面的六个数字对应的就是(MB): 6,8,16,20,22,24。 查看现在的内存阈值设置:cat /sys/module/lowmemorykiller/parameters/minfree要想重新设置该值(对应不同的需求):echo "1536,2048,4096,5120,15360,23040">/sys/module/lowmemorykiller/parameters/minfree这样当可用内存低于90MB的时候便开始杀死"空进程",而当可用内存低于60MB的时候才开始杀死"内容供应节点"类进程。 具体的回收实现在ActivityManagerServicejava中的函数trimApplications(): 1首先移除package已被卸载的无用进程; 2基于进程当前状态,更新oom_adj值,然后进行以下 *** 作: 1) 移除没有activity在运行的进程; 2) 如果AP已经保存了所有的activity状态,结束这个AP。 3 最后,如果目前还是有很多activities 在运行,那么移除那些activity状态已经保存好的activity。更新oom_adj的值:在ActivityManagerServicejava文件的ComputeOomAdjLocked() 中计算出进程的oom_adj,例如: if (app == TOP_APP) { // The last app on the list is the foreground app adj = FOREGROUND_APP_ADJ; appadjType = "top-activity"; } Android kernel中的low memory killerAndroid的Low Memory Killer根据需要(当系统内存短缺时)杀死进程释放其内存,源代码在kernel/drivers/misc/lowmemorykillerc中。简单说,就是寻找一个最合适的进程杀死,从而释放它占用的内存。最合适的进程是: • 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列表:adb shell dumpsys activity当activitydemo在前台时: 包含Service的进程的优先级比较高,在computeOomAdjLocked中将其分为了两小类: static final int MAX_SERVICE_INACTIVITY = 30601000; if (now < (slastActivity+MAX_SERVICE_INACTIVITY)) { if (adj > SECONDARY_SERVER_ADJ) { adj = SECONDARY_SERVER_ADJ; appadjType = "started-services"; apphidden = false; } } if (adj > SECONDARY_SERVER_ADJ) { appadjType = "started-bg-services"; }完全让进程不被kill是不可能的,我们可以通过一些 *** 作,使进程被kill的几率变小: 1) 提高进程的优先级: 后台 *** 作采用运行于前台的Service形式,因为一个运行着service的进程比一个运行着后台activity的等级高; 按back键使得进程中的activity在后台运行而不是destory,需重载back按键(没有任何activity在运行的进程优先被杀) 依赖于其他优先级高的进程; 2) 强制修改进程属性: 在进程中设置:setPersistent(true); 在Manifest文件中设置(如上)。
打开手机“设置”——“更多设置”——“应用程序”——“正在运行”,可以看到,后台正在运行的程序。
打开手机自带的“安全助手”,对后台程序进行关闭。若安装其他清理软件,请按软件提示 *** 作。“安全助手”打开后,运行“一键优化”,初步清理完成。
按步骤1进行到“正在运行”的界面,选择需要结束的进程和服务,如“QQ进程和服务”。把能够停止的进程和服务都停止了。按此法,结束其他程序的进程和服务。
当结束进程和服务后,返回查看正在运行的程序,会发现已经关闭了很多后台运行的程序。这可为手机节约不少电量。
电视管家怎么使用的?

七星海棠
一、电视管家主要功能 1、一键优化;2、应用卸载;3、安装包管理;4、网络测速;5、开机直达;6、自启动管理;7、后台常驻管理; 二、电视管家 *** 作说明 1、开机进入电视首页,选择“我的应用”,并找到“电视管家”项目(如下图例);、打开“电视管家 ①、一键优化
一键优化的卡片会显示当前内存占用率、系统清理提示和上次优化的时间。当点击一键优化以后将会启动清理功能,电视管家将会关闭一些不必要的程序、清理应用程序使用过程中产生的垃圾文件,使电视始终保持流畅运行
在清理结果显示页面可以点击“后台常驻”进入后台常驻应用管理页面。点击“深度清理”可以进入深度清理页面。用户还可以通过深度清理来对数据占用大的应用,不常用应用和大文件进行清理。选中相应的列表项后,可点击展开列表,对相应的清理项目进行选择或删减,选择完毕后点击右侧开始清理即可对所有选中的内容进行清理。清理时通过动画显示清理项,清理完成后将进入结果展示界面,展示清理的内存大小。点击返回首页按钮即可回到首页。
以上就是关于Linux 使用基本知识: 用at和cron进行任务调度全部的内容,包括:Linux 使用基本知识: 用at和cron进行任务调度、怎样设置multiprocess的后台守护进程、想让android应用常驻后台,不被杀死,各位大神有什么高招等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)