欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

2020-09-26《Android进阶之光》第一章Android新特性

程序员文章站 2022-04-02 21:16:58
Android第1章 Android新特性1-1 Android5.0新特性1-1-1主要新特性概述1-1-2 替代ListView和GridView的Recyclerview1-1-3 CardView1-1-3 Notification1-1-4 ToolBar1-2 Android6.0新特性1-2-1主要新特性概述1-2-2 运行时权限机制1-3Android7.0新特性1-3-1 主要新特性概述1-3-2 多窗口模式拓展1-1 安卓8.0新特性第1章 Android新特性1-1 Android...

第1章 Android新特性

1-1 Android5.0新特性

1-1-1主要新特性概述

1、全新的Material Design设计风格

2、支持多种设备
手机、手表、平板、笔记本电脑等等

3、全新的通知中心设计
优先显示重要的信息,将不太紧急的信息隐藏。

4、支持64位ART虚拟机
放弃了之前一直使用的dalvik虚拟机,而改用ART虚拟机,实现真正的跨平台编译,在ARM、X86、MIPS中无处不在。

5、多任务视图窗口(Overview)
在界面中,每一个APP都是一个独立的卡片,拥有立体式的层叠效果。

6、设备识别解锁
当特定的智能设备出现在Android设备附近时,可以直接绕过锁屏界面进行操作。换句话说也就是当设备没有检测到附近有可用的信任设备时,就会开启安全模式以防止未授权访问。

7、OK google

8、Face Unlock

1-1-2 替代ListView和GridView的Recyclerview

1、有了ListView和GridView为什么还要用Recyclerview?
从整体上看,Recyclerview的架构采用了插拔式的体验,具有高度解耦,高灵活度和更高的效率的特点。通过设置提供的不同LayoutManager、ItemDecoration、ItemAnimator可以实现丰富多样的效果。但Recycelrview也有缺点,比如设置列表的分割线时需要自定义分割线,需要自己实现点击事件等。

2、RecyclerView的使用

基本思路是在onCreateViewHolder中加载条目布局,在onBindViewHolder中将视图与数据进行绑定。

使用基本上可以分为两步:

1、设置LayoutManager布局管理器。
通过设置不同的LayoutManager,可以实现不同的布局方式如LinearLayoutManager(横向纵向线性布局)、StaggerGridLayoutManager(瀑布流)等等。

		//第1步 设置布局管理器
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        //设置方向
        //layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recyclerView.setLayoutManager(layoutManager);

2、设置Adapter适配器

		//第2步 设置适配器
        MyAdapter myAdapter = new MyAdapter(mList, this);
        recyclerView.setAdapter(myAdapter);
private static class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{

        private List<String> mList;
        private Context mContext;

        public MyAdapter(List<String> mList, Context mContext) {
            this.mList = mList;
            this.mContext = mContext;
        }

        @NonNull
        @Override
        public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(mContext).inflate(R.layout.holder_recyclerview,parent,false);
            return new MyViewHolder(view);
        }

        @Override
        public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
            holder.item_tv.setText(mList.get(position));
        }

        @Override
        public int getItemCount() {
            return mList.size();
        }

        //自定义的ViewHolder,持有每个Item的的所有界面元素
        public static class MyViewHolder extends RecyclerView.ViewHolder {
            public TextView item_tv;
            public MyViewHolder(View view){
                super(view);
                item_tv = (TextView)view.findViewById(R.id.id_holder_recyclerview_text);
            }
        }
    }

3、设置点击事件
在Adapter中设置接口用接口回调的方式实现点击事件

public interface OnItemClickListener{
            void onItemClick(View view, int position);
            void onItemLongClick(View view, int position);
        }
public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
            holder.item_tv.setText(mList.get(position));
            if(mOnItemClickListener!=null){
                holder.item_tv.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mOnItemClickListener.onItemClick(holder.item_tv,position);
                    }
                });
                holder.item_tv.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        mOnItemClickListener.onItemLongClick(holder.item_tv,position);
                        return true;
                    }
                });
            }
        }
