android卸载反馈实现

转自:http://blog.csdn.net/wang_shaner/article/details/41543787


个人观点,这个进程最好fork调用两次生成一个脱离的孤儿进程。


实现原理

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");

    }

 

}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值