在Android中卸载应用程序时调用广播接收器

6

我希望能够在卸载应用程序时清理应用程序创建的垃圾文件。

使用 Manifest 文件:

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

创建接收器来捕获广播事件

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还是清单,在卸载应用程序的事件中都没有调用接收器。如何在卸载应用程序时捕获广播事件?


@nKn:我尝试过那个解决方案,但对我来说没有起作用 :/ - Vikalp Patel
@nKn:由于Action.PACKAGE_REMOVED是基于系统的广播,所以它没有被调用,是这个原因吗? - Vikalp Patel
2
这看起来不像是重复的问题。 另一个问题与我的应用程序无关。 - Hagai L
1个回答

8
您可以获取其他软件包的广播,但却永远无法获取自己软件包的广播。
原因是当您在自己的应用程序中注册卸载接收器并且应用程序被卸载时,已注册的 BroadcastReceiver 在应用程序被卸载之前已被卸载,因此该 BroadcastReceiver 将无法接收到其自身的卸载事件。
想象一个场景,假设注册了一个广播(比如短信接收器),应用程序即将被卸载。现在有一条短信进来了,广播检测到了,但广播的应用程序(创建它的应用)已被卸载,这可能导致系统不一致。因此,这可能就是它发生的原因。

那么如何防止这种情况的发生呢?我一直被困扰着这个问题。由于我使用清单文件来注册广播,那么在实际应用程序卸载之前它是如何被卸载的呢? - Vikalp Patel
只需要想象一种场景,比如注册了一个广播(比如一个短信接收器),然后这个应用程序即将被卸载。现在有短信到来,广播检测到它,但是创建该广播的应用程序已被卸载。这可能会导致系统不一致。因此,或许这就是发生这种情况的原因。 - cafebabe1991
如何避免这种情况呢?在卸载应用程序时广播事件是否可能,因为它是系统受保护的广播? - Vikalp Patel
有没有办法清理我的应用程序在SD卡上创建的垃圾文件? - Vikalp Patel
是的,这将自动处理,但要利用它,请将您的数据存储在此位置:/mnt/sdcard/Android/data/com.yourapp.com。因为安卓在卸载应用程序后会删除此位置内的所有内容。 - cafebabe1991
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接