Android BaseActivity 代码解析:权限请求、服务监测、数据获取与窗口动画
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));
}
}
方法解析
- 权限请求方法:requestRunPermission
该方法用于请求运行时权限,需要传入一个权限列表和一个权限监听器。方法首先遍历权限列表,检查这些权限是否已经被授权,如果没有,则调用 ActivityCompat.requestPermissions() 方法请求授权。如果所有权限都已经被授权,则调用监听器的 onGranted() 方法通知授权通过。
- 权限回调方法:onRequestPermissionsResult
该方法用于处理权限请求结果。如果请求授权被拒绝,将调用权限监听器的 onDenied() 方法,将被拒绝的权限列表传递给监听器。如果请求授权被通过,将调用权限监听器的 onGranted() 方法。
- 判断服务是否运行方法:isServiceExisted
该方法用于判断一个服务是否正在运行,需要传入一个上下文和一个服务的完整类名。方法首先通过 ActivityManager 的 getRunningServices() 方法获取所有正在运行的服务列表,然后遍历这个列表,查找与传入的服务类名相同的服务,如果找到了,说明该服务正在运行,返回 true,否则返回 false。
- 数据监测准备方法:prepareDailyData
该方法用于准备数据监测,检查当天是否已经有了数据,如果没有,则解析远程 JSON 数据并保存到数据库中。如果已经有了数据,则检查数据是否完整,如果不完整,则重新解析远程 JSON 数据并更新到数据库中。
- 解析 JSON 数据并保存方法:analyseJsonAndSave
该方法用于解析远程 JSON 数据并保存到数据库中,需要先使用 HttpHelper.requestResult() 方法获取 JSON 数据,然后使用 Gson 解析 JSON 数据为对象。接着使用 HttpHelper.requestBytes() 方法获取图片数据,并将图片数据保存到 DailyData 对象中。最后将 DailyData 对象保存到数据库中。
- 窗口动画方法:windowFade、windowSlide、windowExplode
这三个方法分别用于设置窗口进入、退出、重新进入和返回时的动画效果,需要传入一个位置参数,用于指定动画效果的方向。其中 windowFade() 方法用于设置渐隐效果,windowSlide() 方法用于设置滑动效果,windowExplode() 方法用于设置爆炸效果。
总结
该代码展示了 Android 开发中一些常用的功能,包括权限请求、服务监测、数据获取和窗口动画。通过理解这些方法的实现原理和应用场景,开发者可以更好地进行 Android 应用开发。
原文地址: https://www.cveoy.top/t/topic/n3wL 著作权归作者所有。请勿转载和采集!