Android BaseActivity 代码解析:权限管理、数据监测、窗口动画及夜间模式

该代码是一个继承了 AppCompatActivity 的基类 BaseActivity,主要实现了一些常用的功能,如权限管理、防止软键盘将布局顶起、Activity 的添加与移除、数据监测等。同时,还实现了一些窗口动画效果和不支持夜间模式的设置。

设计思路

  1. 权限管理

该方法主要用来申请权限,如果该权限已经被授权,则直接回调 'onGranted()' 方法,否则跳转到权限申请页面。

  1. Activity 的添加与移除

通过 ActivityCollector 类对 Activity 进行添加和移除操作,方便管理和维护 Activity。

  1. 数据监测

该方法主要用来检测是否需要更新数据,如果需要更新,则通过 'analyseJsonAndSave()' 方法进行数据解析和保存。

  1. 窗口动画效果

通过设置窗口的 'enterTransition'、'exitTransition'、'reenterTransition' 和 'returnTransition' 属性,实现窗口的淡入淡出、滑动和爆炸等动画效果。

  1. 不支持夜间模式

通过设置 'LocalNightMode' 属性,实现不支持夜间模式的设置。

方法分析

  1. 'requestRunPermission()'

该方法用于申请权限,首先将传入的权限列表进行遍历,如果该权限未被授权,则将该权限添加到一个权限列表中。如果权限列表不为空,则调用 ActivityCompat.requestPermissions() 方法进行权限申请。在权限申请结果回调中,如果所有权限都被授权,则回调 'onGranted()' 方法,否则回调 'onDenied()' 方法。

  1. 'onRequestPermissionsResult()'

该方法用于处理权限申请结果回调,主要是判断授权结果,如果所有权限都被授权,则回调 'onGranted()' 方法,否则回调 'onDenied()' 方法。

  1. 'isServiceExisted()'

该方法用于判断指定的服务是否正在运行中,如果正在运行中,则返回 true,否则返回 false。

  1. 'prepareDailyData()'

该方法用于准备每日数据,首先判断是否已经保存了当天的数据,如果没有则调用 'analyseJsonAndSave()' 方法进行数据解析和保存。

  1. 'analyseJsonAndSave()'

该方法用于解析并保存每日数据,主要是通过 HttpHelper 类进行网络请求获取每日数据的 JSON 数据,然后使用 Gson 类将 JSON 数据转换成对应的 Java 对象。最后将获取到的数据保存到 LitePal 数据库中。

  1. 'windowFade()'

该方法用于设置窗口的淡入淡出动画效果,通过设置窗口的 'enterTransition'、'exitTransition'、'reenterTransition' 和 'returnTransition' 属性实现。

  1. 'windowSlide()'

该方法用于设置窗口的滑动动画效果,通过设置窗口的 'enterTransition'、'exitTransition'、'reenterTransition' 和 'returnTransition' 属性实现。

  1. 'windowExplode()'

该方法用于设置窗口的爆炸动画效果,通过设置窗口的 'enterTransition'、'exitTransition'、'reenterTransition' 和 'returnTransition' 属性实现。

  1. 'noNight()'

该方法用于设置不支持夜间模式,通过设置 'LocalNightMode' 属性实现。

代码示例

public class BaseActivity extends AppCompatActivity {

    private static final String TAG = "BaseActivity";

    private PermissionListener mListener;

