EApplication.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. package com.edufound.reader.application;
  2. import android.app.Activity;
  3. import android.app.ActivityManager;
  4. import android.app.Application;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.content.pm.ApplicationInfo;
  8. import android.content.pm.PackageManager;
  9. import android.os.Build;
  10. import android.os.Bundle;
  11. import android.os.Handler;
  12. import android.os.Looper;
  13. import androidx.annotation.RequiresApi;
  14. import com.baidu.duer.botsdk.BotSdk;
  15. import com.baidu.duer.botsdk.util.HeartBeatReporter;
  16. import com.edufound.reader.activity.CrashDialogActivity;
  17. import com.edufound.reader.activity.SplashActivity;
  18. import com.edufound.reader.bean.ChannelCodeEnum;
  19. import com.edufound.reader.botsdk.BotConstants;
  20. import com.edufound.reader.botsdk.BotMessageListener;
  21. import com.edufound.reader.botsdk.BotSDKUtils;
  22. import com.edufound.reader.support.CrashLog;
  23. import com.edufound.reader.support.DebugSafeModeTipActivity;
  24. import com.edufound.reader.support.DebugSafeModeUI;
  25. import com.edufound.reader.util.Cockroach;
  26. import com.edufound.reader.util.Consts;
  27. import com.edufound.reader.util.DeviceUuidFactory;
  28. import com.edufound.reader.util.ExceptionHandler;
  29. import com.edufound.reader.util.GlideUtils;
  30. import com.edufound.reader.util.OkHttpClient;
  31. import com.orhanobut.logger.AndroidLogAdapter;
  32. import com.orhanobut.logger.FormatStrategy;
  33. import com.orhanobut.logger.Logger;
  34. import com.orhanobut.logger.PrettyFormatStrategy;
  35. import com.tencent.mmkv.MMKV;
  36. import com.umeng.analytics.MobclickAgent;
  37. import com.umeng.commonsdk.UMConfigure;
  38. import com.umeng.commonsdk.listener.OnGetOaidListener;
  39. import org.xmlpull.v1.XmlPullParserFactory;
  40. import java.util.ArrayList;
  41. import java.util.List;
  42. import io.reactivex.rxjava3.functions.Consumer;
  43. import io.reactivex.rxjava3.plugins.RxJavaPlugins;
  44. public class EApplication extends Application {
  45. private int activityAount = 0;
  46. public boolean isForeground = false;
  47. public static long APP_START_TIME = 0;
  48. public static List<Activity> mActivityList = new ArrayList<>();
  49. @Override
  50. public void onCreate() {
  51. super.onCreate();
  52. try {
  53. Consts.setIsDebug(false);
  54. Consts.setmApplicAtion(this);
  55. //初始化异常监听
  56. // initException();
  57. XmlPullParserFactory.newInstance().setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
  58. //初始化OKhttp3
  59. OkHttpClient.initOkHttpUtil(getApplicationContext());
  60. //
  61. new Thread() {
  62. @Override
  63. public void run() {
  64. super.run();
  65. //清除所有图片缓存
  66. GlideUtils.removeAll(getApplicationContext());
  67. }
  68. }.start();
  69. //初始化logger
  70. FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder()
  71. .showThreadInfo(false) // 是否显示线程信息,默认为ture
  72. .methodCount(3) // 显示的方法行数,默认为2
  73. // .methodOffset(1) // 隐藏内部方法调用到偏移量,默认为5
  74. // .logStrategy() // 更改要打印的日志策略。
  75. .tag(getPackageName()) // 每个日志的全局标记。默认PRETTY_LOGGER
  76. .build();
  77. Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy));
  78. //初始化友盟
  79. UMConfigure.setLogEnabled(true);
  80. UMConfigure.preInit(this, getUmengAppKey(), getUmengChannel());
  81. UMConfigure.getOaid(this, new OnGetOaidListener() {
  82. @Override
  83. public void onGetOaid(String s) {
  84. // Logger.e("umeng_oaid:" + s);
  85. }
  86. });
  87. MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO);
  88. // UMConfigure.preInit(this,"");
  89. //初始化MMKV
  90. MMKV.initialize(this);
  91. //初始化DeviceUuidFactory
  92. if (DeviceUuidFactory.getUuid() == null) {
  93. new DeviceUuidFactory(getApplicationContext());
  94. }
  95. Consts.setUID("test");
  96. //初始化activity监听
  97. registerActivityLifecycleCallbacks(activityLifecycleCallbacks);
  98. if (Consts.getUMengChannel().equals(ChannelCodeEnum.BAIDU.getChannelCode())) {
  99. /** 接入益智乐园的App,需要删掉下面这一行。保证益智乐园的付费等逻辑正常执行,不知道益智乐园是啥的,不要删掉这一行 */
  100. HeartBeatReporter.getInstance().setShouldUploadHeartBeatByApp(false);
  101. // 初始化BotSDK
  102. BotSdk.getInstance().init(this);
  103. // 打开BotSDK的Log开关,开发阶段建议打开Log开关,便于排查问题
  104. // BotSdk.enableLog(BuildConfig.DEBUG);
  105. String random1 = BotConstants.RANDOM1_PREFIX + Math.random();
  106. String random2 = BotConstants.RANDOM2_PREFIX + Math.random();
  107. // 在线校验示例3
  108. BotSdk.getInstance().register(BotMessageListener.getInstance(), BotConstants.BOTID,
  109. random1, BotSDKUtils.sign(random1), random2, BotSDKUtils.sign(random2));
  110. }
  111. } catch (Exception e) {
  112. e.printStackTrace();
  113. }
  114. }
  115. public static void killAppProcess(Context context) {
  116. for (int i = 0; i < EApplication.mActivityList.size(); i++) {
  117. EApplication.mActivityList.get(i).finish();
  118. }
  119. //注意:不能先杀掉主进程,否则逻辑代码无法继续执行,需先杀掉相关进程最后杀掉主进程
  120. MobclickAgent.onKillProcess(context.getApplicationContext());
  121. ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
  122. List<ActivityManager.RunningAppProcessInfo> mList = mActivityManager.getRunningAppProcesses();
  123. if (mList != null) {
  124. for (ActivityManager.RunningAppProcessInfo runningAppProcessInfo : mList) {
  125. if (runningAppProcessInfo.pid != android.os.Process.myPid()) {
  126. android.os.Process.killProcess(runningAppProcessInfo.pid);
  127. }
  128. }
  129. android.os.Process.killProcess(android.os.Process.myPid());
  130. }
  131. // System.exit(0);
  132. }
  133. ActivityLifecycleCallbacks activityLifecycleCallbacks = new ActivityLifecycleCallbacks() {
  134. @Override
  135. public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
  136. }
  137. @Override
  138. public void onActivityStarted(Activity activity) {
  139. if (activityAount == 0) {
  140. //app回到前台
  141. isForeground = true;
  142. // ToastUtil.showToast("app回到前台了");
  143. APP_START_TIME = System.currentTimeMillis();
  144. }
  145. activityAount++;
  146. }
  147. @Override
  148. public void onActivityResumed(Activity activity) {
  149. }
  150. @Override
  151. public void onActivityPaused(Activity activity) {
  152. }
  153. @Override
  154. public void onActivityStopped(Activity activity) {
  155. activityAount--;
  156. if (activityAount == 0) {
  157. isForeground = false;
  158. }
  159. }
  160. @Override
  161. public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
  162. }
  163. @Override
  164. public void onActivityDestroyed(Activity activity) {
  165. }
  166. };
  167. private void initException() {
  168. RxJavaPlugins.setErrorHandler(new Consumer<Throwable>() {
  169. @Override
  170. public void accept(Throwable throwable) throws Exception {
  171. throwable.printStackTrace();//这里处理所有的Rxjava异常
  172. CrashLog.saveCrashLog(getApplicationContext(), throwable);
  173. }
  174. });
  175. final Thread.UncaughtExceptionHandler sysExcepHandler = Thread.getDefaultUncaughtExceptionHandler();
  176. DebugSafeModeUI.init(this);
  177. Cockroach.install(this, new ExceptionHandler() {
  178. @Override
  179. protected void onUncaughtExceptionHappened(Thread thread, Throwable throwable) {
  180. CrashLog.saveCrashLog(getApplicationContext(), throwable);
  181. new Handler(Looper.getMainLooper()).post(new Runnable() {
  182. @Override
  183. public void run() {
  184. // toast.setText("Cockroach.install:onUncaughtExceptionHappened");
  185. // toast.show();
  186. Logger.e("Cockroach.install:onUncaughtExceptionHappened");
  187. }
  188. });
  189. }
  190. @Override
  191. protected void onBandageExceptionHappened(Throwable throwable) {
  192. throwable.printStackTrace();//打印警告级别log,该throwable可能是最开始的bug导致的,无需关心
  193. // toast.setText("Cockroach Worked");
  194. // toast.show();
  195. }
  196. @Override
  197. protected void onEnterSafeMode() {
  198. // int tips = R.string.safe_mode_tips;
  199. // Toast.makeText(Consts.getmApplicAtion(), getResources().getString(tips), Toast.LENGTH_LONG).show();
  200. // DebugSafeModeUI.showSafeModeUI();
  201. if (Consts.isIsDebug()) {
  202. Intent intent = new Intent(Consts.getmApplicAtion(), DebugSafeModeTipActivity.class);
  203. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
  204. startActivity(intent);
  205. } else {
  206. Intent intent = new Intent(Consts.getmApplicAtion(), CrashDialogActivity.class);
  207. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
  208. startActivity(intent);
  209. }
  210. }
  211. @RequiresApi(api = Build.VERSION_CODES.N)
  212. @Override
  213. protected void onMayBeBlackScreen(Throwable e) {
  214. Thread thread = Looper.getMainLooper().getThread();
  215. e.printStackTrace();
  216. //黑屏时建议直接杀死app
  217. sysExcepHandler.uncaughtException(thread, new RuntimeException("black screen"));
  218. for (int i = 0; i < mActivityList.size(); i++) {
  219. mActivityList.get(i).finish();
  220. }
  221. killAppProcess(Consts.getmApplicAtion());
  222. }
  223. });
  224. }
  225. public String getUmengChannel() {
  226. String channelName = null;
  227. try {
  228. PackageManager packageManager = getPackageManager();
  229. if (packageManager != null) {
  230. //注意此处为ApplicationInfo 而不是 ActivityInfo,因为友盟设置的meta-data是在application标签中,而不是某activity标签中,所以用ApplicationInfo
  231. ApplicationInfo applicationInfo = packageManager.
  232. getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
  233. if (applicationInfo != null) {
  234. if (applicationInfo.metaData != null) {
  235. channelName = String.valueOf(applicationInfo.metaData.get("UMENG_CHANNEL"));
  236. Consts.setUMengChannel(channelName);
  237. }
  238. }
  239. }
  240. } catch (Exception e) {
  241. e.printStackTrace();
  242. }
  243. return channelName;
  244. }
  245. public String getUmengAppKey() {
  246. String appkey = null;
  247. try {
  248. PackageManager packageManager = getPackageManager();
  249. if (packageManager != null) {
  250. //注意此处为ApplicationInfo 而不是 ActivityInfo,因为友盟设置的meta-data是在application标签中,而不是某activity标签中,所以用ApplicationInfo
  251. ApplicationInfo applicationInfo = packageManager.
  252. getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
  253. if (applicationInfo != null) {
  254. if (applicationInfo.metaData != null) {
  255. appkey = String.valueOf(applicationInfo.metaData.get("UMENG_APPKEY"));
  256. Consts.setUMengAppKey(appkey);
  257. }
  258. }
  259. }
  260. } catch (Exception e) {
  261. e.printStackTrace();
  262. }
  263. return appkey;
  264. }
  265. public static void reloadApp(int defaultIndex) {
  266. for (int i = 0; i < EApplication.mActivityList.size(); i++) {
  267. EApplication.mActivityList.get(i).finish();
  268. }
  269. System.gc();
  270. Intent intent = new Intent(Consts.getmApplicAtion(), SplashActivity.class);
  271. if (defaultIndex != -1) {
  272. intent.putExtra("defaultIndex", defaultIndex);
  273. }
  274. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  275. Consts.getmApplicAtion().startActivity(intent);
  276. }
  277. }