6.0新特性

来源:互联网 发布:工程量计算稿软件 编辑:程序博客网 时间:2024/05/16 03:13

1. 新特性概述

为什么要适配?

  • 权限使用改动较大
  • 使用新的设计组件

新特性

  • 限制App访问权限
  • 删除了Apache HTTP client
  • 增加Android Pay付费功能。
  • 指纹识别,用于设备解锁及Android Pay
  • 新增Doze和App standby功能,省电
  • 支持USB Type C,可进行更快速的充电
  • 设计支持库,新的界面设计规范(design support library)

主要知识点:

  • 权限使用
  • 设计支持库的使用

2. 权限使用(最重要的新特性)

6.0之前的权限有什么问题:

  • 安装时授权过多,用户很少仔细检查每一项权限
  • 只能一次性的授权, 捆绑授权

危险权限
https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous
adb shell pm list permissions -d -g

过去:声明了什么权限,就有什么权限
现在:声明了权限,用户还是可以随时关闭,使用的时候需要实时检查用户是否授权

权限处理三步走:

  1. 检查是否有相关权限
  • 如果没有权限,就发起申请
  • 在一个回调函数里面处理申请结果

最佳实践:
https://developer.android.com/training/permissions/best-practices.html

  • 常用的权限在一启动的时候就申请
  • 不常用的延迟申请(在功能被用到的时候实时申请)
  • 向用户解释为什么需要这个权限.
  • 6.0开始,每一条权限都需要测试开关两种情况下是否都能正常运行
  • 用Intent启动其他应用来完成功能.
  • 实际场景:(联系人应用,日历,相机,分享)
  • 打开应用设置的对话框, 引导用户打开权限:
<code class="java" data-origin="" 
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);Uri uri = Uri.fromParts("package", getPackageName(), null);intent.setData(uri);startActivity(intent);

<code class="java" data-origin=""

使用easypermissions简化权限的处理:

  1. <code class="java" data-origin=""

    导入依赖

    <code class="java" data-origin="" 
    <code data-origin="" 
     compile 'pub.devrel:easypermissions:0.1.9'" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"> compile 'pub.devrel:easypermissions:0.1.9'
  2. <code class="java" data-origin=""

    <code data-origin="" 
    使用:

    <code class="java" data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    // 判断权限" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">// 判断权限EasyPermissions.hasPermissions(this, Manifest.permission.READ_CONTACTS));    // 请求权限:EasyPermissions.requestPermissions(this, "分享照片需要读写联系人的权限",    // 向用户说明权限 requestCode,            // 申请权限的请求码 Manifest.permission.READ_CONTACTS);    // 请求哪些权限 // 实现EasyPermissions.PermissionCallbacks接口

<code class="java" data-origin=""
<code data-origin="" 
<code data-origin="" 
3. 设计支持库(design support library) material design

<code class="java" data-origin=""

<code data-origin="" 
<code data-origin="" 
(android.support.design.widget)

  1. <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    ActonBar
  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    AppBar, Toolbar
  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    DrawerLayout, NavigationView
  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    TabLayout
  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    RecyclerView(support-v7), StaggeredGridLayoutManager
  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    ViewPager + RecyclerView
  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    TabLayout + ViewPager
  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    FloatingActionButton, SnackBar
  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    CollapsingToolbarLayout
  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    TextInputLayout

<code class="java" data-origin=""
<code data-origin="" 
<code data-origin="" 
3.1 ActionBar

<code class="java" data-origin=""

<code data-origin="" 
<code data-origin="" 
什么是ActionBar
如何使用ActionBar

  1. <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    引入appcomat-v7依赖
  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    使用主题Theme.AppCompat.Light.DarkActionBar
  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    使用AppCompatActivity,间接继承与FragmentActivity,可兼容到API7
  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    在onCreateOptionsMenu方法中创建menu,在onOptionsItemSelected方法中处理菜单点击事件
  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    ActionView, SearchView的使用
    <code data-origin="" 
          app:actionViewClass="android.support.v7.widget.SearchView"" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">      app:actionViewClass="android.support.v7.widget.SearchView"
    <code data-origin=""
    (要用app命名空间,否则SearchView不能被展开)

