package com.edufound.base; import android.app.Activity; import android.app.ActivityManager; import android.app.Application; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.view.Gravity; import androidx.annotation.RequiresApi; import com.edufound.base.activity.CrashDialogActivity; import com.edufound.base.bean.ChannelCodeEnum; import com.edufound.base.crash.Cockroach; import com.edufound.base.crash.CrashLog; import com.edufound.base.crash.DebugSafeModeTipActivity; import com.edufound.base.crash.DebugSafeModeUI; import com.edufound.base.crash.ExceptionHandler; import com.edufound.base.util.BaseConsts; import com.edufound.base.util.GlideUtils; import com.edufound.base.util.OkHttpClient; import com.edufound.base.util.WordFilter; import com.hjq.toast.ToastStrategy; import com.hjq.toast.Toaster; import com.orhanobut.logger.Logger; import com.tencent.mmkv.MMKV; import com.umeng.analytics.MobclickAgent; import com.umeng.commonsdk.UMConfigure; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; import java.util.ArrayList; import java.util.List; public class BaseApplication implements ModuleMediator.ModuleInitial { public static List mActivityList = new ArrayList<>(); @Override public void initModule(Application application) { try { BaseConsts.setAppPackageName(application.getPackageName()); //初始化异常 if (!BaseConsts.isDebug()) { Logger.e("Consts.isDebug:" + BaseConsts.isDebug()); //不在测试环境下,初始化异常 initException(application); } //初始化mmkv MMKV.initialize(application); //初始化toaster Toaster.init(application); Toaster.setStrategy(new ToastStrategy()); Toaster.setGravity(Gravity.CENTER); Toaster.setView(R.layout.toast); //初始化OKhttp3 OkHttpClient.initOkHttpUtil(application); //修改xml问题 XmlPullParserFactory.newInstance().setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); //初始化友盟 UMConfigure.setLogEnabled(true); UMConfigure.preInit(application, getUmengAppKey(application), getUmengChannel(application)); BaseConsts.setUID("test"); MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO); application.registerActivityLifecycleCallbacks(activityLifecycleCallbacks); BaseConsts.mWordFilter = new WordFilter(); //清除图片缓存 new Thread() { @Override public void run() { super.run(); GlideUtils.removeAll(application); BaseConsts.mWordFilter.filter_jk_info2("初始化"); } }.start(); } catch (XmlPullParserException e) { e.printStackTrace(); } } private void initException(Application application) { final Thread.UncaughtExceptionHandler sysExcepHandler = Thread.getDefaultUncaughtExceptionHandler(); DebugSafeModeUI.init(application); Cockroach.install(application, new ExceptionHandler() { @Override protected void onUncaughtExceptionHappened(Thread thread, Throwable throwable) { CrashLog.saveCrashLog(application, throwable); new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { Logger.e("Cockroach.install:onUncaughtExceptionHappened"); } }); } @Override protected void onBandageExceptionHappened(Throwable throwable) { throwable.printStackTrace();//打印警告级别log,该throwable可能是最开始的bug导致的,无需关心 } @Override protected void onEnterSafeMode() { // int tips = R.string.safe_mode_tips; // Toast.makeText(Consts.getmApplicAtion(), getResources().getString(tips), Toast.LENGTH_LONG).show(); // DebugSafeModeUI.showSafeModeUI(); if (BaseConsts.isDebug()) { Intent intent = new Intent(application, DebugSafeModeTipActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); application.startActivity(intent); } else { Intent intent = new Intent(application, CrashDialogActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); application.startActivity(intent); } } @RequiresApi(api = Build.VERSION_CODES.N) @Override protected void onMayBeBlackScreen(Throwable e) { Thread thread = Looper.getMainLooper().getThread(); e.printStackTrace(); //黑屏时建议直接杀死app sysExcepHandler.uncaughtException(thread, new RuntimeException("black screen")); killAppProcess(application); } }); } public static void killAppProcess(Context context) { for (int i = 0; i < mActivityList.size(); i++) { mActivityList.get(i).finish(); } //注意:不能先杀掉主进程,否则逻辑代码无法继续执行,需先杀掉相关进程最后杀掉主进程 //杀掉umeng得进程 MobclickAgent.onKillProcess(context.getApplicationContext()); ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List mList = mActivityManager.getRunningAppProcesses(); if (mList != null) { for (ActivityManager.RunningAppProcessInfo runningAppProcessInfo : mList) { if (runningAppProcessInfo.pid != android.os.Process.myPid()) { android.os.Process.killProcess(runningAppProcessInfo.pid); } } android.os.Process.killProcess(android.os.Process.myPid()); } } public String getUmengChannel(Application application) { String channelName = null; try { PackageManager packageManager = application.getPackageManager(); if (packageManager != null) { //注意此处为ApplicationInfo 而不是 ActivityInfo,因为友盟设置的meta-data是在application标签中,而不是某activity标签中,所以用ApplicationInfo ApplicationInfo applicationInfo = packageManager. getApplicationInfo(application.getPackageName(), PackageManager.GET_META_DATA); if (applicationInfo != null) { if (applicationInfo.metaData != null) { channelName = String.valueOf(applicationInfo.metaData.get("UMENG_CHANNEL")); BaseConsts.setUMengChannel(channelName); } } } } catch (Exception e) { e.printStackTrace(); } return channelName; } public String getUmengAppKey(Application application) { String appkey = null; try { PackageManager packageManager = application.getPackageManager(); if (packageManager != null) { //注意此处为ApplicationInfo 而不是 ActivityInfo,因为友盟设置的meta-data是在application标签中,而不是某activity标签中,所以用ApplicationInfo ApplicationInfo applicationInfo = packageManager. getApplicationInfo(application.getPackageName(), PackageManager.GET_META_DATA); if (applicationInfo != null) { if (applicationInfo.metaData != null) { appkey = String.valueOf(applicationInfo.metaData.get("UMENG_APPKEY")); BaseConsts.setUMengAppkey(appkey); } } } } catch (Exception e) { e.printStackTrace(); } return appkey; } Application.ActivityLifecycleCallbacks activityLifecycleCallbacks = new Application.ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { mActivityList.add(activity); } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { mActivityList.remove(activity); } }; }