package com.edufound.reader.application; 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.widget.Toast; import com.baidu.duer.botsdk.BotSdk; import com.baidu.duer.botsdk.util.HeartBeatReporter; import com.edufound.reader.BuildConfig; import com.edufound.reader.R; import com.edufound.reader.activity.CrashDialogActivity; import com.edufound.reader.activity.MainActivity; import com.edufound.reader.bean.ChannelCodeEnum; import com.edufound.reader.botsdk.BotConstants; import com.edufound.reader.botsdk.BotMessageListener; import com.edufound.reader.botsdk.BotSDKUtils; import com.edufound.reader.cusview.CusToast; import com.edufound.reader.support.CrashLog; import com.edufound.reader.support.DebugSafeModeTipActivity; import com.edufound.reader.support.DebugSafeModeUI; import com.edufound.reader.util.Cockroach; import com.edufound.reader.util.Consts; import com.edufound.reader.util.DeviceUuidFactory; import com.edufound.reader.util.ExceptionHandler; import com.edufound.reader.util.OkHttpClient; import com.orhanobut.logger.AndroidLogAdapter; import com.orhanobut.logger.FormatStrategy; import com.orhanobut.logger.Logger; import com.orhanobut.logger.PrettyFormatStrategy; import com.tencent.mmkv.MMKV; import com.umeng.analytics.MobclickAgent; import com.umeng.commonsdk.UMConfigure; import com.umeng.commonsdk.listener.OnGetOaidListener; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; import java.util.ArrayList; import java.util.List; import androidx.annotation.RequiresApi; public class EApplication extends Application { private int activityAount = 0; public boolean isForeground = false; public static long APP_START_TIME = 0; public static List<Activity> mActivityList = new ArrayList<>(); @Override public void onCreate() { super.onCreate(); try { Consts.setIsDebug(true); Consts.setmApplicAtion(this); //初始化异常监听 // CrashHandler.getInstance().init(this); // initException(); XmlPullParserFactory.newInstance().setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); //初始化OKhttp3 OkHttpClient.initOkHttpUtil(getApplicationContext()); //初始化logger FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder() .showThreadInfo(false) // 是否显示线程信息,默认为ture .methodCount(3) // 显示的方法行数,默认为2 // .methodOffset(1) // 隐藏内部方法调用到偏移量,默认为5 // .logStrategy() // 更改要打印的日志策略。 .tag(getPackageName()) // 每个日志的全局标记。默认PRETTY_LOGGER .build(); Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy)); //初始化友盟 UMConfigure.setLogEnabled(true); UMConfigure.preInit(this, getUmengAppKey(), getUmengChannel()); UMConfigure.init(this, getUmengAppKey(), getUmengChannel(), UMConfigure.DEVICE_TYPE_PHONE, ""); UMConfigure.getOaid(this, new OnGetOaidListener() { @Override public void onGetOaid(String s) { // Logger.e("umeng_oaid:" + s); } }); MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO); // UMConfigure.preInit(this,""); //初始化MMKV MMKV.initialize(this); //初始化DeviceUuidFactory if (DeviceUuidFactory.getUuid() == null) { new DeviceUuidFactory(getApplicationContext()); } Consts.setUID("test"); //初始化activity监听 registerActivityLifecycleCallbacks(activityLifecycleCallbacks); if (Consts.getUmengChannel().equals(ChannelCodeEnum.BAIDU.getChannelCode())) { /** 接入益智乐园的App,需要删掉下面这一行。保证益智乐园的付费等逻辑正常执行,不知道益智乐园是啥的,不要删掉这一行 */ HeartBeatReporter.getInstance().setShouldUploadHeartBeatByApp(false); // 初始化BotSDK BotSdk.getInstance().init(this); // 打开BotSDK的Log开关,开发阶段建议打开Log开关,便于排查问题 // BotSdk.enableLog(BuildConfig.DEBUG); String random1 = BotConstants.RANDOM1_PREFIX + Math.random(); String random2 = BotConstants.RANDOM2_PREFIX + Math.random(); // 在线校验示例3 BotSdk.getInstance().register(BotMessageListener.getInstance(), BotConstants.BOTID, random1, BotSDKUtils.sign(random1), random2, BotSDKUtils.sign(random2)); } } catch (XmlPullParserException e) { e.printStackTrace(); } } public static void killAppProcess(Context context) { for (int i = 0; i < EApplication.mActivityList.size(); i++) { EApplication.mActivityList.get(i).finish(); } //注意:不能先杀掉主进程,否则逻辑代码无法继续执行,需先杀掉相关进程最后杀掉主进程 MobclickAgent.onKillProcess(context.getApplicationContext()); ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> mList = mActivityManager.getRunningAppProcesses(); 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()); // System.exit(0); } ActivityLifecycleCallbacks activityLifecycleCallbacks = new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @Override public void onActivityStarted(Activity activity) { if (activityAount == 0) { //app回到前台 isForeground = true; // ToastUtil.showToast("app回到前台了"); APP_START_TIME = System.currentTimeMillis(); } activityAount++; } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { activityAount--; if (activityAount == 0) { isForeground = false; // ToastUtil.showToast("app后台了"); if (Consts.getUmengChannel().equals(ChannelCodeEnum.YIFANG.getChannelCode())) { killAppProcess(Consts.getmApplicAtion()); } } } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } }; private void initException() { final Thread.UncaughtExceptionHandler sysExcepHandler = Thread.getDefaultUncaughtExceptionHandler(); final Toast toast = Toast.makeText(this, "", Toast.LENGTH_SHORT); DebugSafeModeUI.init(this); Cockroach.install(this, new ExceptionHandler() { @Override protected void onUncaughtExceptionHappened(Thread thread, Throwable throwable) { CrashLog.saveCrashLog(getApplicationContext(), throwable); new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { // toast.setText(R.string.safe_mode_excep_tips); // toast.show(); } }); } @Override protected void onBandageExceptionHappened(Throwable throwable) { throwable.printStackTrace();//打印警告级别log,该throwable可能是最开始的bug导致的,无需关心 // toast.setText("Cockroach Worked"); // toast.show(); } @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 (Consts.isIsDebug()) { Intent intent = new Intent(Consts.getmApplicAtion(), DebugSafeModeTipActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } else { Intent intent = new Intent(Consts.getmApplicAtion(), CrashDialogActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); 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")); for (int i = 0; i < mActivityList.size(); i++) { mActivityList.get(i).finish(); } killAppProcess(Consts.getmApplicAtion()); } }); } public String getUmengChannel() { String channelName = null; try { PackageManager packageManager = getPackageManager(); if (packageManager != null) { //注意此处为ApplicationInfo 而不是 ActivityInfo,因为友盟设置的meta-data是在application标签中,而不是某activity标签中,所以用ApplicationInfo ApplicationInfo applicationInfo = packageManager. getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA); if (applicationInfo != null) { if (applicationInfo.metaData != null) { channelName = String.valueOf(applicationInfo.metaData.get("UMENG_CHANNEL")); Consts.setUmengChannel(channelName); } } } } catch (Exception e) { e.printStackTrace(); } return channelName; } public String getUmengAppKey() { String appkey = null; try { PackageManager packageManager = getPackageManager(); if (packageManager != null) { //注意此处为ApplicationInfo 而不是 ActivityInfo,因为友盟设置的meta-data是在application标签中,而不是某activity标签中,所以用ApplicationInfo ApplicationInfo applicationInfo = packageManager. getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA); if (applicationInfo != null) { if (applicationInfo.metaData != null) { appkey = String.valueOf(applicationInfo.metaData.get("UMENG_APPKEY")); } } } } catch (Exception e) { e.printStackTrace(); } return appkey; } public static void reloadApp(int defaultIndex) { for (int i = 0; i < EApplication.mActivityList.size(); i++) { EApplication.mActivityList.get(i).finish(); } Intent intent = new Intent(Consts.getmApplicAtion(), MainActivity.class); if (defaultIndex != -1) { intent.putExtra("defaultIndex", defaultIndex); } Consts.getmApplicAtion().startActivity(intent); } }