效果

实现分析

基本上没有什么难点,就是布局,然后显示用户协议对话框,动态处理权限,判断是否显示引导界面,是否显示广告界面等。

布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".component.splash.activity.SplashActivity"> <!--banner-->
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="120dp"
android:src="@drawable/splash_banner" /> <!--logo-->
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/copyright"
android:layout_centerHorizontal="true"
android:layout_marginBottom="20dp"
android:src="@drawable/splash_logo" /> <!--版权-->
<TextView
android:id="@+id/copyright"
android:textColor="@color/black80"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="30dp"
android:text="@string/copyright" />
</RelativeLayout>

是否显示用户协议对话框

if (DefaultPreferenceUtil.getInstance(getHostActivity()).isAcceptTermsServiceAgreement()) {
//已经同意了用户协议 checkPermission();
} else {
showTermsServiceAgreementDialog();
}

动态处理权限

现在做Android必须要动态处理权限,这里使用第三方框架,推荐再用到的时候才动态请求权限,写法和现在一样。

private void checkPermission() {
//让动态框架检查是否授权了 //如果不使用框架就使用系统提供的API检查
//它内部也是使用系统API检查
//只是使用框架就更简单了
SplashActivityPermissionsDispatcher.onPermissionGrantedWithPermissionCheck(this);
} /**
* 权限授权了就会调用该方法
* 请求相机权限目的是扫描二维码,拍照
*/
@NeedsPermission({
Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
})
void onPermissionGranted() {
//如果有权限就进入下一步
prepareNext();
} /**
* 显示权限授权对话框
* 目的是提示用户
*/
@OnShowRationale({
Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
})
void showRequestPermission(PermissionRequest request) {
new AlertDialog.Builder(getHostActivity())
.setMessage(R.string.permission_hint)
.setPositiveButton(R.string.allow, (dialog, which) -> request.proceed())
.setNegativeButton(R.string.deny, (dialog, which) -> request.cancel()).show();
} /**
* 拒绝了权限调用
*/
@OnPermissionDenied({
Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
})
void showDenied() {
//退出应用
finish();
} /**
* 再次获取权限的提示
*/
@OnNeverAskAgain({
Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
})
void showNeverAsk() {
//继续请求权限
checkPermission();
} /**
* 授权后回调
*
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//将授权结果传递到框架
SplashActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}

界面跳转

private void postNext() {
binding.copyright.postDelayed(new Runnable() {
@Override
public void run() {
next();
}
}, Config.SPLASH_DEFAULT_DELAY_TIME); } private void next() {
//获取意图的目的是,因为启动该界面的时候,可能携带一些数据
//需要在主界面处理
Intent intent = new Intent(); Intent oldIntent = getIntent();
IntentUtil.cloneIntent(oldIntent, intent); // if (sp.isLogin()) {
// intent.setClass(getHostActivity(), AdActivity.class);
// } else {
intent.setClass(getHostActivity(), MainActivity.class);
// } startActivity(intent); //关闭当前界面
finish(); //禁用启动动画
overridePendingTransition(0, 0);
}

最新文章

  1. psutil一个基于python的跨平台系统信息跟踪模块
  2. Python 字符串操作
  3. JQuery------动态添加的元素on方法不起作用解决方法
  4. shell脚本参数
  5. Force.com微信开发系列(六)客服接口
  6. CentOS 下安装无线哥的老爷机DELL的无线驱动
  7. COUNT(*),count(1),COUNT(ALL expression),COUNT(DISTINCT expression) BY Group by
  8. ArrayList-VS-LinkedList
  9. FZU Problem 2169 shadow
  10. Web前端浏览器兼容问题
  11. JavaScript树(二) 二叉树搜索
  12. ●Joyoi Normal
  13. UltraEdit文本行数多变一和一边多
  14. springboot操作mongodb
  15. Android 小票打印USB
  16. PHP 日志专题
  17. Delphi---TServerSocket和TClientSocket发送和接收大数据包
  18. Delphi INI文件保存与读取
  19. Linux内核分析 一二章读书笔记
  20. string logo online customization

热门文章

  1. 从.net开发做到云原生运维(八)——DevOps实践
  2. Luffy /4/ 多方式登录接口&amp;登录注册前端页面
  3. CS基础课不完全自学指南
  4. Kubernetes生产环境最佳实践
  5. 经典!服务端 TCP 连接的 TIME_WAIT 过多问题的分析与解决
  6. Microsoft Graph 的 .NET 6 之旅
  7. XPath语法和lxml模块
  8. 老生常谈系列之Aop--前言
  9. 实战 target 选择器,解放生产力!
  10. Mac 手动安装 bee工具