效果图以下:android
须要监听何时卸载,卸载后执行部分操做git
一、监听系统卸载广播github
只能监听到其余应用的卸载广播,没法监听到本身是否被卸载。数组
内存 --》 监听 别人
. ACTION_PACKAGE_REMOVED
2.ACTION_PACKAGE_REMOVED 复制代码
二、卸载 bash
经过系统log (正在被安装的包程序不能接收到这个广播)微信
监听自身 复制代码
三、Java线程 函数
轮训 监听 监听/data/data/{package-name}目录是否存在学习
四、C进程ui
监听/data/data/{package-name}目录是否存在 跳转到网页spa
五、静默安装另外的apk
监听本身是否被卸载 能够,可是前提须要(root)
从上面分析来看
监听 /data/data/{package-name}目录是否存在复制代码
从前四种方案能够看到,单纯的Java层代码是没法监听自身卸载的。既然Java层没法实现,咱们试着使用C语言在底层实现。
借助Linux进程fork出来的C进程在应用被卸载后不会被销毁,监听/data/data/{package-name}目录是否存在,若是不存在,就证实应用被卸载了。
是仿照FileObserve监听文件的方式,在本地方式中进行拦截和操做
接下老我么来看下FileObserve的源码
FileObserve一进来的时候就开启了一个线程,以下:
利用本利方法进行监听:
在线程中进行操做:
C中fork代码以下:
JNIEXPORT
void JNICALL
Java_unstall_yyh_com_a360installtolistener_MainActivity_callUnInstallListener(JNIEnv *env,jobject obj,jint versionSdk,jstring path){
LOGD("------------------------");
LOGF("------------------------");
const char * path_str = env->GetStringUTFChars(path,0);
pid_t pid = fork();
if(pid < 0){
LOGD("克隆失败");
}else if(pid > 0){
LOGD("父进程");
}else{
LOGD("子进程!");
//*******************在这里进程操做*****************
LOGD("你好,终端研发部");
int fuileDescript = inotify_init();
int watch = inotify_add_watch(fuileDescript,path_str,IN_DELETE_SELF);
void * p = malloc(sizeof(struct inotify_event));
read(fuileDescript,p, sizeof(struct inotify_event));
inotify_rm_watch(fuileDescript,watch);
LOGD(LOG_TAG,"接下来进行操做,来条状网页!!!");
if(versionSdk< 17){
//am start -a android.intent.action.VIEW -d http://gityuan.com
execlp("am","am","start","-a","android.intent.action.VIEW","-d","https://mp.weixin.qq.com/s?__biz=MzI3OTU0MzI4MQ==&mid=2247484366&idx=2&sn=a015497277d2a6380a80fdc9031ca51c&chksm=eb476f50dc30e64620fbb8a7ce0aebc445638c5f1097763e0da36fc40beb85fb256d980af440&scene=18#wechat_redirect",NULL);
}else{
execlp("am","am","start","--user","0","-a","android.intent.action.VIEW","-d", "https://mp.weixin.qq.com/s?__biz=MzI3OTU0MzI4MQ==&mid=2247484366&idx=2&sn=a015497277d2a6380a80fdc9031ca51c&chksm=eb476f50dc30e64620fbb8a7ce0aebc445638c5f1097763e0da36fc40beb85fb256d980af440&scene=18#wechat_redirect",NULL);
}
}
env->ReleaseStringUTFChars(path,path_str);
}复制代码
最后卸载监听的是我技术号里的一篇文章。
若是对ndk不了的同窗们能够一下参考博客:
NDK探究之旅:
NDK探究之旅《十》——ndk项目实战之Androidstudio开发经验总结
关于更多:
GitHub下载连接:
下载慢?
若是你以为此文对您有所帮助, 欢迎关注微信公众号:终端研发部 这里不单单学到的是技术
(欢迎关注学习和交流)