您可以使用另一种方法。在您的应用程序清单中设置元信息,而不是为您的活动设置类别。请注意,无法再检索已删除的包信息(如果尚未使用标志 DONT_DELETE_DATA 删除应用程序)
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="your.package.name"
android:versionCode="1"
android:versionName="1" >
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<meta-data
android:name="meta-name"
android:value="meta-value" />
</application>
</manifest>
添加广播接收器以跟踪软件包安装。检查包的元信息以查看您的值已经存在。
private BroadcastReceiver packageListener = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
Log.i(intent.getAction(), intent.getData().getEncodedSchemeSpecificPart());
//Currently being installed or deleted package
String packageName = intent.getData().getEncodedSchemeSpecificPart();
Object value = null;
try {
ApplicationInfo appInfo = getPackageManager().getApplicationInfo(packageName,PackageManager.GET_META_DATA);
//Get meta value if exits
value = appInfo.metaData.get("meta-name");
} catch (NameNotFoundException e) {
Log.e(TAG, "exception occured", e);
}
//check meta info if it is yours
}
}
如您所见,任何其他应用程序都可以在其清单中设置您的元数据,因此这不是识别您自己的应用程序的安全方法。最好的方法是检查 apk 签名是否都使用相同的证书签名。
private BroadcastReceiver packageListener = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
Log.i(intent.getAction(), intent.getData().getEncodedSchemeSpecificPart());
String packageName = intent.getData().getEncodedSchemeSpecificPart();
Signature[] signatures = null;
try {
PackageInfo packageInfo = getPackageManager().getPackageInfo(packageName,PackageManager.GET_SIGNATURES);
signatures = packageInfo.signatures;
} catch (NameNotFoundException e) {
Log.e(TAG, "exception occured", e);
}
//check installed package signature if it matches
}
}