Android BaseActivity 代码解析:权限管理、数据监测、窗口动画及夜间模式
Android BaseActivity 代码解析:权限管理、数据监测、窗口动画及夜间模式
该代码是一个继承了 AppCompatActivity 的基类 BaseActivity,主要实现了一些常用的功能,如权限管理、防止软键盘将布局顶起、Activity 的添加与移除、数据监测等。同时,还实现了一些窗口动画效果和不支持夜间模式的设置。
设计思路
- 权限管理
该方法主要用来申请权限,如果该权限已经被授权,则直接回调 'onGranted()' 方法,否则跳转到权限申请页面。
- Activity 的添加与移除
通过 ActivityCollector 类对 Activity 进行添加和移除操作,方便管理和维护 Activity。
- 数据监测
该方法主要用来检测是否需要更新数据,如果需要更新,则通过 'analyseJsonAndSave()' 方法进行数据解析和保存。
- 窗口动画效果
通过设置窗口的 'enterTransition'、'exitTransition'、'reenterTransition' 和 'returnTransition' 属性,实现窗口的淡入淡出、滑动和爆炸等动画效果。
- 不支持夜间模式
通过设置 'LocalNightMode' 属性,实现不支持夜间模式的设置。
方法分析
- 'requestRunPermission()'
该方法用于申请权限,首先将传入的权限列表进行遍历,如果该权限未被授权,则将该权限添加到一个权限列表中。如果权限列表不为空,则调用 ActivityCompat.requestPermissions() 方法进行权限申请。在权限申请结果回调中,如果所有权限都被授权,则回调 'onGranted()' 方法,否则回调 'onDenied()' 方法。
- 'onRequestPermissionsResult()'
该方法用于处理权限申请结果回调,主要是判断授权结果,如果所有权限都被授权,则回调 'onGranted()' 方法,否则回调 'onDenied()' 方法。
- 'isServiceExisted()'
该方法用于判断指定的服务是否正在运行中,如果正在运行中,则返回 true,否则返回 false。
- 'prepareDailyData()'
该方法用于准备每日数据,首先判断是否已经保存了当天的数据,如果没有则调用 'analyseJsonAndSave()' 方法进行数据解析和保存。
- 'analyseJsonAndSave()'
该方法用于解析并保存每日数据,主要是通过 HttpHelper 类进行网络请求获取每日数据的 JSON 数据,然后使用 Gson 类将 JSON 数据转换成对应的 Java 对象。最后将获取到的数据保存到 LitePal 数据库中。
- 'windowFade()'
该方法用于设置窗口的淡入淡出动画效果,通过设置窗口的 'enterTransition'、'exitTransition'、'reenterTransition' 和 'returnTransition' 属性实现。
- 'windowSlide()'
该方法用于设置窗口的滑动动画效果,通过设置窗口的 'enterTransition'、'exitTransition'、'reenterTransition' 和 'returnTransition' 属性实现。
- 'windowExplode()'
该方法用于设置窗口的爆炸动画效果,通过设置窗口的 'enterTransition'、'exitTransition'、'reenterTransition' 和 'returnTransition' 属性实现。
- '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 的作用和使用方法,并能够将其应用到自己的项目中。
原文地址: https://www.cveoy.top/t/topic/od9z 著作权归作者所有。请勿转载和采集!