效果圖以下: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下載連接:
下載慢?
若是你以爲此文對您有所幫助, 歡迎關注微信公衆號:終端研發部 這裏不單單學到的是技術
(歡迎關注學習和交流)