博客原地址: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卸载反馈实现的更多相关文章

  1. Android卸载程序之后跳转到指定的反馈页面

    一个应用被用户卸载肯定是有理由的,而开发者却未必能得知这一重要的理由,毕竟用户很少会主动反馈建议,多半就是用得不爽就卸,如果能在被卸载后获取到用户的一些反馈,那对开发者进一步改进应用是非常有利的.目前 ...

  2. Android应用如何监听自己是否被卸载及卸载反馈功能的实现

    一个应用被用户卸载肯定是有理由的,而开发者却未必能得知这一重要的理由,毕竟用户很少会主动反馈建议,多半就是用得不爽就卸,如果能在被卸载后获取到用户的一些反馈,那对开发者进一步改进应用是非常有利的.目前 ...

  3. android之卸载反馈的功能

    感谢这位大神:http://www.eoeandroid.com/thread-317728-1-1.html zip包里面有讲解的试用方法,和如何试用ndk编译的方法,本人亲身试验,确实可用,现做一 ...

  4. android 卸载程序、清除数据、停止服务用法

    要实现卸载程序.清除数据.停止正在执行的服务这几大模块,如今将代码粗略总结例如以下: 主要运用到的类有 PackageManager ActivityManager ApplicationInfo R ...

  5. Android 卸载应用程序

    最近工作中接触Android应用实现卸载自身的逻辑,踩了一些坑之后整理下来.使用的方法是Intent.ACTION_DELETE,这里没有什么好说的. MainActivity.java : pack ...

  6. Android触摸反馈

    事件分发 当点击事件发生时,事件最先传递给Activity,Activity会首先将事件将被所属的Window进行处理,即调用 superDispatchTouchEvent() 方法.通过观察sup ...

  7. Android监控程序本身被卸载方法汇总

    本文章由Jack_Jia编写,转载请注明出处.   文章链接: http://blog.csdn.net/jiazhijun/article/details/10157901 作者:Jack_Jia ...

  8. android实现卸载提示

    这篇文章是整理的以前用过的一个功能,由于多种原因现在停用了,也希望这篇文章能帮助一些android入门的小童鞋.android是不提供监控卸载自己的功能的,这里使用了监控android日志的功能,an ...

  9. Android采用pm命令静默卸载应用

    卸载app的方式有多种,可以直接调用android系统的卸载程序,但是这样会调出android卸载提示框,问题就是真的不好看. 所以采用静默卸载的方式,避免弹出系统提示框. 方法一(调用系统卸载程序) ...

随机推荐

  1. android笔试题集2

    1.请谈一下Android系统的架构.答:Android系统采用了分层架构,从高层到低层分别是应用程序层.应用程序框架层.系统运行库层和linux核心层. 2.谈谈android大众常用的五种布局.答 ...

  2. 代码中实际运用memcached——mycode

    1.下载安装64位memcached.exe  下载地址:http://blog.couchbase.com/memcached-windows-64-bit-pre-release-availabl ...

  3. unity3d 捕获系统日志,来处理一些问题

    注册系统日志回调,根据日志内容和类型处理一些特殊问题 using UnityEngine; using System.Collections; public class SetupVerificati ...

  4. Bestcoder HDU5059 Help him 字符串处理

    Help him Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  5. android stagefright基本流程总结

    数据流的封装一. 由数据源DataSource生成MediaExtractor. 通过MediaExtractor::Create(dataSource)来实现.Create方法通过两步来生成相应的M ...

  6. Letter of inquiry about employment possibilities, e-mail version

    Subject: (logical to recipient!) Inquiry about software engineering position after completion of M.S ...

  7. Android开发_关于点击事件

    为了防止用户或者测试MM疯狂的点击某个button: 创建一个工具类 public class Tools { private static long lastClickTime; public st ...

  8. 封装一些数据库SQLCipher的方法(增、删、改、查)

    上一篇随笔只是简单的说了一下使用SQLCipher框架,介绍的比较笼统,可能看一遍之后更加蒙圈了,为了更好的使用这个数据库,整理了我在公司项目的需要用的方法,包括创建表,插入数据,更新数据,搜索查询数 ...

  9. ORACLE行转列(行转1列,行转多列)

    在oracle 11g release 2 版本中新增的listagg函数,listagg是一个实现字符串聚合的oracle内建函数;listagg(column,'分隔符') within grou ...

  10. Uva 10652 Board Wrapping(计算几何之凸包+点旋转)

    题目大意:给出平面上许多矩形的中心点和倾斜角度,计算这些矩形面积占这个矩形点形成的最大凸包的面积比. 算法:GRAHAM,ANDREW. 题目非常的简单,就是裸的凸包 + 点旋转.这题自己不会的地方就 ...