EApplication.java 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. package com.edufound.android.xyyf.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.Bundle;
  10. import android.support.annotation.Nullable;
  11. import com.edufound.android.xyyf.pay.PayInit;
  12. import com.edufound.android.xyyf.util.ContextUtil;
  13. import com.edufound.android.xyyf.util.Logger;
  14. import com.edufound.android.xyyf.util.OKHttpUtil;
  15. import com.edufound.android.xyyf.util.SPutil;
  16. import java.lang.reflect.Field;
  17. import java.lang.reflect.Method;
  18. import java.util.ArrayList;
  19. import java.util.List;
  20. import java.util.Map;
  21. import okhttp3.Request;
  22. public class EApplication extends Application {
  23. static String mUMengAppID;
  24. private int activityAount = 0;
  25. public boolean isForeground = false;
  26. public static long APP_START_TIME = 0;
  27. public static boolean isReloadMain = false;
  28. @Override
  29. public void onCreate() {
  30. super.onCreate();
  31. //试着用LeakCanary看看哪里泄漏了
  32. ContextUtil.setContext(this);
  33. ContextUtil.setApplication(this);
  34. //上线关掉debug模式
  35. ContextUtil.setIsDebug(false);
  36. mUMengAppID = getChannelName();
  37. // mUMengAppID = "3001";
  38. APP_START_TIME = System.currentTimeMillis();
  39. //根据appcode初始化支付sdk
  40. // UMConfigure.setLogEnabled(true);
  41. // UMConfigure.init(this, "5ffbb9e0f1eb4f3f9b58b05e", getAppCode() + "", UMConfigure.DEVICE_TYPE_PHONE, "dfc59afd6dc6b1550ff1c2e0c7eb10fd");
  42. // PushAgent mPushAgent = PushAgent.getInstance(this);
  43. // mPushAgent.register(new IUmengRegisterCallback() {
  44. // @Override
  45. // public void onSuccess(String deviceToken) {
  46. // Logger.e("DeviceToken:" + deviceToken);
  47. // }
  48. //
  49. // @Override
  50. // public void onFailure(String s, String s1) {
  51. // Logger.e("注册失败:--------> " + "s:" + s + ",s1:" + s1);
  52. // }
  53. // });
  54. PayInit.getInstance().initPaySDK(Integer.valueOf(getAppCode()), EApplication.this);
  55. if (!getPackageName().equals(
  56. getProcessName(getApplicationContext(), android.os.Process.myPid()))) {
  57. registerActivityLifecycleCallbacks(activityLifecycleCallbacks);
  58. return;
  59. }
  60. //如果是新应用,默认设置播放器为ijkplayer
  61. if (SPutil.getPrefInt(this, SPutil.videoType, 0) == 0) {
  62. SPutil.setPrefInt(this, SPutil.videoType, SPutil.VIDEO_IJKPLAYER);
  63. }
  64. /*
  65. * AppKey
  66. 5e34d2fb4ca3574b1800005b
  67. Umeng Message Secret
  68. dfc59afd6dc6b1550ff1c2e0c7eb10fd
  69. App Master Secret
  70. ojy29ycnnynpvyetpunc2m0ija4vskyo
  71. *
  72. * */
  73. }
  74. private static List<Activity> getAllActivitys() {
  75. List<Activity> list = new ArrayList<>();
  76. try {
  77. Class<?> activityThread = Class.forName("android.app.ActivityThread");
  78. Method currentActivityThread = activityThread.getDeclaredMethod("currentActivityThread");
  79. currentActivityThread.setAccessible(true);
  80. //获取主线程对象
  81. Object activityThreadObject = currentActivityThread.invoke(null);
  82. Field mActivitiesField = activityThread.getDeclaredField("mActivities");
  83. mActivitiesField.setAccessible(true);
  84. Map<Object, Object> mActivities = (Map<Object, Object>) mActivitiesField.get(activityThreadObject);
  85. for (Map.Entry<Object, Object> entry : mActivities.entrySet()) {
  86. Object value = entry.getValue();
  87. Class<?> activityClientRecordClass = value.getClass();
  88. Field activityField = activityClientRecordClass.getDeclaredField("activity");
  89. activityField.setAccessible(true);
  90. Object o = activityField.get(value);
  91. list.add((Activity) o);
  92. }
  93. } catch (Exception e) {
  94. e.printStackTrace();
  95. }
  96. return list;
  97. }
  98. public static void clearActivity() {
  99. List<Activity> myAclist = getAllActivitys();
  100. for (int i = 0; i < myAclist.size(); i++) {
  101. myAclist.get(i).finish();
  102. }
  103. }
  104. @Nullable
  105. public String getProcessName(Context cxt, int pid) {
  106. ActivityManager am = (ActivityManager) cxt.getSystemService(Context.ACTIVITY_SERVICE);
  107. if (am == null) {
  108. return null;
  109. }
  110. List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
  111. if (runningApps != null && !runningApps.isEmpty()) {
  112. for (ActivityManager.RunningAppProcessInfo procInfo : runningApps) {
  113. if (procInfo.pid == pid) {
  114. return procInfo.processName;
  115. }
  116. }
  117. }
  118. return null;
  119. }
  120. public static String getAppCode() {
  121. //记得改友盟code
  122. return mUMengAppID;
  123. }
  124. public String getChannelName() {
  125. String channelName = null;
  126. try {
  127. PackageManager packageManager = getPackageManager();
  128. if (packageManager != null) {
  129. //注意此处为ApplicationInfo 而不是 ActivityInfo,因为友盟设置的meta-data是在application标签中,而不是某activity标签中,所以用ApplicationInfo
  130. ApplicationInfo applicationInfo = packageManager.
  131. getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
  132. if (applicationInfo != null) {
  133. if (applicationInfo.metaData != null) {
  134. channelName = String.valueOf(applicationInfo.metaData.get("UMENG_CHANNEL"));
  135. }
  136. }
  137. }
  138. } catch (Exception e) {
  139. e.printStackTrace();
  140. }
  141. return channelName;
  142. }
  143. ActivityLifecycleCallbacks activityLifecycleCallbacks = new ActivityLifecycleCallbacks() {
  144. @Override
  145. public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
  146. }
  147. @Override
  148. public void onActivityStarted(Activity activity) {
  149. if (activityAount == 0) {
  150. //app回到前台
  151. isForeground = true;
  152. // ToastUtil.showToast("app回到前台了");
  153. Logger.e("app回到前台了");
  154. APP_START_TIME = System.currentTimeMillis();
  155. }
  156. activityAount++;
  157. }
  158. @Override
  159. public void onActivityResumed(Activity activity) {
  160. }
  161. @Override
  162. public void onActivityPaused(Activity activity) {
  163. }
  164. @Override
  165. public void onActivityStopped(Activity activity) {
  166. activityAount--;
  167. if (activityAount == 0) {
  168. isForeground = false;
  169. // ToastUtil.showToast("app后台了");
  170. Logger.e("app后台了");
  171. OKHttpUtil.getInstance().postUserTime(new OKHttpUtil.ResultCallback() {
  172. @Override
  173. public void onError(Request request, Exception e) {
  174. // exitApp();
  175. // android.os.Process.killProcess(android.os.Process.myPid());
  176. APP_START_TIME = 0;
  177. clearActivity();
  178. android.os.Process.killProcess(android.os.Process.myPid());
  179. }
  180. @Override
  181. public void onResponse(Object response) {
  182. Logger.e("response:" + response);
  183. // exitApp();
  184. // android.os.Process.killProcess(android.os.Process.myPid());
  185. APP_START_TIME = 0;
  186. if (!isReloadMain) {
  187. clearActivity();
  188. android.os.Process.killProcess(android.os.Process.myPid());
  189. }
  190. }
  191. });
  192. }
  193. }
  194. @Override
  195. public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
  196. }
  197. @Override
  198. public void onActivityDestroyed(Activity activity) {
  199. Logger.e("onActivityDestroyed---className:" + activity.getLocalClassName());
  200. }
  201. };
  202. }