Android——《Android第一行代码》10.6节服务的最佳实践,应用8.0以上Android系统需要修改的地方

【背景】:参照书籍写的代码,辛苦写完,分析完原理,运行起来确有很多,解决这些问题,查了大量的资料,走了很多弯路,最后仅通过一个基本知识点解决,写在这里,记录下来,后来者参考了,少走些弯路。

【问题】:先从遇到的问题说起

1、程序运行,直接闪退。

——Android 8.0以上系统使用通知,需要添加渠道,详见另一篇博文。

2、刚运行,没有操作别的,就出现异常卡死问题,再次打开APP,开始下载,程序闪退,查看logcat,是需要申请前台服务权限,所以在AndroidMainfest.xml中添加:

Android——《Android第一行代码》10.6节服务的最佳实践,应用8.0以上Android系统需要修改的地方_第1张图片

3、点击下载,出现程序提示的download failed提示,跟踪logcat,确认为存储权限没有获取,所以无法下载成功。

java.io.FileNotFoundException: /storage/emulated/0/Download/ : open failed: EAC(Permission denied)

这个问题根据网上一些办法在程序中都有,比如下,但是都没有效果,依然不好使。

1)AndroidMainfest.xml 添加权限

 

2)动态申请权限

if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}

3)build.gradle中Android闭包加入:

compileOptions{
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

【最终解决方案】:

最后,想到是不是 还是  Android版本的问题,把build.gradle中的 targetSdkVersion 改低一些(原来是29),我试了23 、26,重新运行,都好使(去掉上述的问题2-3的解决方法也OK),更奇怪的是改完后,再改回29,程序运行依然好使,把虚拟机恢复出厂设置,再用targetSdkVersion=29,就不好使了,怀疑是targetSdkVersion较低时,再虚拟机中已经打开了必要的权限,所以再改回到29,程序运行依然好使。

关于build.gradle中的 minSdkVersion和targetSdkVersion意义,找了一篇博文,讲的通俗易懂,原文连接,内容我摘出来如下,仅做学习参考应用:

minSdkVersion和targetSdkVersion相信很多人都不太理解,我在网上也看了许多关于这两者区别的文章,感觉说的都很模糊,直到我在stackOverFlow看到Android Min SDK Version vs. Target SDK Version这篇文章后,我才终于弄清楚如何去设置minSdkVersion和targetSdkVersion,现在我将分享给大家。

简言之,这篇文章的目的是为了区分minSDK和targetSDK,这两者相当于一个区间,你可以用到targetSDK中最新的API和最酷的新功能,但你又不得不向下兼容到minSDK,保证这个区间内的设备都可以正常的运行你的app。换句话说,你想使用Android刚刚推出的新特性,但这对于你的app又不是必须的,你就可以将targetSDK设置为你想使用新特性的SDK版本,minSDK设置成低版本保证所有人都可以使用你的app。

举一个例子:假如你想给你的app加入大量的手势操作(sdk 7才引入的),然而这些手势操作可以被Button啊或menu等代替,在这种情况下,手势操作就是一个额外的加分功能,而不是一个必须的功能,因此你就需要把targetSDK设置为7,把minSDK设置为3(这是举个例子,现在没人还在用这么老的设备了)这样即使是使用老设备的用户也可以用你的app了。然后你所要做的就是要在代码里判断版本,如果是大于等于7的版本中就使用手势操作,小于7的版本中就使用button等代替,这样使用了新手机的用户就可以体验到你app中酷炫的新功能了。

另外一个例子:如果你想给你的项目加入Android 5.0的Material Design,有一些用户可能会升级到5.0而使用到你的新特性,而有一部分用户的手机硬件太老,不支持升级到5.0,除非他们换新手机,那么你就要为他们进行向下兼容,不至于损失这部分用户,这样你的targetSDK设置为21,minSDK可以设置为8。

你可能感兴趣的:(Android)