我想开发一个可以接收有关正在安装或删除的其他应用的广播的应用。到目前为止,我尝试了下面的代码,但是,它仅在删除安装时提供广播事件,它不提供有关安装或删除的其他应用程序beibg的信息。那么,有没有办法获取新安装的应用程序的包名称。
在表现中:
receiver android:name=".apps.AppListener">
<intent-filter android:priority="100">
<action android:name="android.intent.action.PACKAGE_INSTALL"/>
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>
AppListener中的:
public class AppListener extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// there is a broadcast event here
// but how to get the package name of the newly installed application
Log.v(TAG, "there is a broadcast");
}
}
增加: 对于Api 14或更高版本,不推荐使用此功能。
<action android:name="android.intent.action.PACKAGE_INSTALL"/>
答案 0 :(得分:6)
包名称嵌入到您在onReceive()方法中接收的Intent中。您可以使用以下代码段阅读它:
Uri data = broadcastIntent.getData();
String installedPackageName = data.getEncodedSchemeSpecificPart();
对于PACKAGE_ADDED,PACKAGE_REMOVED和PACKAGE_REPLACED,您可以使用上面的代码获取包名称。
如果应用程序更新,您将获得2个背靠背广播,如下所示: 1. PACKAGE_REMOVED 2. PACKAGE_REPLACED
如果是应用程序更新,PACKAGE_REMOVED意图将包含额外的布尔值,以区分应用程序删除和应用程序更新。 您可以按如下方式读取此布尔值:
boolean isReplacing = broadcastIntent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
只是为了得到你正在调用的包名称PackageManagerService api是开销。必须避免它。
希望,这会对你有帮助。
答案 1 :(得分:1)
有两个选项:
1) 如果您在询问是否可以在卸载相同的应用程序时收到广播,则答案是:
除非您是系统应用,否则无法完成此操作。
Android将在安装时通知应用。这将是一个安全风险,因为它可以使应用程序阻止卸载。
2) 如果您询问何时卸载其他应用程序,则可能与以下内容重复:
答案 2 :(得分:1)
您在onReceive函数中获得的意图包含与要添加或删除的包相关的信息。
intent.getData().toString()
您可以通过此功能获取应用程序名称:
private String getApplicationName(Context context, String data, int flag) {
final PackageManager pckManager = context.getPackageManager();
ApplicationInfo applicationInformation;
try {
applicationInformation = pckManager.getApplicationInfo(data, flag);
} catch (PackageManager.NameNotFoundException e) {
applicationInformation = null;
}
final String applicationName = (String) (applicationInformation != null ? pckManager.getApplicationLabel(applicationInformation) : "(unknown)");
return applicationName;
}