myAdapter.setmOnItemClickListener(new MyAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Toast.makeText(RecyclerViewActivity.this,"点击第"+ position +"条数据",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onItemLongClick(View view, int position) {
                Toast.makeText(RecyclerViewActivity.this,"长按第"+ position +"条数据",Toast.LENGTH_SHORT).show();
            }
        });

1-1-3 CardView

1、CardView也就是卡片View,继承自FrameLayout类,所以可以内嵌子布局,可以设置圆角和阴影以实现立体效果。

2、常用属性
app:cardCornerRadius 圆角
app:cardElevation 阴影
app:cardBackgroundColor 背景颜色

1-1-3 Notification

Notification赋予我们在状态栏、锁屏界面和下拉框中显示信息的能力
1、普通Notification

Notification.Builder builder = new Notification.Builder(NotificationActivity.this);
                builder.setSmallIcon(R.drawable.ic_launcher_foreground); //小图标
                builder.setLargeIcon(BitmapFactory.decodeResource(NotificationActivity.this.getResources(),R.drawable.ic_launcher_background));
                builder.setAutoCancel(true); 
                builder.setContentTitle("普通Notification标题");
                builder.setContentText("普通Notification内容");
                //判断是否是8.0上设备
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    NotificationChannel mChannel = new NotificationChannel("id", "name", NotificationManager.IMPORTANCE_HIGH);
                    mChannel.setDescription(description);
                    mChannel.enableLights(true); //是否在桌面icon右上角展示小红点
                    manager.createNotificationChannel(mChannel);

                    builder.setChannelId(id);
                }
                manager.notify(1,builder.build());

2、折叠式Notification
折叠式Notification是一种自定义视图的Notification,用来显示长文本和一些自定义的布局场景。有两种状态:一种是普通状态下的视图,和普通Notification的视图样式一致,另一种是展开状态下的视图。也就是我们自定义的视图。这个视图显示的进程和我们创建视图的进程不在同一个进程,所以我们需要使用RemoteView。

第一步:使用RemoteViews创建自定义视图

                RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.view_notification);

第二步:设置customBigContentView,需要注意的是这里需要判断安卓sdk>24

//判断sdk>24
                if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
                    builder.setCustomBigContentView(remoteViews);
                }

其余地方与普通Notification使用一致。

1-1-4 ToolBar

toolbar的基本使用

1-2 Android6.0新特性

1-2-1主要新特性概述

1、应用权限管理
应用许可提示可以自定义了。允许对应用的权限进行高度管理,比如应用能否使用位置、相机、网络、通讯录等,这些都开放给开发者和用户,此前的Android系统的应用权限管理只能靠第三方应用来实现,在Android6.0以后应用权限管理成为系统级的功能。

2、Android Pay
Android Pay是Android支付统一标准,特性是简洁、安全和可选性。它是一个开放性平台,用户可以选择谷歌的服务或者是银行的APP来使用它。

3、指纹支持
谷歌提供的指纹识别支持,旨在统一指纹识别的技术方案。

4、Doze电量管理
6.0自带Doze电量管理功能。手机静止不动一段时间后,会进入Doze电量管理模式。谷歌说屏幕关闭时,平均续航时间可以提高30%。

5、APP Links
加强了软件间的关联,允许开发者将APP和他们的Web域名关联。比如邮箱收到一封邮件带有一个链接,点击这个链接就可以去到APP而不是网页。

6、Now on Tap

1-2-2 运行时权限机制

概述:在Android6.0以前,装APP的时候会列出安装的APP的访问权限,并且只有安装的时候会提示一次,一旦同意安装了这个APP之后,这个APP就可以在用户不知情的情况下访问权限里面的所有内容。在Android6.0时,将不会再安装的时候授予权限,取而代之的是APP不得不在运行时一个一个询问用户来授予权限,对于用户来说是好消息,但是对于开发者来说就是噩梦。因为开发者需要在每一个需要权限的地方检查权限,否则等待你的就是APP崩溃。

1、Normal Permissions和Dangerous Permissions

谷歌将权限分为两类:

一类是Normal Permissions,这类权限一般不涉及用户隐私,是无需用户进行授权的,比如手机震动,访问网络等。这些权限只需要在manifest里面简单声明就好,安装的时候就会自动进行授权。无需每次使用都检查权限,而且用户不能取消以上授权。

