Android开发之应用更新或软件下载
本文章学习前提:okHttp3或以上,EventBus或其它事件总线工具,四大组件的Activity和Service,安卓通知基础知识
新建项目文件
目录结构如下:
MainActivity.java
获取权限
本项目所需权限
<!-- 网络权限-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 软件安装权限-->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<!-- 文件读写权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Android 6.0以上并且targetSDKVersion>=23时需要动态申请权限
在MainActivity.java中创建权限申请方法
// 获取权限方法
public static void getPermissionCamera(Activity activity) {
// 检查权限
int readPermissionCheck = ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE);
int writePermissionCheck = ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
// 检查是否有该权限,没有才去申请
// PackageManager.PERMISSION_GRANTED--->有
// PackageManager.PERMISSION_DENIED---->无
if (readPermissionCheck != PackageManager.PERMISSION_GRANTED|| writePermissionCheck != PackageManager.PERMISSION_GRANTED) {
// 将这些权限添加到数组中
String[] permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
// 通过ActivityCompat.requestPermissions()方法申请权限
ActivityCompat.requestPermissions(
activity,
permissions,
0);
}
}
在权限中,有两种不同的大类,运行时权限和非运行时权限
运行时权限是软件正常运行时需要用到的权限如果没有会影响软件功能或报错,运行时权限的申请就需要用到以上方法。
非运行时权限是指软件运行过程中并不需要该权限是为了某些特殊的功能,如软件安装等需要申请的权限,即便没有也不影响软件的正常运行,我们需要在下载完成后点击安装跳转到软件安装页面,所以我们需要申请的软件安装权限就需要用到以下方法
public void checkPermission(){
boolean haveInstallPermission;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
haveInstallPermission = getPackageManager().canRequestPackageInstalls();
if(!haveInstallPermission){
//没有权限让调到设置页面进行开启权限;
Uri packageURI = Uri.parse("package:" + getPackageName());
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
startActivityForResult(intent, 10086);
}else{
//有权限,执行自己的逻辑;
}
}else{
//其他android版本,可以直接执行安装逻辑;
}
}
跳转到设置页面让用户自行打开软件安装权限
版本对比
Global.LOCAL_VERSION<Global.SERVICE_VERSION
本地版本低于服务端版本就创建更新弹窗
创建更新弹窗
当你的本地版本低于你获取到的服务端版本号,就需要弹出弹窗确保软件的及时跟新
private void checkVersion() {
if (Global.LOCAL_VERSION<Global.SERVICE_VERSION) {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setTitle("软件更新通知")
.setMessage("发现新版本,建议立即跟新")
//设置更新和取消事件监听
.setPositiveButton("更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Intent intent = new Intent(MainActivity.this, UpdateService.class);
intent.putExtra("titleId", R.string.app_name);
startService(intent);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
dialog.create().show();
} else {
}
启动服务
Intent intent = new Intent(MainActivity.this, UpdateService.class);
intent.putExtra("t