如何知道一个应用程序将在android中被卸载?

我想实现像AppLock应用程序正在做的事情。
如果在其设置中设置为locking应用程序卸载/安装,则在卸载任何应用程序时(正好点击卸载button)会出现一个locking屏幕,要求input密码/图案。
只有在input密码后才允许用户卸载该应用程序。

什么是意图(或任何东西,我认为这是一个意图,但不知道),当卸载button被点击时得到?

另外我不想让它设备pipe理员,因为我提到的应用程序需要成为设备pipe理员。
如果他们能做到的话,那么有一些办法。 请帮忙。

Solutions Collecting From Web of "如何知道一个应用程序将在android中被卸载?"

我find了一个方法。

  1. 当你去设置 – > pipe理应用程序 – > 点击任何应用程序
    你得到一个广播与包的名字在额外。

  2. 当您单击该屏幕上的“ 卸载”button时,将打开一个活动,名称为com.android.uninstaller.UnistallerActivity

所以解决这个问题的方法是上面提到的1到2步的结合。

当您获得第一步中提到的意图,并且额外内容包含您的应用程序的包名称时,请使用PackageManager启动一个活动监视器,通过该监视器可以获得最顶层的活动及其包。
所以,现在如果卸载程序活动启动,那么你可以确保用户想要卸载你的应用程序。

在那之后你可以采取必要的行动阻止他这样做。

你可以拦截你的应用程序的意图卸载。 简单地把下面的代码放在清单文件中:

 <uses-permission android:name="android.permission.INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.DELETE_PACKAGES" /> <uses-permission android:name="android.permission.CLEAR_APP_CACHE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".UninstallActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.DELETE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="package" android:pathPattern="com.package.yourapp" /> </intent-filter> </activity> </application> 

在此之后,您可以以某种方式处理您的应用程序将被删除,并调用包pipe理器卸载程序。

改为设备pipe理员。 这将自动阻止用户卸载它。 如果用户尝试从“安全”>“设备pipe理员”列表中停用,以便将其卸载,则应用程序可以要求input密码。

尝试在广播接收者的意图下捕捉,并启动你的活动警告活动或处理你想要进行的事情。

“android.intent.action.UNINSTALL_PACKAGE”

这个意图不会被提供或广播到即将卸载的同一个应用程序

看起来这已经经历了很多变化。 PACKAGE_REMOVED的默认广播不能按预期工作。 我偶然发现了这个讨论,实际上并没有实现,但是人们说它已经为他们工作了。 请尝试一下

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/aX5-fMbdPR8

试试这个代码

请尝试通过ActivityManager获取任务中的顶级活动,并检查是否为卸载活动。

  ComponentName topActivity = mActivityManager.getRunningTasks(1).get(0).topActivity; String packageName = topActivity.getPackageName(); String className = topActivity.getClassName(); Log.v(TAG, "packageName" + packageName); Log.v(TAG, "className" + className); if ("com.android.packageinstaller".equals(packageName) && "com.android.packageinstaller.UninstallerActivity".equals(className)) { //Do anything you want here }