实现原理
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卸载或删除应用,调用浏览器打开指定网页地址url
Android应用卸载器源码,完整应用。
android应用卸载提示 利用监控log机制监控自己被卸载,卸载时提示。
android卸载已安装应用代码,提供点击打开应用功能,采用ListView显示所有已安装应用(剔除了原装应用)。 在此代码中可以学到,ListView自定义适配器的使用,ListView中给每条Item加按钮并实现ListView的Item与按钮...
Android监听自身卸载,弹出用户反馈调查
Android疯子卸载
android 实现自我自动静默卸载 妈妈再也不用担心我是流氓了 部分手机安装失败。本人三星i9108可以 小米安装失败。不知道为什么。同个程序。可能是小米没root,但是代码里面没有涉及root相关的 。只是修改了应用权限 ...
android 系统应用卸载器:需要系统root,很方便的一个工具,不需要连接电脑去使用其他工具。
获取android设备上全部的应用,并且过滤出第三方应用,支持卸载第三方应用
卸载安卓手机上的已安装程序的代码,剔除了原装软件。主要实现了打开应用程序和卸载应用程序功能。
源码参考,欢迎下载
Android应用源码之监听自身应用卸载,并在卸载之后,使用libcurl三方库进行一次三方请求,或者启动网页的实例工程
安卓Android源码——监听自身应用卸载,并在卸载之后,使用libcurl三方库进行一次三方请求,或者启动网页的实例工程。.zip
本人在项目中使用到的,特将卸载部分demo在此分享,可以卸载任何系统应用,需要root权限
电脑上有腾讯管家,作为安卓开发,用真机测试的比较多,鄙人算一个,不喜欢用应用宝,当你卸载了应用宝之后,插上USB,有时候就回静默安装应用宝,然后弹出应用宝获取什么什么权限,特别烦 手机在没有安装应用宝...
通过batch实现的android应用批量安装卸载工具,有代码,有使用说明,欢迎下载
在程序中处理卸载apk,我是在这个情况下用到的与大家共享:开始apk上线用的是debug签名,后我换了台电脑,导致打包再上线报签名不一致的问题.后采用数字证书签名并修改了游戏的主类包名.解决签名不一致的问题. 这样导致...
Android程序监听自身被卸载后打开浏览器
本项目是一个基于安卓的应用管理器,主要功能为卸载应用、打开应用、显示应用、显示应用主要信息、显示应用详细信息,打开应用有主界面导航,主界面内有动画效果,还有按安装时间、应用大小、应用名排序的功能。...