发生这种错误原因第一个是:binder通信
getPackageManger 是通过binder通信的,最大通信是1M,而且这个binder通信是系统整个的,
也就是当前整个手机APP所有应用同一个时刻,或者同一个时间内 进行通信 超过了IM,
就会报:RuntimeException 和 RomatoException 这里大家想的办法是同步,不能一定保证的,
第二个原因是:是我们写代码的习惯连着写,如下面这样的:
getPackageManger.getApplicationInfo(),这个时候编辑器智能提示的 只有getApplicationInfo()可能发生的异常,NameNotFoundException
从而让我们忽略了 运行时异常,导致程序崩溃。这里大家想的办法是分开,我推荐这种
代码语言:javascript复制<span style="font-size:18px;"><strong> public static ApplicationInfo getApplicationInfo(Context context) {
PackageManager pm;
String packageName;
try {
pm = context.getPackageManager();
packageName = context.getPackageName();
} catch (RuntimeException e) {
return null;
}
if (pm == null || packageName == null) {
return null;
}
ApplicationInfo applicationInfo;
try {
applicationInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
} catch (PackageManager.NameNotFoundException e) {
return null;
}
return applicationInfo;
}</strong></span>
当然还有一种是如果习惯连着写,那就把两种异常 选择他们的父类即可,
代码语言:javascript复制<span style="font-size:18px;"><strong> try {
PackageManager pm = mContext.getPackageManager();
ApplicationInfo ai = pm.getApplicationInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);
return ai.uid;
} catch (Exception e) {
e.printStackTrace();
}</strong></span>
这里为什么不采用同步,因为那个还是无法避免超过1M的,所以只要无法获取就直接返回NULL比较好。