2010-04-21 49 views
9

当应用程序被卸载时,是否有办法获取系统通知?检测应用程序是否被卸载

我想维护当前使用我的应用程序的所有客户的信息表。但是,如果没有办法检测到这个事件,这似乎是不可能的。

我能想到的第一个解决方案是在后台监听android.intent.action.PACKAGE_REMOVED,并且始终运行服务。但是那么一旦卸载过程结束,该服务会被杀死,还是会在进程启动之前停止?同样,即使这是一个解决方案,当他们意识到应用程序的一部分在后台运行时,它也有可能推迟很多人。

有什么建议吗?谢谢!

+0

你能找到解决问题的办法吗? – 2012-06-15 14:23:26

回答

6

你可以简单地做,并维持一个积极使用你的应用程序的用户表。只需在程序中的某个点上调用Web服务,以显示它处于活动状态。如果某个应用程序在某段时间未使用,则将其标记为不活动。

6

documentation for the PACKAGE_REMOVED action说以下内容:

正在被卸载并收到此意图包。

所以,你可以监视其他应用程序被卸载,但不是你自己的。

因此,您可能需要跟踪谁仍在使用您的应用程序,而不是谁停止使用它。如果你不想让自己的服务器这样做的开销,你可以使用免费服务,如Flurry

+1

最近谁使用我的应用程序不是一个准确的测量,这并不能满足我的需求。我使用GAE,所以我不担心服务器端。 – mobilekid 2010-04-21 19:27:35

+0

如何监视应用程序卸载与乱舞?这正是我需要的,但无法真正了解如何做到这一点。 – mkorszun 2014-05-15 08:57:37

1

从Android的文件,由用户卸载应用程序不能得不到

Intent.ACTION_PACKAGE_REMOVE 

但我们可以用其他的方法来实现此功能。我们都知道,在用户安装应用程序后,在/ data/data目录下有一个以您的软件包名称命名的目录。如果您的应用程序由用户卸载,则应用程序的根目录(/data/data/com.example.yourappname)将被系统删除。删除操作在用户点击“卸载”时立即发生,并且该目录将被框架包管理器系统删除。因此,我们可以监视您的应用程序数据目录(通常为/data/data/com.example.yourappname)的存在以检测您的应用程序是否由用户卸载。

为了监视这个目录,我们必须从JNI中分离出一个分离的进程。 在这个新的fork过程中,我们可以使用Linux系统api inotify(7)或access(3)来确定应用程序数据目录的存在。

Here是一个可行的实现。但是当尝试发送在高版本Android设备上启动系统浏览器的意图时,它遇到了许可问题。我不知道如何绕过这一点。然而上面的例子对于你的问题已经足够了。

希望它会有所帮助!

0

Android不提供用于跟踪应用程序卸载的内置功能。

通知可用作跟踪应用程序卸载的替代方法。为此在应用程序上发送通知并跟踪通知的状态。计算特定时间段内未送达通知的数量。如果未送达通知的状态在特定时间段内未发生变化,请考虑应用程序是否已从设备上卸载。

例如,我使用了一个每3天运行一次的cron脚本,并检查最近10次传递到设备的通知的状态(每天发送2次通知)。如果所有这10个通知的状态均为“未传送”,则应用程序将被视为从设备上卸载。

相关问题