Android高级第十一讲之不同系统间的区别
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!
Android系统不断的升级,从基础到中级再到高级,逐步升级是软件工程敏捷开发的一个重点,在每个版本中升级不同功能,以满足越来越丰富的用户需求,作为一名开发者,熟悉各个版本之间的异同,有助于做产品适配、安全等各方面业务。
2.3,加入陀螺仪等一些传感器支持和前后相机支持(Android变得越来越流行,尤其是经典的三星I9100)
3.0,加入Fragment支持(主要为支撑平板而研发)
4.0,
1、多核处理器优化,据说比3.0快1.8倍(多线程能不快嘛)
2、支持HttpResponseCache(本地缓存,有效降低服务器压力)
3、加入activityLifeCycle,有效监听activity生命周期
4.2,引入多用户支持(微信、微博、QQ、支付宝都可以当成系统账号)
默认content provider是私有的
4.3,提供SELinux,防止应用把自已文件,修改改成公共权限,产生漏洞
4.4,
1、提供访问多个外存设备的功能,虚拟机改为ART,好处在于:答案;
2、AlarmManager在低电耗时可以通过setWindow和众多定时事务一起发生,也可以通过setExact来在特定时间发生, 而之前的setRepeating方法将不再准确;提供完善的打印框架,短信只有默认程序才可以读写信息
3、 之前版本的webView可以随意被人用js调用本地方法,这个版本要求必须对调用方法加入@JavaScriptInterface才 有效,那么可以选择性的将方法给H5端。
地址:https://developer.android.google.cn/about/versions/android-4.4.html
5.0,支持arm、x86和mips,全面兼容64位,声音和振动通过Notification来添加 ,ART全面替换Dalvik
地址:https://developer.android.google.cn/about/versions/lollipop.html
使用JobSchedule来执行后台轮循操作,减少操作不当引起的内存和电量消耗
5.1.1,
1、支持多dex的multidex出现
2、FileProvider出现,敏感权限需要申请
https://developer.android.google.cn/reference/android/support/v4/content/FileProvider.html
用来临时赋予权限,只要获得权限的组件(activity或Service等)不回收,则权限一直存在。可以通过
Intent.setFlags来设置权限
6.0,主要改动,需检查自己需要的权限是否被赋予,低电耗禁止JobSchedule、网络请求和同步、AlarmManager(设置setAndAllWhileIdle或setExactAndAllowWhileIdle(),来让闹钟来临前几分钟唤醒屏幕),去掉对Apache的支持,如需要则在gradle添加下面代码
android {
useLibrary 'org.apache.http.legacy'
}
地址:https://developer.android.google.cn/about/versions/marshmallow/android-6.0-changes.html
7.0:主要改动面向6.0以下的应用,后台服务会被直接干掉,并限制锁屏后对Cpu和网络的调用。
地址:https://developer.android.google.cn/about/versions/nougat/android-7.0-changes.html
8.0:
1、加入Fragment的LifeCycleCallback,有效监听其生命周期
2、无法在manifest里注册隐式广播
3、修复权限组一个权限被授予,其他也被授予的问题(比如storage的read和write)
地址:https://developer.android.google.cn/preview/behavior-changes.html
8.1:
新方法主要用于设置宽高,来获取你要的图片大小,而非视频直接返回的原始图片大小,用于实现减少应用内存消耗的目的。
其他对于我来讲,有用的Api不多。地址:https://developer.android.google.cn/about/versions/oreo/android-8.1
总结:虽然新的系统会让手机性能更佳,但默认也会给应用添加许多限制,比如4.4添加ART后对定时器的限制,6.0对文件写入sd卡的限制(即使用户把所有权限都给到你,那稍后默认又会收回你的部分权限)。新的系统对用户来说是更好的体验,对开发者来说是更多的工具,但同时也是新的挑战,所以Gradle中要慎重添加下面这句代码targetSdkVersion 24。
打包方面:正式包一定要加下面这句。
release { // 如果要支持最新版的系统 Android 7.0 // 这一行必须加,否则安装时会提示没有签名 // 作用是只使用旧版签名,禁用V2版签名模式 v2SigningEnabled false}
如果要使用新的签名,可以参考http://blog.csdn.net/reboot123/article/details/51261558
网上找了个系统对文件读取和存储的权限处理方法,可见系统对权限管理的敏感性。
对SharePreference的存储权限做过限制。java.lang.SecurityException: MODE_WORLD_READABLE no longer supported
读取屏蔽号码,阻止来电和不必要的短信骚扰
提供新的签名方式 APK Signature Scheme v2,加速apk安装过程
在主配置文件设置的流量、图片和视频监控广播无效,但代码实现依然有效。
读写私有文件不再允许设置MODE_WORLD_READ/WRITEABLE权限
使用FileProvider
使用FileProvider的大致步骤如下:
第一步:在manifest清单文件中注册provider
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.jph.takephoto.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
心得:exported:要求必须为false,为true则会报安全异常。grantUriPermissions:true,表示授予 URI 临时访问权限。
第二步:指定共享的目录
为了指定共享的目录我们需要在资源(res)目录下创建一个xml目录,然后创建一个名为“file_paths”(名字可以随便起,只要和在manifest注册的provider所引用的resource保持一致即可)的资源文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<external-path path="" name="camera_photos" />
</paths>
</resources>
- <files-path/>代表的根目录: Context.getFilesDir()
- <external-path/>代表的根目录: Environment.getExternalStorageDirectory()
- <cache-path/>代表的根目录: getCacheDir()
心得:上述代码中
path=""
,是有特殊意义的,它代码根目录,也就是说你可以向其它的应用共享根目录及其子目录下任何一个文件了,如果你将path设为path="pictures"
,那么它代表着根目录下的pictures目录(eg:/storage/emulated/0/pictures),如果你向其它应用分享pictures目录范围之外的文件是不行的。
如果设为".",则整个文件夹都被共享,但fileProvider的目录是只共享自己目录,而且只让自己应用知悉;而非让所有应用都得知此文件,进而产发安全隐患。
第三步:使用FileProvider
上述准备工作做完之后,现在我们就可以使用FileProvider了。
还是以调用系统相机拍照为例,我们需要将上述拍照代码修改为如下:
File file=new File(Environment.getExternalStorageDirectory(), "/temp/"+System.currentTimeMillis() + ".jpg");
if (!file.getParentFile().exists())file.getParentFile().mkdirs();
Uri imageUri = FileProvider.getUriForFile(context, "com.jph.takephoto.fileprovider", file);//通过FileProvider创建一个content类型的Uri
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URI
startActivityForResult(intent,1006);
N:敏感权限全部要App申请用户同意,大体分两类运行前申请和运行中申请两种;编辑框的文字可以定义除开复制、粘贴、全选这些功能;通知栏可以让用记回信息,点赞-支持快速回复;添加系统级电话黑名单;支持VR
https://developer.android.com/reference/android/support/v4/content/FileProvider.html
谷歌官方博客:https://android-developers.googleblog.com/全英文
NDK开发:https://developer.android.com/ndk/guides/stable_apis.html
Android高级第十一讲之不同系统间的区别相关推荐
- Android高级开发第二讲--Android中API翻译之Activity
博客出自:刘兆贤的博客_CSDN博客-Java高级,Android旅行,Android基础领域博主,转载注明出处! All Rights Reserved ! Activity主要用来展示给用户,让用 ...
- Android中级第十一讲之MotionEvent的分发、拦截机制分析
最近在研究事件分发机制,一方面在看内核剖析,一方面找测试小例子,最终找到,内容如下,--下载地址 咱们就借这个小例子来讲一些问题 一开始只关注了onTouch事件,应用于Window层,用于对操作事件 ...
- Android高级第九讲--JVM 与Android Dalvik之间的异同
博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 有些东西不是不知道,是还没用到,所以才没去仔细了解,昨天被问及 ...
- 天高任鸟飞,在你还苦闷Android出路时,总有人在系统钻研为高级开发做准备,技能提升的重要性不用我说了!
程序员,你还要迷茫多久? 各位Android程序员小伙伴,今天和大家聊聊关于程序员群体的职业发展和技术升级,如果大家觉得感兴趣,不妨可以加入文末提供的技术交流群中,一起学习. 程序员,一个特殊的群体, ...
- Android 高级面试
一. Android 性能优化 1. 如何对 Android 应用进行性能分析 2. 什么情况下会导致内存泄露 3. 如何避免 OOM 异常 4. Android 中如何捕获未捕获的异常 5. ANR ...
- android高级编程-android高级应用
android高级应用>>> 第一阶段 程序员基本素质养成 程序员所需要具备的12条职业素质 让学员初步了解和审视自己所应该具备的职业素质.并且我们会在授课中随时训练和贯彻这样的素质 ...
- Android 高级面试-2:IPC 相关
内容 IPC 就是指跨进程通信.IPC 相关的内容,涉及的主要有: 常见的 IPC 通信方式: Binder 相关: 两种序列化方式及其对比: 问题 IPC Android 上的 IPC 跨进程通信时 ...
- Android 高级UI解密 (三) :Canvas裁剪 与 二维、三维Camera几何变换(图层Layer原理)
Android的绘图机制是核心内容之一,无论是什么样的功能最终都是以图像的形式呈现给用户.因此掌握Android的绘图技巧,有助于Android理解层次的提高,在面对产品经理提出的idea时也更有底气 ...
- Android工程师进阶34讲学习笔记
最近发现一个技术提升的平台,很多课程对于技术提升都多有益处,很多是实际上的项目实战并对底层原理讲解透彻.前几个月已经学习完了<Android 工程师进阶 34 讲>,现在重学一遍并做些总结 ...
最新文章
- DataTable的Compute方法和Expression语法
- springmvc+mybatis+mysql+maven
- 项目管理的十大谈判必杀技
- 从存储区提供程序的数据读取器中进行读取时出错_三菱伺服控制程序写法破析...
- 工作127:子向父亲传值
- vc++深入详解学习-NO.3
- linux普通用户命令权限,Linux普通用户没有权限使用命令怎么办
- Codeforces 558(C、D、E)总结
- Oracle Hint
- SRM 627 D1L2GraphInversionsDFS查找指定长度的所有路径 Binary indexed tree (BIT)
- Highcharts使用表格数据绘制图表
- eclipse14配置tomcat Server Locations
- MapReduce异常
- linux 远程管理
- python 秘钥_python – 使用ssh密钥加密和解密密码
- 文件系统系列之一:fat文件系统的结构分析
- can协议crc计算_CAN协议教程|CAN报文分析
- MySQL八股文连环45问,你能坚持第几问?
- 比UUID更快更安全NanoID到底是怎么实现的?(荣耀典藏版)
- 今日头条一个身份证可以注册几个头条号