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

    }

 

}

posted @   brave-sailor  阅读(416)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示