package com.edufound.reader.base; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.annotation.SuppressLint; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Build; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.view.animation.LinearInterpolator; import android.widget.FrameLayout; import com.edufound.reader.R; import com.edufound.reader.annotation.BindView; import com.edufound.reader.application.EApplication; import com.edufound.reader.receiver.HomeKeyEventReceiver; import com.edufound.reader.receiver.NetworkChangeReceiver; import com.edufound.reader.util.Consts; import com.edufound.reader.util.EfunboxUtil; import com.edufound.reader.util.LiuHaiScreenUtil; import com.edufound.reader.util.PermissionsUtil; import com.google.gson.Gson; import com.jakewharton.rxbinding4.view.RxView; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.concurrent.TimeUnit; import androidx.appcompat.app.AppCompatActivity; import io.reactivex.rxjava3.annotations.Nullable; import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.functions.Consumer; public abstract class BaseActivity extends AppCompatActivity { public CompositeDisposable mCompositeDisposable; //按home键的receiver HomeKeyEventReceiver mHomeReceiver; //登录广播action private final String LOGIN_SUCCESS_ACTION = "efunbox.login.success"; //Gson Gson mGson; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // EfunboxUtil.setCustomDensity(this, Consts.getmApplicAtion()); EApplication.mActivityList.add(this); EfunboxUtil.initDesignSize(this); setContentView(this.getLayoutId()); initBase(); bindViews(this); initView(); } void initBase() { getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { LiuHaiScreenUtil.openFullScreenModel(this); } mGson = new Gson(); //获取录音权限 PermissionsUtil.verifyAudioPermissions(this); if (Consts.getScreenSize() == null) { DisplayMetrics outMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(outMetrics); int widthPixels = outMetrics.widthPixels; int heightPixels = outMetrics.heightPixels; int arr[] = {widthPixels, heightPixels}; Consts.setScreenSize(arr); } mCompositeDisposable = new CompositeDisposable(); mHomeReceiver = new HomeKeyEventReceiver(); //注册home广播 registerReceiver(mHomeReceiver, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); // 注册网络广播 NetworkChangeReceiver.registerReceiver(this); NetworkChangeReceiver.registerObserver(NetStateChangeObserver); //注册登录广播 registerReceiver(loginReceiver, new IntentFilter(LOGIN_SUCCESS_ACTION)); } @Override protected void onDestroy() { super.onDestroy(); clearDisposable(); unregisterReceiver(mHomeReceiver); NetworkChangeReceiver.unRegisterReceiver(this); } /** * 设置布局 * * @return */ public abstract int getLayoutId(); /** * 初始化视图 */ public abstract void initView(); public static void bindViews(Activity activity) { Class activityClass = activity.getClass();//获取activity的class Field[] fields = activityClass.getDeclaredFields();//获取activity的字段 //遍历所有的字段 for (Field field : fields) { //获取该字段的注解 BindView bindView = field.getAnnotation(BindView.class); //!=null 说明该字段有注解并且是指定的注解 if (bindView != null) { //获取到注解总传入的数值value int viewId = bindView.id(); if (viewId != -1) { try { //获取到activity中findViewById的方法 Method findViewByIdMethod = activityClass.getMethod("findViewById", int.class); try { //执行findViewById方法 Object resView = findViewByIdMethod.invoke(activity, viewId); //允许通过反射访问私有变量 field.setAccessible(true); //把字段的值设置该view的实例 field.set(activity, resView); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } catch (NoSuchMethodException e) { e.printStackTrace(); } } } } } /** * 添加订阅 */ public void addDisposable(Disposable mDisposable) { if (mCompositeDisposable == null) { mCompositeDisposable = new CompositeDisposable(); } mCompositeDisposable.add(mDisposable); } /** * 取消所有订阅 */ public void clearDisposable() { if (mCompositeDisposable != null) { mCompositeDisposable.clear(); } } @SuppressLint("AutoDispose") public void addUiClickListener(View view, Consumer onNext) { addDisposable(RxView.clicks(view).throttleFirst(2, TimeUnit.SECONDS).subscribe(onNext)); } public abstract void onGetDisconnect(); public abstract void onGetMobileConnect(); public abstract void onGetWifiConnect(); NetworkChangeReceiver.NetStateChangeObserver NetStateChangeObserver = new NetworkChangeReceiver.NetStateChangeObserver() { @Override public void onDisconnect() { //断网了 onGetDisconnect(); } @Override public void onMobileConnect() { //有网了(移动网络) onGetMobileConnect(); } @Override public void onWifiConnect() { //有网了(wifi) onGetWifiConnect(); } }; protected void onLoginSuccess() { } BroadcastReceiver loginReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { onLoginSuccess(); } }; public ViewGroup getRootView() { return findViewById(android.R.id.content); } public void showFollowCountAnim() { View mFollowView = LayoutInflater.from(this).inflate(R.layout.anim_getfollow, null); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); params.gravity = Gravity.CENTER; mFollowView.setLayoutParams(params); ObjectAnimator mRotationImgAnim = ObjectAnimator.ofFloat(mFollowView, "translationY", 0, -150); mRotationImgAnim.setDuration(1500); LinearInterpolator interpolator = new LinearInterpolator(); mRotationImgAnim.setInterpolator(interpolator); //设置匀速旋转,不卡顿 icon_anim.start(); ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(mFollowView, "alpha", 1f, 0f); alphaAnim.setDuration(1500); getRootView().addView(mFollowView); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.play(mRotationImgAnim).with(alphaAnim); animatorSet.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); getRootView().removeView(mFollowView); } }); animatorSet.start(); // } public Gson getGson() { return mGson; } public void toNextActivity(Class clazz) { Intent intent = new Intent(this, clazz); startActivity(intent); } public void toNextActivity(Class clazz, Bundle bundle) { Intent intent = new Intent(this, clazz); intent.putExtra("params_bundle", bundle); startActivity(intent); } public void toNextActivityForResult(Class clazz, Bundle bundle, int resultCode) { Intent intent = new Intent(this, clazz); intent.putExtra("params_bundle", bundle); startActivityForResult(intent, resultCode); } }