Android高级第十一讲之不同系统间的区别


 本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!

Android系统不断的升级,从基础到中级再到高级,逐步升级是软件工程敏捷开发的一个重点,在每个版本中升级不同功能,以满足越来越丰富的用户需求,作为一名开发者,熟悉各个版本之间的异同,有助于做产品适配、安全等各方面业务。

2.3,加入陀螺仪等一些传感器支持和前后相机支持

3.0,加入Fragment支持

4.0,多核处理器优化,据说比3.0快1.8倍,支持HttpResponseCache

4.2,引入多用户支持

默认content provider是私有的

4.3,提供SELinux,防止应用把自身文件改成公共的,以免产生漏洞

4.4,提供访问多个外存设备的功能,虚拟机改为ART,好处在于:答案; 另外AlarmManager在低电耗时可以通过setWindow和众多定时事务一起发生,也可以通过setExact来在特定时间发生,而之前的setRepeating方法将不再准确;提供完善的打印框架,短信只有默认程序才可以读写信息; 之前版本的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,支持多dex的multidex出现

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

总结:虽然新的系统会让手机性能更佳,但默认也会给应用添加许多限制,比如4.4添加ART后对定时器的限制,6.0对文件写入sd卡的限制(即使用户把所有权限都给到你,那稍后默认又会收回你的部分权限)。新的系统对用户来说是更好的体验,对开发者来说是更多的工具,但同时也是新的挑战,所以Gradle中要慎重添加下面这句代码targetSdkVersion 24。

打包方面:正式包一定要加下面这句。

release {
    // 如果要支持最新版的系统 Android 7.0
    // 这一行必须加,否则安装时会提示没有签名
    // 作用是只使用旧版签名,禁用V2版签名模式
    v2SigningEnabled false
}

网上找了个系统对文件读取和存储的权限处理方法,可见系统对权限管理的敏感性。

对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了。
还是以调用系统相机拍照为例,我们需要将上述拍照代码修改为如下:

  
  
  
  
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 );

文/CrazyCodeBoy(简书作者)
原文链接:http://www.jianshu.com/p/56b9fb319310
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

N:敏感权限全部要App申请用户同意,大体分两类运行前申请和运行中申请两种;编辑框的文字可以定义除开复制、粘贴、全选这些功能;通知栏可以让用记回信息,点赞-支持快速回复;添加系统级电话黑名单;支持VR


谷歌官方博客:https://android-developers.googleblog.com/全英文

NDK开发:https://developer.android.com/ndk/guides/stable_apis.html

你可能感兴趣的:(Android高级第十一讲之不同系统间的区别)