1、在AndroidStudio升级到3.4.1,SDK升级到28以后,遇到了分包问题
* 异常ClassNotFoundException: Didn't find class "***" on path: DexPathList/-1.apk
* 问题描述:在Android4.4手机上遇到的问题,APK安装成功后,APP一打开就直接奔溃,Android6.0以上手机启动没问题
* 原因:程序引用第三方jar库的时候,必须使用到分包,但是没有初始化
* 解决方法:
1、app的build.gradle中添加multiDexEnabled
defaultConfig {
applicationId "*.*.*"
minSdkVersion 16
targetSdkVersion 28
versionCode 1
versionName "1.0"
multiDexEnabled true
2、引用依赖
implementation 'com.android.support:multidex:1.0.3'
3、在自己的Application中注册(有人说在Application的onCreate中注册,亲测没用),正确的是复写attachBaseContext方法,在这里注册。
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(base);
}
2、在Dialog.show的时候遇到WindowManager$BadTokenException问题
* 异常:android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
* 问题描述:在Dialog.Show之前,加了优先级设置,alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);
* 原因:API 25以上系统直接禁止用户使用TYPE_TOAST创建悬浮窗。
* 解决方法:在Android7.1.1上使用需要申请system alert window权限的系统级悬浮窗,或者是层级较低的TYPE_PHONE悬浮窗。
* 使用需要申请系统权限的悬浮窗:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
3、使用Glide加载图片的时候遇到IllegalArgumentException
* 异常:java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity
* 问题描述:在Glide.with的时候,Activity销毁了
* 解决方法:在Glide加载的时候判断activity是否已经销毁,没有再加载
private static boolean isValidContextForGlide(Context context) {
if (context == null) {
return false;
}
if (context instanceof Activity) {
Activity activity = (Activity) context;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
return !activity.isDestroyed() && !activity.isFinishing();
} else {
return !activity.isFinishing();
}
}
return true;
}