实现原理
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系统会执行以下步骤: 1. 用户触发卸载请求,这可能通过点击应用列表中的卸载按钮实现。 2. 系统调用`PackageManagerService`,这是管理所有应用的系统服务。 3. `...
这个功能可以让开发者在用户卸载应用时,弹出一个用户反馈调查的网页,以便收集用户的反馈信息,并且可以帮助开发者改进应用程序。 在 Android 开发中,实现这个功能需要使用 JNI(Java Native Interface),因为 ...
`ACTION_PACKAGE_REMOVED`广播是在卸载应用时由系统发出的,表示某个应用包已经被移除。 以下是一个简单的BroadcastReceiver示例代码: ```java public class UninstallReceiver extends BroadcastReceiver { @...
但由于应用已经卸载,系统可能无法直接打开浏览器,因此这种方式的可行性不如网络请求稳定。 总的来说,这个实例工程结合了Android的广播接收器、服务、JNI以及第三方库libcurl,展示了如何在应用卸载后执行操作。...
android卸载已安装应用代码,提供点击打开应用功能,采用ListView显示所有已安装应用(剔除了原装应用)。 在此代码中可以学到,ListView自定义适配器的使用,ListView中给每条Item加按钮并实现ListView的Item与按钮...
在Android系统中,卸载应用通常分为用户应用(User Apps)和系统应用(System Apps)两种情况。用户应用可以通过标准的设置菜单或者第三方工具轻松卸载,但系统应用由于其预装并深度集成于Android系统中,一般不允许...
Android系统在卸载应用时会发送一个ACTION_PACKAGE_REMOVED广播,我们可以通过注册一个自定义的BroadcastReceiver监听这个广播,当接收到这个广播时执行预设的任务。 接下来,我们关注使用libcurl进行三方请求的...
在安卓(Android)开发中,有时开发者需要监听自身应用的卸载事件,以便在用户卸载应用时执行一些清理工作或发送反馈数据。本项目"安卓Android源码——监听自身应用卸载.zip"提供了一个实例工程,展示了如何实现这一...
// 这里可以获取到卸载应用的包名,然后进行你需要的操作 Log.d("UninstallReceiver", "应用 " + packageName + " 已卸载"); } } } ``` 在AndroidManifest.xml中,对卸载应用的BroadcastReceiver进行注册: ``...
在Android系统中,卸载应用程序通常涉及到对Android SDK(软件开发工具包)的理解以及使用Java编程语言。这里我们将深入探讨如何通过代码实现卸载已安装的程序,特别注意的是,剔除原装软件可能需要系统级别的权限,...
android 实现自我自动静默卸载 妈妈再也不用担心我是流氓了 部分手机安装失败。本人三星i9108可以 小米安装失败。不知道为什么。同个程序。可能是小米没root,但是代码里面没有涉及root相关的 。只是修改了应用权限 ...
综上所述,"NDK 完成卸载后打开调查问卷"涉及到Android应用开发的多个方面,包括NDK和JNI的使用、事件监听、资源管理以及用户反馈收集。开发者需要对Android系统机制有深入理解,才能正确实现这一功能。
在Android系统中,批量安装和卸载应用通常是开发者、测试人员或者系统管理员为了提高效率而进行的操作。批量处理可以节省大量的手动操作时间,特别是在需要处理大量应用时。本压缩包提供的"BatInstaller"工具,正是...
通常情况下,用户可以通过设置菜单中的应用管理器来卸载应用程序,或者通过点击APK安装文件进行卸载。但这些方式都需要用户的交互。静默卸载则是绕过这些交互步骤,直接在后台完成卸载。 要实现静默卸载,我们需要...
在Android系统中,"静默卸载"是指在用户无感知的情况下,通过程序代码自动执行卸载应用程序的过程。这通常需要设备已经获得了Root权限,因为Root权限是Android系统的超级管理员权限,可以访问和修改系统级别的文件,...
android 系统应用卸载器:需要系统root,很方便的一个工具,不需要连接电脑去使用其他工具。
在Android系统中,U盘(USB存储设备)的卸载通常涉及到系统级别的操作,因为这关系到设备的安全性和稳定性。本文件集提供的代码是通过反射机制来实现Android端U盘的安全卸载。反射机制是Java编程语言中的一个高级...
在Android开发中,"打开浏览器"是一个常见的功能需求,它涉及到Android系统中Intent的使用以及浏览器组件的调用。这个实战项目"android实战 打开浏览器"是为Android初学者设计的,通过Android Studio进行实践操作,...
首先,Android应用的生命周期是由系统控制的,通常情况下,用户卸载应用时,系统会停止应用的所有服务,清理其进程,并删除所有数据和文件。然而,开发者有时希望在应用被卸载前执行一些清理或记录操作,例如关闭...