另一类是Dangerous Permissions,一般涉及用户隐私,需要用户进行授权,比如读取sd卡,访问通讯录等。

如果您的应用在其manifest清单中列出正常权限(即不会对用户隐私或设备操作造成很大风险的权限),系统会自动授予这些权限。如果您的应用在其清单中列出危险权限(即可能影响用户隐私或设备正常操作的权限),系统会要求用户明确授予这些权限。Android 发出权限请求的方式取决于系统版本:

如果设备运行的是Android 6.0(Marshmallow,API 23)或更高版本,并且应用的targetSdkVersion是23或更高版本,则应用将在运行时向用户请求权限(Runtime Permissions)。用户可随时撤销权限,因此应用每次运行时都应该检查自身是否具备所需的权限。

如果设备运行的是Android 5.1(LOLLIPOP_MR1,API 22)或更低版本,并且应用的targetSdkVersion是22或更低版本,则系统在用户安装应用时就要求用户授予权限。如果更新应用时又新增了权限,系统会在用户更新应用时要求授予该权限。用户一旦安装应用,他们撤销权限的唯一方式是卸载应用。

注意点: 危险权限是按分组进行授权,同一组的任何一个权限被授权后,同组内的其他权限也被自动授权。此外,对于申请时弹出的提示框上面的文字说明也是对一整个权限组的说明。

普通权限申请只需要在manifest里面声明即可:
2020-09-26《Android进阶之光》第一章Android新特性

危险权限申请不仅需要声明,还需要每次使用时动态检查是否有获取了权限。否则如果用户没有授权却使用了要授权的操作那app就会崩溃。

这里定义一个按钮点击调用call函数

	private void call(){
        //检查是否有授权
        if(ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED){
            //如果未授权,那就要申请权限
            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CALL_PHONE},REQUEST_CALL_PHONE);
        }else{
            callPhone();
        }
    }

在onRequestPermissionsResult中处理向用户申请权限的回调。

	@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode == REQUEST_CALL_PHONE){
            if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
                callPhone();
            }else{
                Toast.makeText(this,"您拒绝访问",Toast.LENGTH_SHORT).show();
            }
        }
    }

注意点:第一次申请如果拒绝后再次请求权限,这个请求的框框会多一个不再询问的按钮,如果用户选择不再询问并且拒绝。那这个权限就只有在设置中开启权限了,就不能继续动态申请了。

但是这样用户体验就不好了,所以谷歌提供了一个shouldShowRequestPermissionRationale方法来帮助开发者向用户解释为什么需要这个权限,如果用户选择了“不再询问”选项,那这个shouldShowRequestPermissionRationale就会返回false,这时我们可以进一步通过dialog或者别的途径来向提醒用户允许访问这个权限的重要性。

	@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode == REQUEST_CALL_PHONE){
            if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
                callPhone();
            }else{
                //用户选择了不再询问
                if(!ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CALL_PHONE)){
                    Toast.makeText(this,"这个功能真的很重要,如果要开启可以在设置中开启",Toast.LENGTH_LONG).show();
                }else{
                    Toast.makeText(this,"您拒绝访问",Toast.LENGTH_SHORT).show();
                }
            }
        }
    }

1-3Android7.0新特性

1-3-1 主要新特性概述

1、多窗口模式

2、Data Saver
Android 7.0引入了Data Saver模式,它是一种流量保护机制。启用Data Saver模式时,系统将拦截后台的数据使用,并且在可能的情况下减少前台运行应用使用的数据量,例如限制流媒体服务的码率,下调画质,以及减少缓存等。而通过白名单设置,用户可以让应用避免受到Data Saver模式的影响。

3、改进的Java 8语言支持
Android7.0可以支持Java 8语言平台,使得Android的Jack编译器有助于减少系统的冗余代码,降低占用和运行时间。开发者可以直接用Lambda表达式。
lambda表达式:(通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。)

4、自定义壁纸

5、快速回复
Android7.0支持通知栏直接回复的功能,例如收到短信或者来电可以直接在通知栏进行输入操作或者接听。这个功能不仅适用于即时通讯,还适用于社交应用。

