BaseActivity.java 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. package com.edufound.reader.base;
  2. import android.animation.Animator;
  3. import android.animation.AnimatorListenerAdapter;
  4. import android.animation.AnimatorSet;
  5. import android.animation.ObjectAnimator;
  6. import android.annotation.SuppressLint;
  7. import android.app.Activity;
  8. import android.content.BroadcastReceiver;
  9. import android.content.Context;
  10. import android.content.Intent;
  11. import android.content.IntentFilter;
  12. import android.os.Build;
  13. import android.os.Bundle;
  14. import android.util.DisplayMetrics;
  15. import android.view.Gravity;
  16. import android.view.LayoutInflater;
  17. import android.view.View;
  18. import android.view.ViewGroup;
  19. import android.view.WindowManager;
  20. import android.view.animation.LinearInterpolator;
  21. import android.widget.FrameLayout;
  22. import com.edufound.reader.R;
  23. import com.edufound.reader.annotation.BindView;
  24. import com.edufound.reader.application.EApplication;
  25. import com.edufound.reader.receiver.HomeKeyEventReceiver;
  26. import com.edufound.reader.receiver.NetworkChangeReceiver;
  27. import com.edufound.reader.util.Consts;
  28. import com.edufound.reader.util.EfunboxUtil;
  29. import com.edufound.reader.util.LiuHaiScreenUtil;
  30. import com.edufound.reader.util.PermissionsUtil;
  31. import com.google.gson.Gson;
  32. import com.jakewharton.rxbinding4.view.RxView;
  33. import java.lang.reflect.Field;
  34. import java.lang.reflect.InvocationTargetException;
  35. import java.lang.reflect.Method;
  36. import java.util.concurrent.TimeUnit;
  37. import androidx.appcompat.app.AppCompatActivity;
  38. import io.reactivex.rxjava3.annotations.Nullable;
  39. import io.reactivex.rxjava3.disposables.CompositeDisposable;
  40. import io.reactivex.rxjava3.disposables.Disposable;
  41. import io.reactivex.rxjava3.functions.Consumer;
  42. public abstract class BaseActivity extends AppCompatActivity {
  43. public CompositeDisposable mCompositeDisposable;
  44. //按home键的receiver
  45. HomeKeyEventReceiver mHomeReceiver;
  46. //登录广播action
  47. private final String LOGIN_SUCCESS_ACTION = "efunbox.login.success";
  48. //Gson
  49. Gson mGson;
  50. @Override
  51. protected void onCreate(@Nullable Bundle savedInstanceState) {
  52. super.onCreate(savedInstanceState);
  53. // EfunboxUtil.setCustomDensity(this, Consts.getmApplicAtion());
  54. EApplication.mActivityList.add(this);
  55. EfunboxUtil.initDesignSize(this);
  56. setContentView(this.getLayoutId());
  57. initBase();
  58. bindViews(this);
  59. initView();
  60. }
  61. void initBase() {
  62. getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  63. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
  64. LiuHaiScreenUtil.openFullScreenModel(this);
  65. }
  66. mGson = new Gson();
  67. //获取录音权限
  68. PermissionsUtil.verifyAudioPermissions(this);
  69. if (Consts.getScreenSize() == null) {
  70. DisplayMetrics outMetrics = new DisplayMetrics();
  71. getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
  72. int widthPixels = outMetrics.widthPixels;
  73. int heightPixels = outMetrics.heightPixels;
  74. int arr[] = {widthPixels, heightPixels};
  75. Consts.setScreenSize(arr);
  76. }
  77. mCompositeDisposable = new CompositeDisposable();
  78. mHomeReceiver = new HomeKeyEventReceiver();
  79. //注册home广播
  80. registerReceiver(mHomeReceiver, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
  81. // 注册网络广播
  82. NetworkChangeReceiver.registerReceiver(this);
  83. NetworkChangeReceiver.registerObserver(NetStateChangeObserver);
  84. //注册登录广播
  85. registerReceiver(loginReceiver, new IntentFilter(LOGIN_SUCCESS_ACTION));
  86. }
  87. @Override
  88. protected void onDestroy() {
  89. super.onDestroy();
  90. clearDisposable();
  91. unregisterReceiver(mHomeReceiver);
  92. NetworkChangeReceiver.unRegisterReceiver(this);
  93. }
  94. /**
  95. * 设置布局
  96. *
  97. * @return
  98. */
  99. public abstract int getLayoutId();
  100. /**
  101. * 初始化视图
  102. */
  103. public abstract void initView();
  104. public static void bindViews(Activity activity) {
  105. Class<? extends Activity> activityClass = activity.getClass();//获取activity的class
  106. Field[] fields = activityClass.getDeclaredFields();//获取activity的字段
  107. //遍历所有的字段
  108. for (Field field : fields) {
  109. //获取该字段的注解
  110. BindView bindView = field.getAnnotation(BindView.class);
  111. //!=null 说明该字段有注解并且是指定的注解
  112. if (bindView != null) {
  113. //获取到注解总传入的数值value
  114. int viewId = bindView.id();
  115. if (viewId != -1) {
  116. try {
  117. //获取到activity中findViewById的方法
  118. Method findViewByIdMethod = activityClass.getMethod("findViewById", int.class);
  119. try {
  120. //执行findViewById方法
  121. Object resView = findViewByIdMethod.invoke(activity, viewId);
  122. //允许通过反射访问私有变量
  123. field.setAccessible(true);
  124. //把字段的值设置该view的实例
  125. field.set(activity, resView);
  126. } catch (IllegalAccessException e) {
  127. e.printStackTrace();
  128. } catch (InvocationTargetException e) {
  129. e.printStackTrace();
  130. }
  131. } catch (NoSuchMethodException e) {
  132. e.printStackTrace();
  133. }
  134. }
  135. }
  136. }
  137. }
  138. /**
  139. * 添加订阅
  140. */
  141. public void addDisposable(Disposable mDisposable) {
  142. if (mCompositeDisposable == null) {
  143. mCompositeDisposable = new CompositeDisposable();
  144. }
  145. mCompositeDisposable.add(mDisposable);
  146. }
  147. /**
  148. * 取消所有订阅
  149. */
  150. public void clearDisposable() {
  151. if (mCompositeDisposable != null) {
  152. mCompositeDisposable.clear();
  153. }
  154. }
  155. @SuppressLint("AutoDispose")
  156. public void addUiClickListener(View view, Consumer onNext) {
  157. addDisposable(RxView.clicks(view).throttleFirst(2, TimeUnit.SECONDS).subscribe(onNext));
  158. }
  159. public abstract void onGetDisconnect();
  160. public abstract void onGetMobileConnect();
  161. public abstract void onGetWifiConnect();
  162. NetworkChangeReceiver.NetStateChangeObserver NetStateChangeObserver = new NetworkChangeReceiver.NetStateChangeObserver() {
  163. @Override
  164. public void onDisconnect() {
  165. //断网了
  166. onGetDisconnect();
  167. }
  168. @Override
  169. public void onMobileConnect() {
  170. //有网了(移动网络)
  171. onGetMobileConnect();
  172. }
  173. @Override
  174. public void onWifiConnect() {
  175. //有网了(wifi)
  176. onGetWifiConnect();
  177. }
  178. };
  179. protected void onLoginSuccess() {
  180. }
  181. BroadcastReceiver loginReceiver = new BroadcastReceiver() {
  182. @Override
  183. public void onReceive(Context context, Intent intent) {
  184. onLoginSuccess();
  185. }
  186. };
  187. public ViewGroup getRootView() {
  188. return findViewById(android.R.id.content);
  189. }
  190. public void showFollowCountAnim() {
  191. View mFollowView = LayoutInflater.from(this).inflate(R.layout.anim_getfollow, null);
  192. FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
  193. params.gravity = Gravity.CENTER;
  194. mFollowView.setLayoutParams(params);
  195. ObjectAnimator mRotationImgAnim = ObjectAnimator.ofFloat(mFollowView, "translationY", 0, -150);
  196. mRotationImgAnim.setDuration(1500);
  197. LinearInterpolator interpolator = new LinearInterpolator();
  198. mRotationImgAnim.setInterpolator(interpolator); //设置匀速旋转,不卡顿 icon_anim.start();
  199. ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(mFollowView, "alpha", 1f, 0f);
  200. alphaAnim.setDuration(1500);
  201. getRootView().addView(mFollowView);
  202. AnimatorSet animatorSet = new AnimatorSet();
  203. animatorSet.play(mRotationImgAnim).with(alphaAnim);
  204. animatorSet.addListener(new AnimatorListenerAdapter() {
  205. @Override
  206. public void onAnimationEnd(Animator animation) {
  207. super.onAnimationEnd(animation);
  208. getRootView().removeView(mFollowView);
  209. }
  210. });
  211. animatorSet.start();
  212. //
  213. }
  214. public Gson getGson() {
  215. return mGson;
  216. }
  217. public void toNextActivity(Class clazz) {
  218. Intent intent = new Intent(this, clazz);
  219. startActivity(intent);
  220. }
  221. public void toNextActivity(Class clazz, Bundle bundle) {
  222. Intent intent = new Intent(this, clazz);
  223. intent.putExtra("params_bundle", bundle);
  224. startActivity(intent);
  225. }
  226. public void toNextActivityForResult(Class clazz, Bundle bundle, int resultCode) {
  227. Intent intent = new Intent(this, clazz);
  228. intent.putExtra("params_bundle", bundle);
  229. startActivityForResult(intent, resultCode);
  230. }
  231. }