    private static final int PERMISSION_REQUESTCODE = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, getClass().getSimpleName());

        if (ConfigData.getIsNight()) {
            // 沉浸式状态栏,设置深色
            ImmersionBar.with(this)
                    .statusBarDarkFont(false)
                    .init();
        } else {
            ImmersionBar.with(this)
                    .statusBarDarkFont(true)
                    .init();
        }

        ActivityCollector.addActivity(this);

        // 防止输入法将布局顶上去
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }

    // 权限
    public void requestRunPermission(String[] permissions, PermissionListener listener) {
        mListener = listener;
        List<String> permissionLists = new ArrayList<>();
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(this, permission)
                    != PackageManager.PERMISSION_GRANTED) {
                permissionLists.add(permission);
            }
        }
        if (!permissionLists.isEmpty()) {
            ActivityCompat.requestPermissions(this,
                    permissionLists.toArray(new String[permissionLists.size()]), PERMISSION_REQUESTCODE);
        } else {
            //表示全都授权了
            mListener.onGranted();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case PERMISSION_REQUESTCODE:
                if (grantResults.length > 0) {
                    // 存放没授权的权限
                    List<String> deniedPermissions = new ArrayList<>();
                    for (int i = 0; i < grantResults.length; i++) {
                        int grantResult = grantResults[i];
                        String permission = permissions[i];
                        if (grantResult != PackageManager.PERMISSION_GRANTED) {
                            deniedPermissions.add(permission);
                        }
                    }
                    if (deniedPermissions.isEmpty()) {
                        // 说明都授权了
                        mListener.onGranted();
                    } else {
                        mListener.onDenied(deniedPermissions);
                    }
                }
                break;
            default:
                break;
        }
    }

    public static boolean isServiceExisted(Context context, String className) {
        ActivityManager activityManager = (ActivityManager) context
                .getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningServiceInfo> serviceList = activityManager
                .getRunningServices(Integer.MAX_VALUE);
        if (!(serviceList.size() > 0)) {
            return false;
        }
        for (int i = 0; i < serviceList.size(); i++) {
            ActivityManager.RunningServiceInfo serviceInfo = serviceList.get(i);
            ComponentName serviceName = serviceInfo.service;
            if (serviceName.getClassName().equals(className)) {
                return true;
            }
        }
        return false;
    }

    // 开启数据监测
    public static void prepareDailyData() {
        long currentDate = TimeController.getCurrentDateStamp();
        List<DailyData> dailyDataList = LitePal.where("dayTime = ?", currentDate + "").find(DailyData.class);

        if (dailyDataList.isEmpty()) {
            analyseJsonAndSave();
        } else {
            if (dailyDataList.get(0).getPicVertical() == null ||
                    dailyDataList.get(0).getPicHorizontal() == null ||
                    dailyDataList.get(0).getDailyEn() == null ||
                    dailyDataList.get(0).getDailyChs() == null) {
                analyseJsonAndSave();
            }
        }
    }

    public static void analyseJsonAndSave() {
        byte[] imgVertical;
        byte[] imgHorizontal;
        String dailyCn;
        String dailyEn;
        String result = "", json, tem;
        LitePal.deleteAll(DailyData.class);
        DailyData dailyData = new DailyData();
        try {
            json = HttpHelper.requestResult(ConstantData.IMG_API);
            Log.d(TAG, "数据" + json);
            Gson gson = new Gson();
            JsonBing jsonBing = gson.fromJson(json, JsonBing.class);
            Log.d(TAG, "prepareDailyData: " + jsonBing.toString());
            tem = ConstantData.IMG_API_BEFORE + jsonBing.getImages().get(0).getUrl();
            Log.d(TAG, "URL" + tem);
            imgHorizontal = HttpHelper.requestBytes(tem);
            if (tem.indexOf("1920x1080") != -1) {
                result = tem.replace("1920x1080", "1080x1920");
            } else {
                result = tem;
            }
            imgVertical = HttpHelper.requestBytes(result);
            json = HttpHelper.requestResult(ConstantData.DAILY_SENTENCE_API);
            Gson gson2 = new Gson();
            JsonDailySentence dailySentence = gson2.fromJson(json, JsonDailySentence.class);
            dailyCn = dailySentence.getNote();
            dailyEn = dailySentence.getContent();
            dailyData.setPicHorizontal(imgHorizontal);
            dailyData.setPicVertical(imgVertical);
            dailyData.setDailyEn(dailyEn);
            dailyData.setDailyChs(dailyCn);
            dailyData.setDailySound(dailySentence.getTts());
            dailyData.setDayTime(TimeController.getCurrentDateStamp() + "");
            dailyData.save();
        } catch (Exception e) {
            Log.d(TAG, "prepareDailyData: " + e.toString());
        }
    }

    public void windowFade() {
        getWindow().setEnterTransition(new Fade().setDuration(500));
        getWindow().setExitTransition(new Fade().setDuration(500));
        getWindow().setReenterTransition(new Fade().setDuration(500));
        getWindow().setReturnTransition(new Fade().setDuration(500));
    }

    public void windowSlide(int position) {
        getWindow().setEnterTransition(new Slide(position).setDuration(300));
        getWindow().setExitTransition(new Slide(position).setDuration(300));
        getWindow().setReenterTransition(new Slide(position).setDuration(300));
        getWindow().setReturnTransition(new Slide(position).setDuration(300));
    }

    public void windowExplode() {
        getWindow().setEnterTransition(new Explode().setDuration(300));
        getWindow().setExitTransition(new Explode().setDuration(300));
        getWindow().setReenterTransition(new Explode().setDuration(300));
        getWindow().setReturnTransition(new Explode().setDuration(300));
    }

    // 不支持夜间模式
    public void noNight(){
        getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);
    }

    /*
     * fromXType:动画开始前的X坐标类型。取值范围为ABSOLUTE(绝对位置)、RELATIVE_TO_SELF(以自身宽或高为参考)、RELATIVE_TO_PARENT(以父控件宽或高为参考)。
     * fromXValue:动画开始前的X坐标值。当对应的Type为ABSOLUTE时,表示绝对位置;否则表示相对位置,1.0表示100%。
     * toXType:动画结束后的X坐标类型。
     * toXValue:动画结束后的X坐标值。
     * fromYType:动画开始前的Y坐标类型。
     * fromYValue:动画开始前的Y坐标值。
     * toYType:动画结束后的Y坐标类型。
     * toYValue:动画结束后的Y坐标值
     * */
    // 下部分操作布局从底部进入动画
    animation = new TranslateAnimation(
            Animation.RELATIVE_TO_PARENT, 0.0f,Animation.RELATIVE_TO_PARENT, 0.0f,
            Animation.RELATIVE_TO_PARENT, 1.0f,Animation.RELATIVE_TO_PARENT, 0.0f
    );
            animation.setDuration(2000);
    //relativeLayout.startAnimation(animation);
    //imgShow.setVisibility(View.VISIBLE);
    // 上部分从顶部进入动画
    animation = new TranslateAnimation(
            Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f,
            Animation.RELATIVE_TO_PARENT, -0.5f, Animation.RELATIVE_TO_PARENT, 0.0f
    );
            animation.setDuration(2000);
    // imgShow.startAnimation(animation);

}

总结

本篇博文对 BaseActivity 代码进行了解析,讲解了代码设计思路,并细致分析了每个方法的功能和实现过程。通过阅读此博文,读者可以更加深入地理解 BaseActivity 的作用和使用方法,并能够将其应用到自己的项目中。

Android BaseActivity 代码解析:权限管理、数据监测、窗口动画及夜间模式

原文地址: https://www.cveoy.top/t/topic/od9z 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录