<code class="java" data-origin=""
<code data-origin="" 
<code data-origin="" 
<code data-origin="" 
3.2 toolbar

<code class="java" data-origin=""

<code data-origin="" 
<code data-origin="" 
<code data-origin="" 
为什么要用Toolbar替代Actionbar(更加灵活)
是一个导航 + 标题、副标题 + 任意自定义子View + 菜单的结合体
屏幕上下滚动的时候可以被折叠或者展开
如何使用:

  1. <code class="java" data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    android studio新建module时,activity选择blank activity,会自动生成toolbar
    依赖appcomat-v7,
    主题设置:app:popupTheme=”@style/ThemeOverlay.AppCompat.Light”
    背景:android:background=”?attr/colorPrimary”
    Activity继承AppCompatActivity

    <code class="java" data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
         Activity使用无Actionbar的theme: android:theme="@style/AppTheme.NoActionBar"" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">     Activity使用无Actionbar的theme: android:theme="@style/AppTheme.NoActionBar"     使用android.support.v7.widget.Toolbar,不要使用android.widget.Toolbar,以兼容6.0之前的代码
  2. <code class="java" data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    在Activity的onCreate方法中调用setSupportActionBar(toolbar);

  3. <code class="java" data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    创建菜单同ActionBar

  4. <code class="java" data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    创建导航按钮:

    <code class="java" data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
             actionBar.setDisplayHomeAsUpEnabled(true);" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">         actionBar.setDisplayHomeAsUpEnabled(true);         actionBar.setHomeAsUpIndicator(R.drawable.ic_menu);         //处理导航按钮点击事件:         onOptionsItemSelected() {             switch (menu.getItemId() {             case android.R.id.home:                 ...             }         }
  5. <code class="java" data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    DrawerLayout, NavigationView

  6. <code class="java" data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    xml配置
    <android.support.v4.widget.DrawerLayout

    <code class="java" data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
         android:layout_width="match_parent"" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">     android:layout_width="match_parent"     android:layout_height="match_parent"     android:fitsSystemWindows="true"     > <!-- 主界面作为第一个子元素--> <include layout="@layout/include_list_viewpager"/> <!-- NavigationView要作为第二个子元素 --> <android.support.design.widget.NavigationView         android:layout_width="190dp"         android:layout_height="match_parent"         android:layout_gravity="start"         app:headerLayout="@layout/drawer_header"         app:menu="@menu/drawer"         />

    1. <code class="java" data-origin=""

      <code data-origin="" 
      <code data-origin="" 
      <code data-origin="" 
      如何让NavigationView显示?
      mDrawerLayout.openDrawer(GravityCompat.START);

    2. <code class="java" data-origin=""

      <code data-origin="" 
      <code data-origin="" 
      <code data-origin="" 
      设置菜单响应:
      navigationView.setNavigationItemSelectedListener()

  7. <code class="java" data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    TabLayout
    tabs.addTab(tabs.newTab().setText(“第” + i + “页”), i);

  8. <code class="java" data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    RecyclerView是support-v7包中的新组件,是一个强大的条目显示组件,
    具备回收复用特性,比ListView性能更优,具备ListView,GridView,Gallery等功能于一身

    1. <code class="java" data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      <code data-origin="" 
      跟ListView一样,需要定义一个ViewHolder,一个Adapter (均是RecyclerView的子类)
      Adapter的使用跟ListAdapter或者ArrayAdapter一样,需要做两件事:
      1. 告诉RecyclerView,list item是如何创建的
      2. 告诉RecyclerView,数据是如何在list item上显示的
    2. <code class="java" data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      <code data-origin="" 
      定义list view里面每一个列表项的布局文件
    3. <code class="java" data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      <code data-origin="" 
      recyclerView.setAdapter();
      recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext()));
  9. <code class="java" data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    ViewPager + RecyclerView

  10. <code class="java" data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    TabLayout + ViewPager
    TabLayout上面的title是从哪里来的?需要在ViewPager里面定义
    tabs.setupWithViewPager(viewPager);

    <code class="java" data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    如何让Toolbar可收缩?

    <code class="java" data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
     toobar定义属性:            app:layout_scrollFlags="scroll|enterAlways"" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"> toobar定义属性:            app:layout_scrollFlags="scroll|enterAlways" view pager定义属性:        app:layout_behavior="@string/appbar_scrolling_view_behavior" />
  11. <code class="java" data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    FloatingActionButton, SnackBar

    <code class="java" data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
     app:layout_anchor="@id/appbar"" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"> app:layout_anchor="@id/appbar" app:layout_anchorGravity="bottom|right"