6、后台省电
屏幕关闭后所有的后台进程都将会被系统限制活动,使这些应用不会在后台中持续唤醒,从而达到省电的目的。此外,Project Svelte功能也在持续地改善,这最大限度地减少了Android设备中系统和应用所占用的内存。

7、快速设置

8、Unicode9支持和全新的emoji表情符号

9、Google Assistant

1-3-2 多窗口模式

1、多窗口模式生命周期
在应用进入多窗口模式时,activity的生命周期是
onPause
onStop
onDestroy
onCreate
onStart
onResume
onPause
所以应用的窗口是被销毁重建了的,并且最终停留在onPause中,直到用户点击窗口时,该Activity才会重新获取焦点进入onResume状态。

退出多窗口模式时,activity的生命周期又会怎样变化呢?
onStop
onDestroy
onCreate
onStart
onResume
onPause
onResume
注意点:比如我们在播放视频的时候进入了多窗口模式,这个视频应该继续播放才对,因此不可以在onPause方法中关闭视频,而应该在onStop中关闭视频,并且在onStart中恢复视频的播放。

2、禁用多窗口模式

<application
       ...
        android:resizeableActivity="false"
       ...
       >
       ...
</application>

**注意点:**如果targetSdkVersion的设置的值小于24,resizeableActivity属性不会起作用,面对这一情况,解决方案就是设置应用不支持横竖屏切换,比如设置为只支持竖屏

<activity
            android:name=".MainActivity"
            android:screenOrientation="portrait">

拓展

1-1 安卓8.0新特性

1-1-1 主要特性

1、TensorFlow Lite
TensorFlow Lite是谷歌机器学习工具TensorFlow的精简版,新工具可帮助低功耗设备跟上当今高强度任务处理,利用新的神经网络API帮助底层芯片加速数据处理。这一功能有助于为下一代在线设备提高语音处理,视觉搜索,增强现实等能力。
2、画中画
支持将屏幕缩小成悬浮窗口。
3、Notification Dots
应用图标上的通知提示圆点
4、自动填写(Auto-Fill)
5、智能文本选择(Smart Text Selection)
使用谷歌的机器学习算法,决定何时应选择何种文本
6、Google Play Protect
杀毒相关
7、系统/应用启动程序加速
谷歌对应用启动的进程进行了优化,包括并发进程、压缩收集的垃圾信息和代码区域等。此外还有针对后台服务的限制,防止应用程序在后台运行太久。目标是大大减少电池消耗。
8、Play Console Dashboard
一个新的开发工具,可提供对应用在设备上使用情况的分析。
9、WiFi感知功能
WiFi感知可让您的Android O设备或应用通过Wi-Fi和附近的其他设备或应用进行通讯,无需实际的互联网连接。

1-2 安卓9.0新特性

1-2-1 主要特性

1、自适应电池
6.0电池优化的升级版,默认情况下开启。

2、黑暗模式

3、优化的应用程序操作
类似于你可以通过长时间按下图标来调用应用程序的快捷方式,但考虑到它是谷歌启动程序,它可以为你的手机提供一些建议,因此完全不同。
例如,当你把耳机连接到你的手机时,你的手机会显示你最近的播放列表。或者会建议你打个电话给你妈妈,让她在这周内来看你。

4、应用定时器
设置应用程序的时间限制

5、自适应亮度
更智能的自动亮度调节方案。

6、辅助功能菜单
在Settings> Accessibility > Accessibility Menu中你可以激活新的辅助功能菜单,该菜单会启用一个图标,您可以点按该图标以执行快速设置,设置最近的应用和音量等操作。

7、更轻松的文本选择
由于在选择模式中改进了的、响应更快的把手,选择与文本交互变得更加容易。

8、新截图快捷方式
告别默认的Power+ Volume Down按钮组合,现在通过点击Power菜单中的图标可以随时获取屏幕截图。

9、一个新的Home按钮
主按钮现在有一个更酷的图标,形状是水平对齐的药丸。这是Android有过的最酷的Home按钮。

