在android中卸载应用程序时调用广播接收器[重复]

Posted

技术标签:

【中文标题】在android中卸载应用程序时调用广播接收器[重复]【英文标题】:Call broadcast receiver at time of uninstalling application in android [duplicate] 【发布时间】:2014-03-26 05:20:25 【问题描述】:

我想清理我的应用程序在UnInstalling应用程序上创建的垃圾。

使用 ManiFest 文件:-

在清单文件中添加:

 <receiver android:name="com.netdoers.com.ui.CleanReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.PACKAGE_REMOVED" >
            </action>
            <data android:scheme="package"/>
        </intent-filter>
    </receiver>

创建接收器来捕获BroadCast Event

public class CleanReceiver extends BroadcastReceiver

  public void onReceive(Context context, Intent intent) 
    CustomToast.showToastMessage(context, "Uninstalling Application");
    Log.e("Uninstall", "CleanReceiver Called");
  
 

在 Java 代码中:-

 BroadCastReceiver br = new CleanReceiver();
 IntentFilter intentFilter = new IntentFilter();
 intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
 intentFilter.addDataScheme("package");
 registerReceiver(br, intentFilter);

但在卸载应用程序时,接收器从未被调用过。

Java 和 Manifest 都不会在卸载应用程序时调用 Receiver。卸载应用时如何捕捉广播事件?

【问题讨论】:

@nKn :我已经尝试过该解决方案,但它对我不起作用:/ @nKn :因为这些 Action.PACKAGE_REMOVED 是基于系统的广播,所以它没有被调用还是什么? 这看起来不像是重复的。另一个问题与我自己的申请无关。 【参考方案1】:

您可以为任何其他被卸载的软件包获取广播,但不能为您自己的软件包获取广播。

原因

这是因为当你在自己的应用中注册卸载接收器时,当应用被卸载时,注册的BroadcastReceiver在应用被卸载之前已经被卸载,所以它自己的卸载事件不会被那个BroadcastReceiver接收到。

想想一个场景,说广播已注册(比如短信接收器)并且应用程序即将被卸载。现在短信进入广播检测到它但广播的应用程序(创建它)被卸载了。可能导致系统不一致。所以这可能就是它发生的原因。

【讨论】:

那么如何预防这种情况呢?长期以来,我一直坚持这些。由于我使用 Manifest 文件注册广播,那么它是如何在实际应用程序被卸载之前被卸载的? 试想一个场景,说广播已注册(比如短信接收器)并且应用程序即将被卸载。现在短信进入广播检测到它但广播的应用程序(创建它)被卸载了。这可能会导致系统不一致。所以这可能就是它发生的原因。 那么如何避免这种情况呢?是否可以在卸载应用程序时广播事件,因为它是受系统保护的广播? 您自己的应用程序无法实现自己的卸载。对于任何其他被卸载的应用程序,它可能很有用。 是否可以清理我的应用程序在 SD 卡上创建的垃圾?

以上是关于在android中卸载应用程序时调用广播接收器[重复]的主要内容,如果未能解决你的问题,请参考以下文章

应用的安装卸载更新监听

Android实战开发篇 全网最详细广播监听应用APK卸载覆盖安装!!!

android中啥时候会选择用广播来进行线程间的通信

android 类中的 广播怎么使用

android中怎么用接收到广播后弹出对话框

Android:向活动添加锁定模式