如何实现一个不会被杀死的进程http://ophonesdn.com/forum/archiver/tid-56.html

解决方案 »

  1.   

    提高Android Service 优先级的方法http://dev.wo.com.cn/bbs/redirect.jsp?tid=10700&goto=lastpost
      

  2.   

    android加守护进程。txt http://wenku.baidu.com/view/8c6314707fd5360cba1adbc1.html
      

  3.   

    说说守护进程 
    http://farsight.blog.51cto.com/1821374/379944
      

  4.   

    将自己的程序永久写入Android的/system/bin的方法http://hi.baidu.com/mcu99/blog/item/954a511085280509203f2e3a.html
    Android模拟器运行之后,/system目录即为只读属性。如果想把自己的程序传到该目录下运行,就会发现无法成功。当然,使用adb remount命令可以暂时去除它的只读限制,可以向里面传文件,但是一旦重启Android模拟器,再次使用adb shell进入模拟器终端时就会发现,自己传进去的文件在重启之后被清除掉了。当然,你可以把文件传到/data文件夹下,这个文件夹不用remount就可写,而且重启模拟器之后自己的文件也不会被清空。但是如果我想做一个较为底层的程序,或者开机启动的程序,每次开机在/data下启动总是显得怪怪的。最好能让自己编写的程序也能享受到Android自带的那些程序的地位,每次运行在system/bin目录下。这可以通过把自己的程序代码加在Android源码中,然后重新make的方法实现。首先根据你工程的性质,在Android源码的相应位置建立一个文件夹。比如我的这个程序如果和硬件有关的话,可以在hardware下建立一个叫做my_hardware的文件夹,然后把自己的程序源码放在里面,比如叫hard.c。再给这个程序写一个makefile文件,好让make的时候可以自动找到你的程序并对它进行编译。起名字叫做Android.mk,这个名字不能随便起,否则make不认识。把这个Android.mk和hard.c都放在my_hardware下面。# Android.mk文件内容举例
    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)LOCAL_SRC_FILES:= \
        hard.c
    LOCAL_PRELINK_MODULE := false
    LOCAL_MODULE:= myhard
    include $(BUILD_EXECUTABLE)做好这些之后,回到总的Android源码目录下,然后执行make,如果你之前已经make过了,那么这个过程会很快,几分钟吧。因为和上一次make相比,源码改动很少,只是加了1个文件夹和2个文件而已。如果你这是第一次make,那么会比较慢,或许大约要1-2个小时,速度应该也和机器配置有关。make成功之后,运行emulator模拟器,用adb shell进入模拟器终端,cd /system/bin,就可以找到你的程序了(注意名字是myhard,不是hard,也不是my_hardware,这里产生的程序名字由上面程序中红色字体的那一行控制)。而且再次启动之后也不会丢失。
      

  5.   


    守护进程又称精灵进程(daemon),一般在系统启动时开始,而在系统关闭时终止。没有控制终端,运行在后台。在linux系统中有很多这类进程。下面说一下如何创建一个守护进程。(1) 使用umask修改文件的屏蔽字,为文件赋予跟多的权限,因为继承来的文件可能某些权限被屏蔽,从而失去某些功能,如读写。
            (2) 调用fork函数创建一个子进程,而父进程退出。
            (3) 调用settid创建一个新会话,当前进程为会话组长,并且关闭控制终端。
            (4) 修改进程工作目录为根目录,chdir(“/”).
            (5) 关闭不需要的从父进程继承过来的文件描述符。
            (6) 打开/dev/null,null也称黑洞设备,就是写入或读出什么都没有效果。代开这个设备是文件具有0,1,2三个文件描述符,但是对标准输入,标准输出,标准出错的操作都没有效果。这部分内容不是必须的。下面使用一个例程说一下这个过程。#include <stdio.h>
            #include <unistd.h>
            #include <sys/types.h>
            #include <stdlib.h>
            #include <sys/resource.h>int main()
            {        pid_t pid;
                    struct rlimit r;
                    int i;//XXX step 1:set umask
                    umask(0);//XXX setp 2:fork
                    if((pid = fork()) < 0)
                    {
                            perror("fork");
                            exit(0);
                    }
                    else if(pid != 0)
                    {
                            exit(0);
                    }//XXX step 3:setsid
                    setsid();//XXX step 4:chdir
                    chdir("/");//XXX step 5:close all open file descriptors
                    if(r.rlim_max == RLIM_INFINITY)
                    {
                            r.rlim_max = 1024;
                    } 
                    for(i = 0; i < r.rlim_max; i++)
                    {
                            close(i);
                    }                while(1)
                    {        }
                    return 0;
            }上面便是一个守护进程的创建过程,可是一些书或网络上写守护进程,会在第三步和第四步之间添加这样一点代码。        if((pid = fork()) < 0)
                    {
                            perror("fork");
                            exit(0);
                    }
                    else if(pid != 0)
                    {
                            exit(0);
                    }很多学生就会问,为什么要创建两次进程呢,这是因为第三步结束后,进程创建了一个新的会话组,并成为会话组长,而会话组长可能获得控制终端,如果获得了控制终端那么或这个进程就不是守护进程了。所以添加了这几句代码,让进程失去会话组长的身份,从而没有获得控制终端的权限。
      

  6.   

    android使用socket使底层和framework通信http://fanwei51880.blog.163.com/blog/static/32406740201011150240981/
      

  7.   

    android下的RIL通信就是一个通过守护进程用SOCKET来通信的例子!!!
      

  8.   

    常见的100个linux守护进程 
    http://sunyu.blog.51cto.com/744725/320647
      

  9.   

    今天总算写成功了一个守护进程并实现开机运行,开始加载不了服务原来是因为SERVICE NAME用的太长了,超过了16的限制
      

  10.   

    Microsoft Windows XP [版本 5.1.2600]
    (C) 版权所有 1985-2001 Microsoft Corp.C:\Documents and Settings\Administrator>adb shell
    # dumpsys activity
    dumpsys activity  Sticky broadcasts:
      * Sticky action android.media.RINGER_MODE_CHANGED:
        Intent: act=android.media.RINGER_MODE_CHANGED flg=0x70000000
          Bundle[{android.media.EXTRA_RINGER_MODE=2}]
      * Sticky action android.intent.action.BATTERY_CHANGED:
        Intent: act=android.intent.action.BATTERY_CHANGED flg=0x60000000
          Bundle[{icon-small=17302169, present=true, scale=100, level=85, technology=Li-ion, status=2, voltage=8536, plugged
    =1, health=2, temperature=250}]
      * Sticky action android.net.thrott.THROTTLE_ACTION:
        Intent: act=android.net.thrott.THROTTLE_ACTION
          Bundle[{level=-1}]
      * Sticky action android.net.thrott.POLL_ACTION:
        Intent: act=android.net.thrott.POLL_ACTION
          Bundle[{cycleRead=0, cycleStart=1294358400000, cycleEnd=1297036800000, cycleWrite=0}]  Activity stack:
      * TaskRecord{45f1a690 #2 A com.android.launcher}
        clearOnBackground=true numActivities=1 rootWasReset=false
        affinity=com.android.launcher
        intent={act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/co
    m.android.launcher2.Launcher}
        realActivity=com.android.launcher/com.android.launcher2.Launcher
        lastActiveTime=3094388 (inactive for 1411s)
        * Hist #0: HistoryRecord{45efe298 com.android.launcher/com.android.launcher2.Launcher}
            packageName=com.android.launcher processName=com.android.launcher
            launchedFromUid=0 app=ProcessRecord{45f1ab80 968:com.android.launcher/10010}
            Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launch
    er/com.android.launcher2.Launcher }
            frontOfTask=true task=TaskRecord{45f1a690 #2 A com.android.launcher}
            taskAffinity=com.android.launcher
            realActivity=com.android.launcher/com.android.launcher2.Launcher
            base=/system/app/Launcher2.apk/system/app/Launcher2.apk data=/data/data/com.android.launcher
            labelRes=0x7f0c0002 icon=0x7f020048 theme=0x7f0d0000
            stateNotNeeded=true componentSpecified=false isHomeActivity=true
            configuration={ scale=1.0 imsi=0/0 loc=md_US touch=3 keys=2/1/2 nav=3/1 orien=2 layout=35 uiMode=17 seq=2}
            launchFailed=false haveState=false icicle=null
            state=RESUMED stopped=false delayedResume=false finishing=false
            keysPaused=false inHistory=true persistent=false launchMode=2
            fullscreen=true visible=true frozenBeforeDestroy=false thumbnailNeeded=false idle=true
            waitingVisible=false nowVisible=true  Running activities (most recent first):
        TaskRecord{45f1a690 #2 A com.android.launcher}
          Run #0: HistoryRecord{45efe298 com.android.launcher/com.android.launcher2.Launcher}  mPausingActivity: null
      mResumedActivity: HistoryRecord{45efe298 com.android.launcher/com.android.launcher2.Launcher}
      mFocusedActivity: HistoryRecord{45efe298 com.android.launcher/com.android.launcher2.Launcher}
      mLastPausedActivity: HistoryRecord{45f0ee48 com.KT.NDKOpenGL_AppSwitch/.NDKOpenGL_AppSwitch}  mCurTask: 5  Running processes (most recent first):
        App  #12: adj=vis  /F 45e23f30 963:com.android.inputmethod.latin/10022 (service)
                  com.android.inputmethod.latin.LatinIME<=ProcessRecord{45de0768 894:system/1000}
        PERS #11: adj=sys  /F 45de0768 894:system/1000 (fixed)
        App  #10: adj=fore /F 45f1ab80 968:com.android.launcher/10010 (top-activity)
        App  # 9: adj=bak  /B 45e26a20 970:com.android.settings/1000 (bg-empty)
        App  # 8: adj=bak+1/B 45e15af0 1029:android.process.media/10004 (bg-empty)
        App  # 7: adj=bak+2/B 45df5ae8 1101:com.android.quicksearchbox/10015 (bg-empty)
        App  # 6: adj=bak+3/B 45de2d80 1087:com.android.providers.calendar/10023 (bg-empty)
        App  # 5: adj=bak+4/B 45fe5548 1076:com.android.bluetooth/10020 (bg-empty)
        App  # 4: adj=bak+5/B 45fd7ea8 1058:com.android.email/10017 (bg-empty)
        App  # 3: adj=bak+6/B 45f2d398 1019:com.android.deskclock/10000 (bg-empty)
        App  # 2: adj=bak+7/B 45ef5280 1116:com.android.protips/10025 (bg-empty)
        App  # 1: adj=empty/B 45ebfa58 1109:com.android.music/10024 (bg-empty)
        App  # 0: adj=empty/B 45e64e20 999:android.process.acore/10005 (bg-empty)  PID mappings:
        PID #894: ProcessRecord{45de0768 894:system/1000}
        PID #963: ProcessRecord{45e23f30 963:com.android.inputmethod.latin/10022}
        PID #968: ProcessRecord{45f1ab80 968:com.android.launcher/10010}
        PID #970: ProcessRecord{45e26a20 970:com.android.settings/1000}
        PID #999: ProcessRecord{45e64e20 999:android.process.acore/10005}
        PID #1019: ProcessRecord{45f2d398 1019:com.android.deskclock/10000}
        PID #1029: ProcessRecord{45e15af0 1029:android.process.media/10004}
        PID #1058: ProcessRecord{45fd7ea8 1058:com.android.email/10017}
        PID #1076: ProcessRecord{45fe5548 1076:com.android.bluetooth/10020}
        PID #1087: ProcessRecord{45de2d80 1087:com.android.providers.calendar/10023}
        PID #1101: ProcessRecord{45df5ae8 1101:com.android.quicksearchbox/10015}
        PID #1109: ProcessRecord{45ebfa58 1109:com.android.music/10024}
        PID #1116: ProcessRecord{45ef5280 1116:com.android.protips/10025}  Time since processes crashed:
        Process com.KT.NDKOpenGL_AppSwitch uid 10046: last crashed 1112183 ms ago  mHomeProcess: ProcessRecord{45f1ab80 968:com.android.launcher/10010}
      mConfiguration: { scale=1.0 imsi=0/0 loc=md_US touch=3 keys=2/1/2 nav=3/1 orien=2 layout=35 uiMode=17 seq=2}
      mConfigWillChange: false
      mSleeping=false mShuttingDown=false
    #
      

  11.   

    怎样使一个Android应用不被杀死?(整理)
    http://blog.sina.com.cn/s/blog_3e3fcadd0100yjo2.html
      

  12.   

    谢谢楼主的分享~可为什么我在dumpsys activity命令中找不到oom_adj?看不到进程的优先级~?
      

  13.   

    我想将phone进程停止,把president这项改成了false,烧到机器里面之后,显示“通讯录服务停止”,进程也起不来了。我又将president改成true,烧到机器里,还是起不来,是为什么?
      

  14.   

    没看明白,application的值还是会被清空