10、新的手势导航
1.通过点击新的药丸形状的Home键回到主页
2.通过向上滑动主页按钮两次打开您的应用程序抽屉
3.要查看最近的应用程序,请向上滑动Home按钮
4.在这里,您可以与应用程序交互来选择和复制文本
5.向上滑动以清除列表
6.按住应用程序的图标来实现分屏
7.要打开一个应用程序,向右滑动,按住Home键在应用程序之间滚动,然后就会打开中间的那个
8.如果要切换到以前的应用程序,请快速向右滑动并释放
9.按住Home键可以打开谷歌助手
10.如果你可以在任何应用程序中回到上一个屏幕,后退按钮就会出现

11、更容易的屏幕旋转
在此之前,您只能使用自动旋转开关。现在,Android可以选择将屏幕旋转到横向模式,并在点击图标时回到纵向模式。

12、通知信息
在Settings> Apps & notifications > Notifications中,您可以看到最新的应用通知,以及最能向您发送令人分心的通知的应用。

13、仪表板

Android的仪表板显示显示你花了多少时间使用手机,并通过以下方式将使用数据细分为更全面的部分:
1.一个饼图,表示每天花在应用程序上的时间
2.您的通知总数
3.您每天在设备上花费的小时数
4.解锁设备的次数

14、通过Wi-FiRTT进行室内导航
AndroidPie支持RTT(Round-Trip-Time)(即IEEE802.11mc WiFi协议),使用户可以使用室内GPS风格的导航,可以在连购物中心和电影院这样的建筑中导航。

15、改进的DND模式
“请勿打扰”模式现在可以防止视觉中断,例如背景通知和频繁弹出窗口,您可以利用“Shush”模式完全消除手机的通知。
您需要做的就是将手机面朝下放置在任何表面上,DND将自动启用。

16、锁定模式
一个您可以从“电源”菜单切换的新选项:“锁定模式”,将禁用设备上的指纹解锁,你需要输入一个pin解锁你的设备。

如果一个不守规矩的人试图强迫你解锁你的设备,你可能会需要使用这个你自己决定。

17、改进的消息应用程序
您现在可以在消息应用程序中查看图像,并使用smartreply使用notificationshade来回复邮件。此外,Android还会通过分析收到的消息来快速做出反应。

18、所有应用都使用HTTPS
这是对Android安全用户的肯定。AndroidPie上的所有应用程序默认都使用HTTPS。Android关心您的隐私。

19、媒体面板

由于音量控制专用于振铃器音量,Android的媒体设置现在将在屏幕右侧垂直对齐的滑块中显示音量控制,并且同一媒体面板为连接到您的Android手机的所有设备显示不同的音量控制设置。

20、ART的改进
在不需要被告知的情况下,AndroidPie会对其AndroidRuntime进行重大更改,从而提高其效率和性能,从而为您提供愉快的用户体验。

21、157个新的Emojis表情
157是一个很大的数字,包括美洲驼、冷脸、热脸、芒果果、滑板等。谷歌严格遵守其Unicode标准,去掉了中性字符。

22、WindDown
WindDown是一项新功能,它可以在你选择的就寝时间自动打开夜灯和DND模式,让你更容易入睡。

23、多摄像头支持
使用AndroidPie,开发人员可以使用多摄像头API同时访问来自2个物理摄像头的流。只要您的手机使用双后置摄像头或双前置摄像头,您就可以开始使用了。

24、Wi-Fi MAC随机化
Wi-FiMAC随机化功能的工作原理是,每次连接到新的Wi-Fi网络时,都会为设备随机分配新的MAC地址。这是第9版Android隐私和安全功能的众多改进之一。

25、AndroidPie和其他功能
1.日历事件和天气信息显示在锁定屏幕上
2.Settings> Apps & notifications > Notifications来查看给你发送最多通知的应用
3.音量按钮仅调整媒体音量
4.一次最多可连接5个蓝牙设备
5.更清晰的表情符号字符
6.改进的文字放大镜
7.Notch支持
8.后台应用程序无法访问相机和麦克风

1-3 安卓10.0新特性

1-3-1 主要特性

1、存储范围变更
Android Q 改变了应用程序访问设备外部存储上文件的方式。 通过使用更细粒度的媒体特定权限替换以前的 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE权限。

2、外存中私有目录权限变更
Android Q 为每个应用程序提供了一个独立的在外部存储设备的存储沙箱,没有其他应用可以直接访问您应用的沙盒文件。由于文件是私有的,因此访问这些文件不再需要任何权限。

