Android BaseActivity 代码解析:权限请求、服务监测、数据获取与窗口动画

本文将详细解析以下代码中的方法,并进行知识点总结与分析,同时解释设计思路和实现方式:

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));
    }
}

方法解析

  1. 权限请求方法:requestRunPermission

该方法用于请求运行时权限,需要传入一个权限列表和一个权限监听器。方法首先遍历权限列表,检查这些权限是否已经被授权,如果没有,则调用 ActivityCompat.requestPermissions() 方法请求授权。如果所有权限都已经被授权,则调用监听器的 onGranted() 方法通知授权通过。

  1. 权限回调方法:onRequestPermissionsResult

该方法用于处理权限请求结果。如果请求授权被拒绝,将调用权限监听器的 onDenied() 方法,将被拒绝的权限列表传递给监听器。如果请求授权被通过,将调用权限监听器的 onGranted() 方法。

  1. 判断服务是否运行方法:isServiceExisted

该方法用于判断一个服务是否正在运行,需要传入一个上下文和一个服务的完整类名。方法首先通过 ActivityManagergetRunningServices() 方法获取所有正在运行的服务列表,然后遍历这个列表,查找与传入的服务类名相同的服务,如果找到了,说明该服务正在运行,返回 true,否则返回 false

  1. 数据监测准备方法:prepareDailyData

该方法用于准备数据监测,检查当天是否已经有了数据,如果没有,则解析远程 JSON 数据并保存到数据库中。如果已经有了数据,则检查数据是否完整,如果不完整,则重新解析远程 JSON 数据并更新到数据库中。

  1. 解析 JSON 数据并保存方法:analyseJsonAndSave

该方法用于解析远程 JSON 数据并保存到数据库中,需要先使用 HttpHelper.requestResult() 方法获取 JSON 数据,然后使用 Gson 解析 JSON 数据为对象。接着使用 HttpHelper.requestBytes() 方法获取图片数据,并将图片数据保存到 DailyData 对象中。最后将 DailyData 对象保存到数据库中。

  1. 窗口动画方法:windowFade、windowSlide、windowExplode

这三个方法分别用于设置窗口进入、退出、重新进入和返回时的动画效果,需要传入一个位置参数,用于指定动画效果的方向。其中 windowFade() 方法用于设置渐隐效果,windowSlide() 方法用于设置滑动效果,windowExplode() 方法用于设置爆炸效果。

总结

该代码展示了 Android 开发中一些常用的功能,包括权限请求、服务监测、数据获取和窗口动画。通过理解这些方法的实现原理和应用场景,开发者可以更好地进行 Android 应用开发。

Android BaseActivity 代码解析:权限请求、服务监测、数据获取与窗口动画

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

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