首页 > 代码库 > android卸载反馈实现

android卸载反馈实现

博客原地址:http://blog.csdn.net/wang_shaner/article/details/41543787

实现原理

fork分叉函数

 

fork分叉(分裂)函数可以创建一个新进程, 并且新创建出来的进程(子进程)拥有创建它的那个进程(父进程)的数据空间, 堆栈资源等的拷贝. 并且相互不影响. (跟fork zha弹原理一样)

 

返回值会返回两次, 但有三种情况:

在父进程中, fork返回新创建子进程的进程ID.

在子进程中, fork返回0.

如果出现错误, fork返回一个负值.

 

 

1.该功能原理简介

在程序没有卸载之前,调用C代码,去fork分叉出一个子进程;当程序被卸载时,这个子进程没有被立即关闭。这个子进程需要做的工作是:每一秒去查看/data/data/下是否有当前应用的包名,如果没有,被卸载了,打开浏览器,弹出一个页面,问卷调查用户卸载的原因。

 

2.实现思路归纳

 

1.声明native方法

2.在C语言中实现,里面去做fork分叉出一个子进程

3.子进程每隔1秒钟监听/data/data/当前包是否卸载

4.如果卸载了,调用Android浏览器

 

 

3.声明native方法

 

 

publicnativevoiduninstallListener();

 

 

4.在C语言中实现,里面去做fork分叉出一个子进程,并演示

 

//此方法会创建一个进程,父进程会返回一个值,子进程也会返回一次值.

    int state = fork();

    if(state > 0){

        //当前是父进程

        LOGD("parentprocess=%d",state);

    }elseif(state == 0){

        //当前是子进程

        LOGD("supprocess=%d",state);

      

    }else{

        LOGD("Error");

    }

 

 

5.子进程每隔1秒钟监听/data/data/当前包是否卸载

//此方法会创建一个进程,父进程会返回一个值,子进程也会返回一次值.

    int state = fork();

    if(state > 0){

        //当前是父进程

        LOGD("parentprocess=%d",state);

    }elseif(state == 0){

        //当前是子进程

        LOGD("supprocess=%d",state);

        //监听当前应用是否卸载

        int isStop = 1;

        while(isStop){

            //每隔1秒钟判断应用目录是否存在

            sleep(1);

            //FILE*fopen(constchar *, const char *);

            FILE* file =fopen("/data/data/com.itheima.pressuredemo","r");

            if(file == NULL){

                //当文件夹没有了,就是被卸载了

                LOGD("uninstalled....");

                isStop= 0;

            }

        }

    }else{

        LOGD("Error");

    }

 

6.C代码调用Android浏览器

 

 

Dos命令行中打开浏览器:

adb shell am start -aandroid.intent.action.VIEW -d http://www.itheima.com

C语言中通过execlp方法打开浏览器:

execlp("am", "am","start", "-a", "android.intent.action.VIEW","-d", "http://www.itheima.com", NULL);

 

命令:

# am start -a android.intent.action.VIEW -d http://10.0.2.2:8080

 

全命令:

execlp("am", "am","start", "-a", "android.intent.action.VIEW","-d", "http://www.itheima.com", NULL);

 

execlp("am", "am","start", "-a", "android.intent.action.VIEW","-d", "http://10.0.2.2:8080/uninstall.html", NULL);

 

 

 

C端完整代码:

/**

* 监听当应用卸载

*/

JNIEXPORT void JNICALLJava_com_itheima_pressuredemo_MainActivity_uninstallListener

  (JNIEnv *env,jobject obj){

    //此方法会创建一个进程,父进程会返回一个值,子进程也会返回一次值.

    int state = fork();

    if(state > 0){

        //当前是父进程

        LOGD("parentprocess=%d",state);

    }elseif(state == 0){

        //当前是子进程

        LOGD("supprocess=%d",state);

        //监听当前应用是否卸载

        int isStop = 1;

        FILE* file;

        while(isStop){

            //每隔1秒钟判断应用目录是否存在

            sleep(1);

            //FILE*fopen(constchar *, const char *);

            file = fopen("/data/data/com.itheima.pressuredemo","r");

            if(file == NULL){

                //当文件夹没有了,就是被卸载了

                LOGD("uninstalled....");

                execlp("am","am", "start", "-a","android.intent.action.VIEW", "-d","http://10.0.2.2:8080/uninstall.html", NULL);

                isStop= 0;

            }

        }

    }else{

        LOGD("Error");

    }

 

}

android卸载反馈实现