并且 Android Q 推荐了获取外部存储私有文件的最佳位置:即Context.getExternalFilesDir()返回的位置,因为此位置在所有Android版本中表现一致。使用此方法时,请传入与要创建或打开的文件类型对应的媒体环境。例如,要访问或保存app-private图像,请调用Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)。

3、公共媒体集合特性

定义公共媒体集合:Photos & Videos、Music、 Downloads。

APP 无需请求任何权限即可在这些共享集合中创建和修改自己的文件。

如果你的APP想创建和修改其他应用已创建的文件,则必须首先请求相应的权限:

访问Photos & Videos目录的其他应用程序文件 需要请求 READ_MEDIA_IMAGES 或 READ_MEDIA_VIDEO 权限,具体取决于您的应用程序需要访问的文件类型。

访问 Music 共享集合中的其他应用程序文件需要 READ_MEDIA_AUDIO 权限。

没有访问Downloads共享集合的权限,您的应用可以访问此集合中自己的文件。但是,要访问此集合中的其他应用程序文件,您必须允许用户使用系统的文件选择器应用程序选择文件。

5、访问共享集合
访问共享集合通过 MediaStore API ,如 MediaStore.Images、MediaStore.Video、MediaStore.Audio、MediaStore.Downloads。
需要注意的是:对于 Android Q 上新安装的应用,对 getExternalStoragePublicDirectory()的调用仅提供对应用已存储在其隔离存储沙箱中的文件的访问权限。要保持对其他应用程序文件的访问权限,请更新应用程序的逻辑以使用MediaStore。

6、新增 ACCESS_MEDIA_LOCATION 权限
一些照片在其数据中会包含位置信息,允许用户查看拍摄照片的位置。由于此位置信息是敏感的,因此我们想获取位置信息需要以下几步:

    1.将新的 ACCESS_MEDIA_LOCATION 权限添加到AndroidManifest。
    ​​​​​​​2.获取位置信息

photoUri = MediaStore.setRequireOriginal(photoUri);
InputStream stream = getContentResolver().openInputStream(photoUri);
//从流中读取位置信息

7、存储新特性兼容

target API 级别等于 Android Q 的应用,或者在运行Android Q 的设备上新安装的应用默认都会采取新的权限策略
如果你的APP同时满足以下两个条件,则会兼容以前的权限策略:

targetSdkVersion <= Android 9

你的应用安装在从 Android 9 升级到 Android Q 的设备上

识别特定的外部存储设备
Android Q 为每个外部存储设备提供唯一的卷名。

//获取卷名方式
Set volumeNames = MediaStore.getAllVolumeNames(context);
7,Activity后台活动限制

Android Q 对应用未经通知用户就启动进行了极大地限制,在Android Q上运行的应用只有在满足以下一个或多个条件时才能启动活动:

该APP具有可见窗口,例如有前台Activity

位于前台的另一个 APP 发送属于该应用程序的 PendingIntent。

系统发送属于该 APP 的PendingIntent,例如点击通知。

系统向应用程序发送广播,例如SECRET_CODE_ACTION。只有应用程序预期启动UI的特定广播才免除。

9、活动限制的兼容性

此行为更改适用于在 Android Q 上运行的所有应用,甚至是针对Android 9(API级别28)或更低级别的应用。但是,只要您的应用以用户互动的直接结果开始活动,您的应用很可能不会受到此更改的影响。实际上,大多数应用程序都不受此更改的影响。

此外,Android Q 建议我们 后台应用程序都应创建通知,以便向用户提供信息,而不是直接启动活动。

一些特殊情况如:来电或者警报,需要立刻启动 Activity,则可以通过创建高优先级的通知,并提供 fullscreen itent。如何创建高优先级通知?

10、设备位置权限的访问控制

用户可以更好地控制应用何时可以访问设备位置。当在Android Q上运行的应用程序请求位置访问时,会通过对话框的形式给用户进行授权提示。此对话框允许用户授予对两个不同范围的位置访问权限:在使用中(仅限前台)或始终(前台和后台)。

新增权限 ACCESS_BACKGROUND_LOCATION

