问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何对自身应用进行卸载监听

发布网友 发布时间:2022-04-23 19:46

我来回答

1个回答

热心网友 时间:2023-10-05 11:18

前段时间有个同事问我android应用在卸载以后,如何能够通知一下服务器,让用户填写一下卸载的原因,以求为将来的应用修改积累数据。当时他是有段源代码的,但是有点小问题,我只是帮他定位一下了代码的问题,具体细节没有研究。又加上最近工作比较繁忙,所以就放下来了,今天稍微有点空,就自己做了一个应用demo,告知一下诸位在android中如何做到监听自身应用被卸载了。

一 效果演示

打开应用效果图:

图1

点击卸载后提示,如下图:

图2

然后退出应用,卸载程序,会发现当应用被卸载以后,会弹出调用浏览器的提示,这里随便放了一个搜狐浏览页面,在自己的应用中应该调用的一般都是调查页面。如下图:

图3

ok,效果前面已经演示了,现在需要讨论一下其具体实现了。
首先,通过adb shell进入手机,然后第一次进入应用,,像图1一样,不点击按钮,通过 ps | busybox grep ubuntu 看这个应用的进程信息,如下图:

这个时候只有
u0_a108 2953 124 490956 47792 ffffffff 40052a40 S com.example.ubuntuforandroid
2953 这一个进程

点击 卸载后提示 按钮再次,执行刚才执行的ps命令,发现已经有两个进程了如下图:

其实新产生的进程是通过程序调用jni接口

public static native int Reguninstall(String path,String url);

这个接口fork了一个进程,而新fork的进程负责监听本应用是否被卸载了

二 源码分析

java层的代码如下,很简单,就是调用一下jni接口

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initInjectFunction("testfile"); test = (TextView)this.findViewById(R.id.testview); test.setText("点击卸载后提示按钮,你的应用在卸载以后会调用浏览器,然后调用你需要的页面。"); btn = (Button)this.findViewById(R.id.testbtn); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub String directory = MainActivity.this.getFilesDir().getAbsolutePath(); String url = "http://www.sohu.com/"; JniExec.Reguninstall(directory,url); test.setText("现在可以退出应用,然后卸载应用,看看是否有效果"); } }); }

一目了然,不用多言了

现在就分析
package com.example.ubuntuforandroid; public class JniExec { static { System.loadLibrary("uninstall"); } public static native int Reguninstall(String path,String url); }
Reguninstall 这个jni接口里面做了什么事情,能够达到监听本身应用卸载的效果。

native代码分析

jint Java_com_example_ubuntuforandroid_JniExec_Reguninstall(JNIEnv* env, jobject thiz, jstring path, jstring url) { LOGI("Java_com_example_ubuntuforandroid_JniExec_Reguninstall"); char *listenpath = (char*) (*env)->GetStringUTFChars(env,path, 0); char *jumpurl = (char*) (*env)->GetStringUTFChars(env,url, 0); LOGI("notify path is %s",listenpath); LOGI("jumpurl is %s",jumpurl); pid_t pid; pid = fork(); if(pid == 0) { //子进程 inotify_main(listenpath,jumpurl); } //父进程不阻塞调用 waitpid ok 子进程变成了孤儿进程,被init进程收养了 pid = waitpid(-1,0,1); LOGI("father bye bye"); return 0; }

这个接口里面最关键的是调用了 inotify_main 这个函数。如果看这段代码比较费力的话,建议先弄清楚linux 下的fork机制,搞清楚 孤儿进程 僵尸进程这些如何产生的情况。

下面看 inotify_main 这个函数
void inotify_main(char *path,char *url) { struct pollfd poll_list[2]; poll_list[0].fd = inotify_init(); poll_list[0].events = POLLIN; int wd = inotify_add_watch(poll_list[0].fd, path, IN_DELETE | IN_CREATE); if(wd < 0) { fprintf(stderr, "could not add watch for %s, %s\n", path, strerror(errno)); return ; } int retval; while(1) { retval = poll(poll_list,(unsigned long)1,-1); /* retval 总是大于0或为-1,因为我们在阻塞中工作 */ LOGI("retval = %d\n",retval); if(retval < 0) { fprintf(stderr,"poll错误: %s/n",strerror(errno)); return; } if((poll_list[0].revents & POLLIN) == POLLIN) { LOGI("poll_list[0].revents&POLLIN\n"); inotify_handle(poll_list[0].fd,url); } } inotify_rm_watch(poll_list[0].fd,wd); }
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
街头篮球手游中锋攻略汇总 C位攻略大全 街头篮球手游中锋有什么技巧 中锋C技巧详解 php一个表单提交数据怎么区分开,隐藏域可以吗,如果可以怎么用。 梦见牙掉光了什么预兆 梦见牙齿掉完了是什么征兆 梦见牙齿全掉了是什么预兆 梦见一口牙全部掉了是什么预兆 教师年度考核不认课的领导班子成员,干的工作不少,怎样考核办法公平... 湖北省郧西县义务教育学校绩效工资实施办法绩效工资总量和水平的... 事业单位年底是否有绩效奖金的 java怎样读取文件所有内容,主要是跳行问题?谢谢了 用java执行一句Linux命令(&quot;&#47;etc&#47;init.d&#47;networking start&quot;),怎么写? linux中的read -t 5命令做什么用的,他的意思是的read 5秒后自动退出... latex做的简历里如何加入一条分割线 - 信息提示 可以用JAVA构造CMS系统么? 安卓版rescue time 怎么用 Delphi7.0程序设计语言的优点和缺点 taglist支持verilog吗 很多Linux软件的源码包中都有一个名为TODO的ASCII文件,请问这个文件是干吗的? ubuntu todo list 哪个好 华为畅想9plus手机外屏坏了能换吗? 华为手机外屏摔碎了,想换个原装的需要多少钱? 华为手机外屏碎了该怎么办? 一口酥豆腐的做法大全 脆皮豆腐怎么烧 华为手机外屏碎了怎么换? 脆皮豆腐怎么做好吃? 你心目中最好看的法国科幻片是哪部?为什么? 浪漫与科幻糅合,文艺与幻想结合于是产生法国科幻片,法国有哪些科幻片堪称经典? 股东分红如何实现 股东分红怎么定? 什么是股东分红权? 开公司股东分红是怎么分的。 股东是如何分红的? 公司法对股东分红的规定如何规定? 股东分红 股东分红应怎么分 新股东分红一般有哪些方式 韫色过浓漫画哪里能看 基金519018分红什么时候到账 基金580001 基金净值查询 高收益低风险... 基金519018什么时候分红 我的基金519018是红利再投今日查询发现份额多了八百多份是怎么回事 519018基金为什么3月3曰至3月4日净值相差很多呢? 天赋均衡基金从2011年之2015年是否有分红 汇添富均衡(519018)基金怎么一下子跌了10%啊? 519018累计净值是什么意思 我2007年 8月中 买了 汇添富 519018 基金10000元,谁可以告诉我现在还值多少钱?? 519018基金如何 519018基金汇添富均衡我是2007年买入四万元,请高人帮忙分析一下,现在如何是好?