如何区分系统应用程序和普通应用程序?我通过android PackageManager
看了一遍,也找不到任何东西。如何动态检测我的应用程序是系统还是正常?
编辑:我想通过代码来区分。
if(system app) {
//do something
}
else{
//do nothing
}
如何区分系统应用程序和普通应用程序?我通过android PackageManager
看了一遍,也找不到任何东西。如何动态检测我的应用程序是系统还是正常?
编辑:我想通过代码来区分。
if(system app) {
//do something
}
else{
//do nothing
}
您可以尝试使用ApplicationInfo类(android.conent.pm)中可用的标志。例如:
...
PackageManager pm = getPackageManager();
List<ApplicationInfo> installedApps = pm.getInstalledApplications(0);
for (ApplicationInfo ai: installedApps) {
if ((ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
// System app - do something here
...
} else {
// User installed app?
}
}
对于初学者来说,你不能卸载的系统应用程序,但您可以通过卸载应用程序正常“设置>应用程序>管理应用程序”。
是的,但进入菜单与使用'PackageManager'没有任何关系 – slinden77 2012-11-10 09:28:00
忘记PackageManager!你只问过你自己的应用程序。在您的活动#的onCreate(捆绑),你可以叫getApplicationInfo(),并测试其标志是这样的:
boolean isSystemApp = (getApplicationInfo().flags
& (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) != 0;
这比接受的答案好得多 – ottel142 2014-10-08 12:00:28
这不一定是真的,@ basher51提到的解决方案应该是正确的答案。原因是系统应用程序仍然可以安装在系统映像之外。这些标志仅适用于安装在设备系统映像中的应用程序 – 2016-09-13 00:47:08
一个简单的函数:
public boolean isUserApp(ApplicationInfo ai,boolean getUpdatedSystemApps){
if ((ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
if(getUpdatedSystemApps==true){
if((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0){
return true;
} else {
return false;
}
}
return false;
} else {
return true;
}
}
你可以使用像上面这样的功能:
PackageManager pm = getPackageManager();
List<ApplicationInfo> allApps = pm.getInstalledApplications(0);
for (ApplicationInfo ai: allApps) {
if (isUserApp(ai,true)) {
// User app or Updated SystemApp - do something here
...
} else {
// System app
}
}
这实际上并非如此。尽管大多数安装的应用程序遵循'Application.FLAG_SYSTEM'的行为,但某些应用程序可以选择不安装在系统映像上(例如在SD卡上),这不适用。请参阅http://developer.android.com/reference/android/content/pm/ApplicationInfo.html#FLAG_SYSTEM – Phil 2012-01-09 05:48:30
@ClaireSwinson:菲尔是正确的。检查我的答案是一种双重确认方法,以验证应用程序是否是“真实”系统应用程序与否。 – Basher51 2014-08-14 05:01:14