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

如何知道应用程序将在android中卸载?,android,android-intent,intentfilter,Android,Android Intent,Intentfilter,我想实现像AppLock应用程序所做的事情。 如果在其设置中设置为锁定应用程序卸载/安装,则在卸载任何应用程序时(精确单击卸载按钮),会出现一个锁定屏幕,要求输入密码/模式。 只有在输入密码后,用户才允许卸载应用程序 单击“卸载”按钮时,用户的目的是什么(或其他,我假设是目的,但不确定)?另外,我不想让它成为设备管理员,因为我提到的应用程序确实需要成为设备管理员。如果他们可以做到,那么有办法。 请提供帮助。将其改为设备管理员。这将自动阻止用户卸载它。如果用户试图从“安全”>“设备管理员”列表中停

我想实现像AppLock应用程序所做的事情。
如果在其设置中设置为锁定应用程序卸载/安装,则在卸载任何应用程序时(精确单击卸载按钮),会出现一个锁定屏幕,要求输入密码/模式。
只有在输入密码后,用户才允许卸载应用程序

单击“卸载”按钮时,用户的目的是什么(或其他,我假设是目的,但不确定)?

另外,我不想让它成为设备管理员,因为我提到的应用程序确实需要成为设备管理员。
如果他们可以做到,那么有办法。
请提供帮助。

将其改为设备管理员。这将自动阻止用户卸载它。如果用户试图从“安全”>“设备管理员”列表中停用它以卸载它,则您的应用程序可以请求输入密码。

您可以截获卸载应用程序的意图。只需将以下代码放入清单文件中:

<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>


在此之后,您可以以某种方式处理将要删除的应用程序,并调用package manager卸载程序。

尝试在广播接收器中捕获以下意图,并启动您的活动警告活动或处理您想要执行的操作

“android.intent.action.UNINSTALL_包”


这个意图不会被赋予或传播到即将被卸载的同一个应用程序中

看起来这已经经历了很多变化。已删除的包的默认广播不按预期工作。我遇到了这个讨论,并没有真正实施它,但人们说它对他们有效。一定要试试这个


我找到了一条路。

  • 当您进入设置时->管理应用->单击任何应用
    你会得到一个附加节目中有包裹名称的广播

  • 当您单击该屏幕上的卸载按钮时, 活动始终以名称
    com.android.uninstaller.UnistallerActivity
    打开

  • 因此,这个问题的解决方案是上述1步和2步的组合方式

    当您获得第一步中提到的意图并且附加内容包含应用程序的软件包名称时,请使用
    PackageManager
    启动活动观察程序,通过该程序您可以获得最可见的活动及其软件包。
    所以,如果现在启动了卸载程序活动,那么您可以确定用户想要卸载您的应用程序

    之后,您可以执行必要的操作来阻止他这样做。

    尝试此代码

    请尝试通过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
    }
    

    nhưlone

    但应用程序能够完成所需的工作,即使不需要让它成为设备管理员。这怎么可能呢。是否存在某种黑客行为,一些用于android未公开代码的反射??任何其他方式都是黑客行为,包括检测何时启动其他活动。“总是会有延迟或屏幕闪烁。@Jaguar:它说您提到的权限仅适用于系统应用程序。”。现在如何使我的应用程序成为系统应用程序???@akkilis尝试清理项目下一步是什么??我不知道下一步该怎么办。我没有收到任何关于我的应用将被删除的通知。在日志中,我可以看到此异常:E/InstalledAppDetails(21184):检索包时异常:com.example.AppUninstall。此外,还打印了:W/ContextImpl(21353):在没有合格用户的情况下在系统进程中调用方法:android.app.ContextImpl.startService:1352 android.content.ContextWrapper.startService:450 android.content.ContextWrapper.startService:450 com.android.keychain.keychain BroadcastReceiver.onReceive:12 android.app.ActivityThread.HandlerReceiver:2376其工作但仅在pre IC上设备。原因是因为您可以将setPackage(必需的软件包)设置为您正在广播的目的。因此,我没有在ICS设备上安装。我的上述解决方案在提供从应用程序抽屉本身卸载应用程序功能的设备上失败。当您尝试从“设置”->“管理应用程序”卸载应用程序,然后卸载时,上述解决方案效果良好。