如何动态检测我的应用程序是系统级还是普通级别?

11

我如何区分系统应用和普通应用?我查看了Android的PackageManager,但没有找到相关信息。

编辑:我想通过代码来区分。

if(system app) {
  //do something
}
else{
   //do nothing
}
5个回答

18

你可以尝试使用ApplicationInfo类(android.content.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?
    }
}

1
这实际上是不正确的。虽然大多数已安装的应用程序遵循Application.FLAG_SYSTEM的行为,但某些应用程序可以选择不安装在系统映像上(例如在SD卡上),因此不适用。请参见http://developer.android.com/reference/android/content/pm/ApplicationInfo.html#FLAG_SYSTEM。 - Phil
@ClaireSwinson:Phil是正确的。检查我的答案,以验证一个应用程序是否是“真正”的系统应用程序的双重确认方法。 - Basher51

13

忘记PackageManager吧!您只需要关注自己的应用程序。在Activity#onCreate(Bundle)中,您可以调用getApplicationInfo()并像这样测试其标志:

boolean isSystemApp = (getApplicationInfo().flags
  & (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) != 0;

这并不一定是正确的,@basher51提到的解决方案应该是正确的答案。原因是系统应用程序仍然可以安装在系统镜像之外。这些标志只适用于安装在设备系统镜像中的应用程序。 - Monu Surana


0
一个简单的函数:
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
    }
}

0
首先,你不能卸载系统应用程序,但是你可以使用"设置 > 应用程序 > 管理应用程序"来卸载普通应用程序。

是的,但进入菜单与使用 PackageManager 没有任何关系。 - slinden77

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