如果你的应用针对 Android Q 并且需要在后台运行时访问用户的位置,则必须在应用的清单文件中声明新权限

11、位置限制的兼容性

如果您的应用在 Android Q 上运行但针对的是 Android 9(API级别28)或更低版本,则会出现以下行为:

如果你的应用为 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 声明 标记,则系统会在安装期间自动为ACCESS_BACKGROUND_LOCATION 添加 标记。

如果你的应用请求 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION,系统会自动将 ACCESS_BACKGROUND_LOCATION添加到请求中。

虽然你的应用可以请求并接收 ACCESS_BACKGROUND_LOCATION,但用户可以通过选择您的应用仅应在前台访问位置信息来撤消此权限。

12、允许应用程序降级。
当对商店更新后的版本后悔时,可以“回到过去”即回滚到旧版。

13、对数据和标识符的更改

影响在Android Q 上运行的所有应用的更改:

联系人亲缘关系​​​​​​​

    从Android Q开始,该平台不再跟踪联系人亲缘关系信息。因此,如果您的应用对用户的联系人进行搜索,则结果不再按交互频率排序。 “联系人提供程序”指南包含一个通知,说明自Android Q起所有设备上已废弃的特定字段和方法。

MAC地址随机化

    在Android Q 运行的设备默认传输随机的MAC 地址,获取随机MAC地址API:WifiConfiguration.getRandomizedMacAddress()

获取实际硬件MAC地址:WifiInfo.getFactoryMacAddress()。

唯一标识符

    应用必须具有 READ_PRIVILEGED_PHONE_STATE 特权权限才能访问设备的不可重置标识符,包括IMEI和序列号。原则上 Android Q 建议避免使用更容易关联到个人的硬件标识符,而是使用实例ID。实例ID的做法推荐

访问剪贴板数据

    除非您的应用程序是默认输入法编辑器或当前具有焦点的应用程序,否则您的应用程序无法访问剪贴板数据。

影响针对 Android Q API 级别运行的应用的更改:

访问USB串行需要用户许可

    如果您的应用针对Android Q,则您的应用只能在用户授予您访问USB设备或配件的应用权限后才能读取序列号。

相机和连接相关更改

    影响在Android Q 上运行的所有应用的更改:

访问相机信息需要获得许可

    Android Q更改了默认情况下getCameraCharacteristics()方法返回的信息的广度。特别是,您的应用必须具有CAMERA权限才能访问此方法的返回值中包含的潜在设备特定元数据。

启用和禁用Wi-Fi的限制

    在Android Q上运行的应用无法启用或停用Wi-Fi。 WifiManager.setWifiEnabled()方法始终返回false。 如果需要,请使用设置面板提示用户启用和禁用Wi-Fi。

1-4Android 11.0新特性

1-4-1隐私权

1、分区存储强制执行
Android 11,分区存储强制执行;但Android 10可将requestLegacyExternalStorage设为true以停用分区存储。

2、一次性权限
所有平台,可授予临时访问权限,包括位置、麦克风、摄像头。

3、自动重设权限
Android 11,用户与应用长时间没有互动时,如长时间工作在后台的应用,系统将自动重设敏感权限。

4、后台位置信息访问权限
Android 11,更改了用户向应用授予后台位置访问权限的方式。

5、软件包可见性
Android 11,更改了应用查询设备上其它应用及与之互动的方式,需要使用标签。

6、前台服务类型
Android 11,更改了前台服务访问摄像头数据、麦克风数据的方式,需要声明Service的类型为camera、microphone。

1-4-2新体验

1、设备控件
Android 11,ControlsProviderService可用于向连接的外部设备添加控件,显示于电源菜单中的设备控件下,用于控制设备。

2、媒体控件
Android 11,更新了媒体控件显示方式,显示于快捷设置旁,需要使用MediaSession和MediaRouter2。

3、屏幕
Android 11,更好地支持瀑布屏,即无边框的全面屏,使用DisplayCutout实现;以及可折叠设备和合页角度传感器,使用SensorEvent、DeviceState实现。

4、会话
Andriod 11,改进了会话处理方式;退出聊天气泡功能,旨在替代SYSTEM_ALERT_WINDOW。

