BaseApplication.java 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. package com.edufound.base;
  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 android.view.Gravity;
  14. import androidx.annotation.RequiresApi;
  15. import com.edufound.base.activity.CrashDialogActivity;
  16. import com.edufound.base.bean.ChannelCodeEnum;
  17. import com.edufound.base.crash.Cockroach;
  18. import com.edufound.base.crash.CrashLog;
  19. import com.edufound.base.crash.DebugSafeModeTipActivity;
  20. import com.edufound.base.crash.DebugSafeModeUI;
  21. import com.edufound.base.crash.ExceptionHandler;
  22. import com.edufound.base.util.BaseConsts;
  23. import com.edufound.base.util.GlideUtils;
  24. import com.edufound.base.util.OkHttpClient;
  25. import com.edufound.base.util.WordFilter;
  26. import com.hjq.toast.ToastStrategy;
  27. import com.hjq.toast.Toaster;
  28. import com.orhanobut.logger.Logger;
  29. import com.tencent.mmkv.MMKV;
  30. import com.umeng.analytics.MobclickAgent;
  31. import com.umeng.commonsdk.UMConfigure;
  32. import org.xmlpull.v1.XmlPullParserException;
  33. import org.xmlpull.v1.XmlPullParserFactory;
  34. import java.util.ArrayList;
  35. import java.util.List;
  36. public class BaseApplication implements ModuleMediator.ModuleInitial {
  37. public static List<Activity> mActivityList = new ArrayList<>();
  38. @Override
  39. public void initModule(Application application) {
  40. try {
  41. BaseConsts.setAppPackageName(application.getPackageName());
  42. //初始化异常
  43. if (!BaseConsts.isDebug()) {
  44. Logger.e("Consts.isDebug:" + BaseConsts.isDebug());
  45. //不在测试环境下,初始化异常
  46. initException(application);
  47. }
  48. //初始化mmkv
  49. MMKV.initialize(application);
  50. //初始化toaster
  51. Toaster.init(application);
  52. Toaster.setStrategy(new ToastStrategy());
  53. Toaster.setGravity(Gravity.CENTER);
  54. Toaster.setView(R.layout.toast);
  55. //初始化OKhttp3
  56. OkHttpClient.initOkHttpUtil(application);
  57. //修改xml问题
  58. XmlPullParserFactory.newInstance().setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
  59. //初始化友盟
  60. UMConfigure.setLogEnabled(true);
  61. UMConfigure.preInit(application, getUmengAppKey(application), getUmengChannel(application));
  62. BaseConsts.setUID("test");
  63. MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO);
  64. application.registerActivityLifecycleCallbacks(activityLifecycleCallbacks);
  65. BaseConsts.mWordFilter = new WordFilter();
  66. //清除图片缓存
  67. new Thread() {
  68. @Override
  69. public void run() {
  70. super.run();
  71. GlideUtils.removeAll(application);
  72. BaseConsts.mWordFilter.filter_jk_info2("初始化");
  73. }
  74. }.start();
  75. } catch (XmlPullParserException e) {
  76. e.printStackTrace();
  77. }
  78. }
  79. private void initException(Application application) {
  80. final Thread.UncaughtExceptionHandler sysExcepHandler = Thread.getDefaultUncaughtExceptionHandler();
  81. DebugSafeModeUI.init(application);
  82. Cockroach.install(application, new ExceptionHandler() {
  83. @Override
  84. protected void onUncaughtExceptionHappened(Thread thread, Throwable throwable) {
  85. CrashLog.saveCrashLog(application, throwable);
  86. new Handler(Looper.getMainLooper()).post(new Runnable() {
  87. @Override
  88. public void run() {
  89. Logger.e("Cockroach.install:onUncaughtExceptionHappened");
  90. }
  91. });
  92. }
  93. @Override
  94. protected void onBandageExceptionHappened(Throwable throwable) {
  95. throwable.printStackTrace();//打印警告级别log,该throwable可能是最开始的bug导致的,无需关心
  96. }
  97. @Override
  98. protected void onEnterSafeMode() {
  99. // int tips = R.string.safe_mode_tips;
  100. // Toast.makeText(Consts.getmApplicAtion(), getResources().getString(tips), Toast.LENGTH_LONG).show();
  101. // DebugSafeModeUI.showSafeModeUI();
  102. if (BaseConsts.isDebug()) {
  103. Intent intent = new Intent(application, DebugSafeModeTipActivity.class);
  104. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
  105. application.startActivity(intent);
  106. } else {
  107. Intent intent = new Intent(application, CrashDialogActivity.class);
  108. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
  109. application.startActivity(intent);
  110. }
  111. }
  112. @RequiresApi(api = Build.VERSION_CODES.N)
  113. @Override
  114. protected void onMayBeBlackScreen(Throwable e) {
  115. Thread thread = Looper.getMainLooper().getThread();
  116. e.printStackTrace();
  117. //黑屏时建议直接杀死app
  118. sysExcepHandler.uncaughtException(thread, new RuntimeException("black screen"));
  119. killAppProcess(application);
  120. }
  121. });
  122. }
  123. public static void killAppProcess(Context context) {
  124. for (int i = 0; i < mActivityList.size(); i++) {
  125. mActivityList.get(i).finish();
  126. }
  127. //注意:不能先杀掉主进程,否则逻辑代码无法继续执行,需先杀掉相关进程最后杀掉主进程
  128. //杀掉umeng得进程
  129. MobclickAgent.onKillProcess(context.getApplicationContext());
  130. ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
  131. List<ActivityManager.RunningAppProcessInfo> mList = mActivityManager.getRunningAppProcesses();
  132. if (mList != null) {
  133. for (ActivityManager.RunningAppProcessInfo runningAppProcessInfo : mList) {
  134. if (runningAppProcessInfo.pid != android.os.Process.myPid()) {
  135. android.os.Process.killProcess(runningAppProcessInfo.pid);
  136. }
  137. }
  138. android.os.Process.killProcess(android.os.Process.myPid());
  139. }
  140. }
  141. public String getUmengChannel(Application application) {
  142. String channelName = null;
  143. try {
  144. PackageManager packageManager = application.getPackageManager();
  145. if (packageManager != null) {
  146. //注意此处为ApplicationInfo 而不是 ActivityInfo,因为友盟设置的meta-data是在application标签中,而不是某activity标签中,所以用ApplicationInfo
  147. ApplicationInfo applicationInfo = packageManager.
  148. getApplicationInfo(application.getPackageName(), PackageManager.GET_META_DATA);
  149. if (applicationInfo != null) {
  150. if (applicationInfo.metaData != null) {
  151. channelName = String.valueOf(applicationInfo.metaData.get("UMENG_CHANNEL"));
  152. BaseConsts.setUMengChannel(channelName);
  153. }
  154. }
  155. }
  156. } catch (Exception e) {
  157. e.printStackTrace();
  158. }
  159. return channelName;
  160. }
  161. public String getUmengAppKey(Application application) {
  162. String appkey = null;
  163. try {
  164. PackageManager packageManager = application.getPackageManager();
  165. if (packageManager != null) {
  166. //注意此处为ApplicationInfo 而不是 ActivityInfo,因为友盟设置的meta-data是在application标签中,而不是某activity标签中,所以用ApplicationInfo
  167. ApplicationInfo applicationInfo = packageManager.
  168. getApplicationInfo(application.getPackageName(), PackageManager.GET_META_DATA);
  169. if (applicationInfo != null) {
  170. if (applicationInfo.metaData != null) {
  171. appkey = String.valueOf(applicationInfo.metaData.get("UMENG_APPKEY"));
  172. BaseConsts.setUMengAppkey(appkey);
  173. }
  174. }
  175. }
  176. } catch (Exception e) {
  177. e.printStackTrace();
  178. }
  179. return appkey;
  180. }
  181. Application.ActivityLifecycleCallbacks activityLifecycleCallbacks = new Application.ActivityLifecycleCallbacks() {
  182. @Override
  183. public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
  184. mActivityList.add(activity);
  185. }
  186. @Override
  187. public void onActivityStarted(Activity activity) {
  188. }
  189. @Override
  190. public void onActivityResumed(Activity activity) {
  191. }
  192. @Override
  193. public void onActivityPaused(Activity activity) {
  194. }
  195. @Override
  196. public void onActivityStopped(Activity activity) {
  197. }
  198. @Override
  199. public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
  200. }
  201. @Override
  202. public void onActivityDestroyed(Activity activity) {
  203. mActivityList.remove(activity);
  204. }
  205. };
  206. }