<code class="java" data-origin=""
<code data-origin="" 
<code data-origin="" 
<code data-origin="" 
FloatingActionButton

  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    作用 显示一个界面的最主要的动作

<code class="java" data-origin=""

<code data-origin="" 
<code data-origin="" 
<code data-origin="" 
| backgroundTint | | 背景的染色颜色
| backgroundTintMode | | 背景的染色模式
| fabSize | | 尺寸
| | normal | 正常
| | mini | 迷你

<code class="java" data-origin=""

<code data-origin="" 
<code data-origin="" 
<code data-origin="" 
Toast

<code class="java" data-origin=""
<code data-origin="" 
<code data-origin="" 
<code data-origin="" 
SnackBar

  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    作用 介于Toast和Dialog的一种提示信息,用户进行关键操作后可以反悔
  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    不同,不是浮出来的,而是挤出来的
  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    使用方法
  1. <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    显示 SnackBar.make(view, “提示文字”, SnackBar.LENGTH_SHORT).show();
  2. <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    可设置显示或隐藏的回调 setCallBack
  3. <code class="java" data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    可设置点击操作 setAction

  4. <code class="java" data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    CollapsingToolbarLayout

    <code class="java" data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    &lt;android.support.design.widget.CollapsingToolbarLayout" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"><android.support.design.widget.CollapsingToolbarLayout    app:layout_scrollFlags="scroll|exitUntilCollapsed"    android:fitsSystemWindows="true"    app:contentScrim="?attr/colorPrimary"    >    <ImageView        android:scaleType="centerCrop"        android:fitsSystemWindows="true"        app:layout_collapseMode="parallax"    <app:layout_collapseMode="parallax"    实现视差滚动,和app:contentScrim="?attr/colorPrimary"属性一起配合使用。    <android.support.v7.widget.Toolbar        android:id="@+id/toolbar"        android:layout_width="match_parent"        android:layout_height="?attr/actionBarSize"        app:popupTheme="@style/AppTheme.PopupOverlay"        app:layout_collapseMode="pin" />    app:layout_collapseMode="pin"来确保Toolbar在view折叠的时候仍然被固定在屏幕的顶部    toolbar收缩时显示title:    collapsingToolbar.setTitle("联系人详情");    此效果依赖于这个属性    <style name="Theme.DesignDemo" parent="Base.Theme.DesignDemo">    <item name="android:windowDrawsSystemBarBackgrounds">true</item>    <item name="android:statusBarColor">@android:color/transparent</item></style>

<code class="java" data-origin=""
<code data-origin="" 
<code data-origin="" 
<code data-origin="" 
TextInputLayout

  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    作用 包裹EditText,帮助显示Hint和输入字数统计
  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    使用
  1. <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    在xml中包裹EditText,一个TextInputLayout只能包裹一个Edittext
  2. <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    对TextInputLayout或EditText设置hint属性
  3. <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    <code data-origin="" 
    可在代码中对TextInputLayout设置counterEnable/ counterMaxLength

<code class="java" data-origin=""

<code data-origin="" 
<code data-origin="" 
<code data-origin="" 
需要设置样式:

<code class="java" data-origin="" 
<code data-origin="" 
<code data-origin="" 
<code data-origin="" 
<code data-origin="" 
&lt;item name="textColorError"&gt;@color/design_textinput_error_color_light&lt;/item&gt;" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"><item name="textColorError">@color/design_textinput_error_color_light</item>
<code class="java" data-origin=""
<code data-origin="" 
<code data-origin="" 
<code data-origin="" 
0 0
原创粉丝点击