123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- 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 androidx.annotation.RequiresApi;
- import com.baidu.duer.botsdk.BotSdk;
- import com.baidu.duer.botsdk.util.HeartBeatReporter;
- import com.edufound.reader.activity.CrashDialogActivity;
- import com.edufound.reader.activity.MainActivity;
- import com.edufound.reader.activity.SplashActivity;
- 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.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.CrashHandler;
- 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;
- 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(false);
- Consts.setmApplicAtion(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;
- }
- }
- @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("Cockroach.install:onUncaughtExceptionHappened");
- // toast.show();
- Logger.e("Cockroach.install:onUncaughtExceptionHappened");
- }
- });
- }
- @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(), SplashActivity.class);
- if (defaultIndex != -1) {
- intent.putExtra("defaultIndex", defaultIndex);
- }
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- Consts.getmApplicAtion().startActivity(intent);
- }
- }
|