如何动态检测我的应用程序是系统还是正常?

如何区分系统应用程序和普通应用程序? 我查看了android PackageManager并找不到任何东西。

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

 if(system app) { //do something } else{ //do nothing } 

您可以尝试使用ApplicationInfo类(android.conent.pm)中提供的标志。 例如:

 ... PackageManager pm = getPackageManager(); List 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! 您只询问了自己的应用程序。 在Activity#onCreate(Bundle)中,您可以调用getApplicationInfo()并测试其标志,如下所示:

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

对于初学者,您无法卸载系统应用程序,但可以使用“设置>应用程序>管理应用程序”卸载普通应用程序。

一个简单的function:

 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; } } 

你可以使用上面的function:

 PackageManager pm = getPackageManager(); List allApps = pm.getInstalledApplications(0); for (ApplicationInfo ai: allApps) { if (isUserApp(ai,true)) { // User app or Updated SystemApp - do something here ... } else { // System app } } 

我看到Pankaj Kumar在这个SO链接中给出了一个全面的答案:“ 我如何检查一个应用程序是否是Android中的非系统应用程序? ”或者在他的博客中写道:“ http://pankajchunchun.wordpress.com/2014 / 07/08 / how-to-check-if-application-is-system-app-or-not-by-signed-signature / “。