2012-01-18 66 views
10

我有一个应用程序正在保存安装在设备上的内部开发的应用程序的日志。在安装了Intent.PACKAGE_ADDED广播接收器被调用,使用下面的代码记录了软件包名称:如何查找使用Intent时已被卸载的软件包名称.ACTION_PACKAGE_REMOVED

public class NewInstallReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Bundle b = intent.getExtras(); 
     int uid = b.getInt(Intent.EXTRA_UID); 
     String[] packages = context.getPackageManager().getPackagesForUid(uid); 

     ApplicationService appService = new ApplicationService(context); 
     appService.ApplicationInstalled(packages); 
    } 
} 

我面对的使用Intent.PACKAGE_REMOVED广播接收机时的问题,所有参考包通过唯一的ID(UID)返回空信息(正如您所期望的,因为它已被卸载)。我有一个暂时的解决方案,但它不是很优雅,下一个版本我希望有更清晰的代码。的代码应该如何工作的一个例子:

public class RemoveApplicationReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Bundle b = intent.getExtras(); 
     int uid = b.getInt(Intent.EXTRA_UID); 
     String[] packages = context.getPackageManager().getPackagesForUid(uid); 

     ApplicationService appService = new ApplicationService(context); 
     appService.ApplicationRemoved(packages); 
    } 

} 

因此,要回顾一下,问题是:

如何,程序已被删除后,我可以在意向广播接收器参考软件包的名称。 PACKAGE_REMOVED。

感谢

+0

我也从getPackagesForUid(uid)中获取null。我想要的是获取当前用户安装的所有软件包的列表。任何人都可以提供一些输入吗? – Pratik 2013-09-26 20:44:45

回答

13

包名是你BroadcasReceiver得到了意向书,使用“的getData()”功能,还有就是安装/卸载程序包的ComponentMame。

+12

工作很好...只需使用getData()。getSchemeSpecificPart()。谢谢 – Kennifer 2012-01-18 14:38:25

+4

当我打印出intent.toString()我可以看到包名,但是当我使用intent.getData()。getSchemeSpecificPart()时,我得到一个空字符串。我究竟做错了什么? – gonzobrains 2013-06-05 18:08:15

+3

@gonzobrains您可能没有设置该计划?在清单中,它应该看起来像这样:''“。 – 2015-07-14 16:53:51