5、5G图标显示
Android 11,提供了适用于不同运营商的各种5G图标显示解决方案,使用PhoneStateListener实现。

1-4-3 安全

1、生物识别身份验证机制更新
Android 11,改进了生物识别身份验证机制,引入了BiometricManager.Authenticators接口。

2、安全共享大型数据集
Android 11,允许使用共享数据blob在设备上缓存大型数据集。

1-4-4 性能和质量

1、无线调试
Android 11,支持通过adb从工作站以无线方式部署和调试应用,而无需通过USB实际连接设备。

2、ADB增量APK安装
增量APK安装可以安装足够的APK以启动应用,同时在后台流式传输剩余数据,使用v4签名。

3、使用原生内存分配器进行错误检测
GWP-ASan是一种原生内存分配器功能,可帮助查找释放后使用和堆缓冲区溢出错误。

4、Neural Networks API 1.3
Android 11,扩展并改进了NNAPI,包括新的运算方式、机器学习控件、Thermal API。

5、文本和输入
Android 11,改进了IME转换,可以控制IME动画或者其它系统栏的动画;更新了ICU库。

6、媒体
Android 11,新的MediaCodec API可让应用在分配输入和输出缓冲区时获得更多控制,以更高效地管理内存;增强了MediaCodec,针对游戏和其他实时应用支持低延时解码,但可能需要额外的资源,例如更高的功耗。已弃用OpenSL ES API,应改用Oboe。AAudio增加了AAudioStream_release函数用于释放音频流但不会关闭。比MediaExtractor更灵活的MediaParser,用于对媒体提取。另外,Cast和MediaRouter,还实现了新行为。

7、网络连接
Android 11,通过Passpoint,增强Wi-Fi功能,包括失效日期强制执行和通知,FQDN匹配,自签名的私人CA,允许使用具有相同FQDN的多个个人资料,允许安装没有根CA证书的个人资料,改进了家庭网络服务提供商和漫游服务提供商的匹配。 扩展了Wi-Fi Suggestion API,以提高应用的网络管理能力。更新了CallScreeningService,引入了GnssAntennaInfo支持GNSS,介于隐私,GNSS天线只能识别设备型号,而不能识别具体设备。

8、图形
Android 11,提供了FrameRate API,可让应用告知系统其预期帧速率,从而减少支持多个刷新率的设备上的抖动。NDK ImageDecoder提供了一种标准API,供Android C/C++应用直接解码图像。特定的显示屏可以执行图形后期处理,改善了图形质量,但可能会增加延时,支持HDMI 2.1的新款显示屏具有自动低延时模式,窗口也可以请求使用自动低延时模式。应用现在可以将外部图形层(GLES、Vulkan)加载到原生应用代码中,可以在不产生性能开销的前提下,提供与可调试应用相同的功能。可以使用ANGLE运行非核心应用以评估性能,并确定特定应用是否应使用ANGLE,而不是原生OpenGL ES驱动程序。ANGLE是Chrome组织中的一个项目,它使用Vulkan(而不是设备的供应商提供的原生ES驱动程序)来处理 OpenGL ES图形调用。

9、图片和相机
Android 11,在主动使用相机时,可以使用setCameraAudioRestriction以仅关闭振动、同时关闭声音和振动或都不关闭。ImageDecoder更好地支持包含多个帧的HEIF图片。改进了模拟器相机功能,如RAW捕获、并发相机等。

10、无障碍功能
Andriod 11,更新了面向无障碍服务的功能。

1-4-5 其它

1、应用进程退出原因
Android 11,引入了ActivityManager.getHistoricalProcessExitReasons()方法,用于报告近期任何进程终止的原因。

2、资源加载器
Android 11,引入了ResourcesLoader和ResourcesProvider,允许应用动态扩展资源的搜索和加载方式,两者协同作用,可以提供额外的资源,或修改现有资源的值。

3、APK签名方案v4
Android 11,添加了对APK签名方案v4的支持,支持ADB增量APK安装。

4、动态Intent过滤器
Android 11,引入了mimeGroup,支持动态Intent过滤器。

5、自动填充增强功能
Android 11,改进了自动填充服务。

本文地址:https://blog.csdn.net/RonnieDaddy/article/details/108811030

相关标签: android 安卓