`
- 浏览:
340442 次
- 性别:
- 来自:
广州
-
[size=large]最近做项目的时候碰到这样一个需求:用户卸载应用后提供反馈信息以便更好的改进软件,并统计卸载量。Android可以监听卸载广播,得到什么应用被卸载了,但是系统并没有提供监听自己卸载的方法,于是乎,在网上找了一些方法,根据自己需求做了些修改,最后完成这个需求。
调研
方案1:监听Android卸载广播
注册BroadcastReceiver,监听”android.intent.action.PACKAGE_REMOVED”系统广播,这个方法肯定不行,卸载的第一步就是退出当前应用的主进程,而此广播是在已经卸载完成后才发出的,此时主进程都没有了,肯定接收不到这个系统广播了,所以这个方案首先被pass。
方案2:监控Android日志实现
启动一个服务监控android系统的打印日志,当监控到”android.intent.action.DELETE”并且包含自己应用的包名时,意味着自己将要被卸载,这时提示信息给用户,或者弹出网页。这个方案确实可行,网上早已有人实现了,实现的博客地址。
但是这个解决方案有几个很大的弊端:
因为服务要一直监控日志,所以会比较耗电。
程序必须在启动的情况下才可以监控。
点击设置中的卸载按钮即发出此Intent,此时用户尚未在弹框中确认卸载,其实用户还没真正意义上卸载。
pm命令卸载不出发此Intent,意味着被诸如手机安全管家,豌豆荚等软件卸载时,无法提前得知卸载意图。
由于以上问题,这种方案也被舍弃了。
方案3:监控/data/data/{package_name}目录实现
由于Android要卸载一个应用程序的时候,会删除私有目录(/data/data/{package_name}),所以监控这个目录是否被删除也可以实现,据网上的一些博客说,360和豌豆荚使用的就是这种方法。那我们就具体研究一下这个方案。
实现
第一种方法
在Java中线程直接轮询这个目录是否存在,以此为依据判断自己是否被卸载。但是主进程退出,相应的线程必定退出,线程还没等到判断目录是否存在就已经被销毁了。不可行,pass。
第二种方法
用C来实现,通过Fork子进程,然后在子进程中通过监控/data/data/{package_name}目录是否删除实现。在子进程中进程轮询”/data/data/包名”目录是否存在。这个方法,网上实例已经实现了。但用轮询的方法,依然没解决耗电的问题。
第三种方法
同第二种方法类似,不同的是不再采用轮询的方式,而是用linux中 inotify_init、inotify_add_watch监控文件系统目录,判断目录是否被删除,然后提示给用户。这个方法也有成熟的解决方案了,链接在这儿。但这个方案也有几个弊端:
清除数据、插拔USB线、覆盖安装等操作引起程序误判卸载。
重复监听的问题。
用户将已在Internal SD卡安装好的应用移动到external SD卡,导致监听不正常。
第四种方法(目前为止最优)
修复第三种方法提到的一些bug:
原因:
由于inotify_add_watch(fileDescriptor, path, IN_DELETE)这个函数会监听path目录下所有文件的删除操作导致。
重复调用JNI的init方法
解决方法:
监听不应该针对整个文件夹,而是某个文件。
重复监听的问题,都可以通过加文件锁来防止。[/size]
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
实现fork()子进程创建监听文件初始化 inotify 实例注册监听事件调用 read 函数开始监听卸载反馈统计场景正常卸载断网卸载清除数据(5.0 以上不支持)kill 进程(5.0 以上不支持)插拔 USB 线覆盖安装内部存储移到 SD...
在实际开发中,这种监听卸载的行为可能用于数据统计、反馈用户行为或者触发其他依赖于应用存在的服务。但需要注意的是,由于Android的安全机制,这种方法并不能保证100%成功,因为系统可能会在广播发送之前就彻底...
这个压缩包"Android高级应用源码-监听自身被卸载.zip"可能包含了一个示例项目,演示了如何在Android应用中实现这一功能。 首先,我们要理解在Android系统中,应用程序的卸载通常是通过用户在系统设置或者应用管理...
这个"UnInstallDemo"项目就是一个示例,它展示了如何在Android应用内部实现自卸载的功能,并且可能还包含了对用户反馈和统计的处理机制。作为一个开源项目,这为开发者提供了一个学习和参考的实例。 首先,让我们...
Android App监听自身卸载,反馈统计 方案 监听系统卸载广播:只能监听到其他应用的卸载广播,无法监听到自己是否被卸载。 读取系统log:第三方软件卸载无法得知。...卸载反馈统计 场景 正常卸载 断网
这个项目就是针对这种需求的一个实例,它利用了libcurl库来实现在Android应用卸载后的网络请求。 libcurl是一个强大的开源库,用于在各种编程语言中处理URL并传输数据。它支持多种协议,包括HTTP、HTTPS、FTP等,...
在本课程"传智播客_Andorid_Android项目手机卫士视频video_day07"中,我们将深入探讨Android应用程序开发的关键技术,特别是在构建类似“手机卫士”这样的实用工具应用时所需的知识点。该课程可能包括多个视频教程,...
【安卓Android源码——安卓手机卫士完整版.zip】是一个包含安卓应用开发源代码的压缩包,主要用于展示和学习如何构建一个完整的安卓手机安全防护应用。这个项目可能涵盖了多种技术点,包括但不限于权限管理、病毒...
4. **交互反馈**:如果用户点击推送消息,客户端需要向服务器发送反馈,告知消息已被查看或处理,以便服务器进行相应记录和统计。 5. **异常处理**:客户端需要处理各种可能的异常情况,例如网络中断、用户未授权等...
- **Material Design**:Android应用通常遵循Material Design设计指南,CalenderDemo可能使用了Material Components库,提供了现代且一致的UI元素。 - **自定义布局**:开发者可能创建了自定义布局文件来适应签到...