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卸载反馈实现的更多相关文章
- Android卸载程序之后跳转到指定的反馈页面
一个应用被用户卸载肯定是有理由的,而开发者却未必能得知这一重要的理由,毕竟用户很少会主动反馈建议,多半就是用得不爽就卸,如果能在被卸载后获取到用户的一些反馈,那对开发者进一步改进应用是非常有利的.目前 ...
- Android应用如何监听自己是否被卸载及卸载反馈功能的实现
一个应用被用户卸载肯定是有理由的,而开发者却未必能得知这一重要的理由,毕竟用户很少会主动反馈建议,多半就是用得不爽就卸,如果能在被卸载后获取到用户的一些反馈,那对开发者进一步改进应用是非常有利的.目前 ...
- android之卸载反馈的功能
感谢这位大神:http://www.eoeandroid.com/thread-317728-1-1.html zip包里面有讲解的试用方法,和如何试用ndk编译的方法,本人亲身试验,确实可用,现做一 ...
- android 卸载程序、清除数据、停止服务用法
要实现卸载程序.清除数据.停止正在执行的服务这几大模块,如今将代码粗略总结例如以下: 主要运用到的类有 PackageManager ActivityManager ApplicationInfo R ...
- Android 卸载应用程序
最近工作中接触Android应用实现卸载自身的逻辑,踩了一些坑之后整理下来.使用的方法是Intent.ACTION_DELETE,这里没有什么好说的. MainActivity.java : pack ...
- Android触摸反馈
事件分发 当点击事件发生时,事件最先传递给Activity,Activity会首先将事件将被所属的Window进行处理,即调用 superDispatchTouchEvent() 方法.通过观察sup ...
- Android监控程序本身被卸载方法汇总
本文章由Jack_Jia编写,转载请注明出处. 文章链接: http://blog.csdn.net/jiazhijun/article/details/10157901 作者:Jack_Jia ...
- android实现卸载提示
这篇文章是整理的以前用过的一个功能,由于多种原因现在停用了,也希望这篇文章能帮助一些android入门的小童鞋.android是不提供监控卸载自己的功能的,这里使用了监控android日志的功能,an ...
- Android采用pm命令静默卸载应用
卸载app的方式有多种,可以直接调用android系统的卸载程序,但是这样会调出android卸载提示框,问题就是真的不好看. 所以采用静默卸载的方式,避免弹出系统提示框. 方法一(调用系统卸载程序) ...
随机推荐
- 【转】DynDNS使用随笔
暂且小结一下: 1.下载编译客户端代码并交叉编译 首先,按照网上提示的步骤,在www.dyndns.com注册了帐号,并申请了域名,绑定了IP; 然后,在站点中找到客户端源码,其中ddclient是p ...
- SDK调试出错小技巧=。=
学习Unity小伙伴完全不懂Android编程抓错误是很困难的..... 1. 使用UnityPlayer.UnitySendMessage(); 发送到Unity使用OnGUI显示错误 2. 直接在 ...
- 怎样查询SCI和EI检索号
为了年终考核,花了一个早上才搞清楚,里面有非常多小问题.以下具体说明具体过程: SCI检索号 1.进入图书馆主页: 2.选择"电子数据库": 3.选择外文数据库中的"We ...
- 【剑指offer】Q40:数组中出现一次的数
书里面关于分类的推断有些麻烦,通过某一位为0为1来对数组元素进行分类.假如第3位为1.那么也就是元素x & 8 等于或不等于0,所以不是必需非的用第几位去推断. def once(array) ...
- HTTP Digest authentication
(Digest authentication)是一个简单的认证机制,最初是为HTTP协议开发的,因而也常叫做HTTP摘要,在RFC2671中描写叙述.其身份验证机制非常easy,它採用杂凑式(hash ...
- DataSet转Json 方法
防止忘记,留着备用 /// <summary> /// DATASET转JSON /// </summary> /// <param name="ds" ...
- 项目总结之SSI (一)
这是我进公司之后做的第一个新项目,从无到有. 去年夏天和同事在会议室里度过的日子还恍如昨日啊,时光啊,你慢些走... 作为一个外部项目,美工设计了一个Win8风格的界面,看到现在做前台的同学做的一样是 ...
- J - A + B Problem II(第二季水)
Description I have a very simple problem for you. Given two integers A and B, your job is to calcula ...
- Sicily 1790. Single Round Match
高进度求余 或者 将一个数奇位上的数字与偶位上的数字分别加起来,再求它们的差,如果这个差是11的倍数(包括0),那么,原来这个数就一定能被11整除. #include <iostream> ...
- FreeImage裁剪示例
//截图 int cropImage(const char* file, int left, int top, int right, int bottom, BYTE* &dstData, D ...