Android 7.1新特性

一.应用快捷方式

应用快捷方式是指长按桌面图标可以弹出5个以内的快捷操作按钮。快捷方式分为两种一种是静态的,一种是动态的。

Static App Shortcuts:Resource

如果想要为应用添加该功能,比较简单的方法是使用一个静态的快捷方式。我们仅需要在manifest文件中添加相对应的元素去定义即可:

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    <shortcut
      android:shortcutId="compose"
      android:enabled="true"
      android:icon="@drawable/compose_icon"
      android:shortcutShortLabel="@string/compose_shortcut_short_label1"
      android:shortcutLongLabel="@string/compose_shortcut_long_label1"
      android:shortcutDisabledMessage="@string/compose_disabled_message1">
      <intent
        android:action="android.intent.action.VIEW"
        android:targetPackage="com.example.myapplication"
        android:tatgetClass="com.example.myapplication.ComposeActivity"/>
          <gories android:name="android.shortcut.conversation"/>
      </intent>
    </shortcut>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="com.example.myapplication">
     <application...>
       <activity android:name="Main">
         <intent-filter>
           <action android:name="android.intent.action.MAIN"/>
           <category android:name="android.intent.category.LAUNCHER"/>
         </intent-filter>
         <meta data android:name="android.app.shortcuts"
                    android:resource="@xml/shortcuts"/>
       </activity>
    </application>
 </manifest>

需要注意的是上面的DisabledMessage属性,这个是容易忽略的。因为这个快捷方式指向是应用中某一个具体的Activity或Intent,所以希望大家在开发的时候,如果它的功能发生变化,能够提供一个用户提示。

Dynamic App Shortcuts

稍微复杂些是下面的创建动态快捷方式。

ShortcutInfo shortcut = new ShortcutInfo.Builder(this,shortcutId).setShortLabel("Tristan")
                          .setLongLabel("Tristan Jones").setDisabledMessage("Contact Removed")
                          .setIcon(Icon.createWithBitmap(tristanPic).setIntent(new Intent(this, ComposeActivity.class)).setAction(Intent.ACTION_VIEW)).build();
  Shortcutmanager shortcutManager = getSystemService(ShortcutManager.class);
  shortcutManager.setDynamicShortcuts(Arrays.asList(shortcut));

从代码看上去,两者配置之间好像差不多。但是动态的快捷方式有很多限制。比如你的应用恢复状态以后,对于动态快捷方式有两种不同方式的处理。一种是你没有把它存储到桌面上,那么即使应用恢复,快捷方式也不再有;对于那些存储在桌面的动态快捷方式,应用恢复后是可以继续有的,但是系统并不能给予一个最新的状态。所以在程序中需要进行处理:

if(shortcutManager.getDynamicShortcuts().size() == 0){
      // Application restored. Need to re-publish dynamic shortcuts.
      if(shortcutManager.getpinnedShortcuts().size() > 0){
        //Pinned shortcuts have been restored.Use
        // updateShortcuts(List) to make sure they 
        // contain up_to_date information.
      }
  }

应用快捷方式-需要考虑的问题

  • Updates are rate-limited for background applications

    • setDynamicShortcuts, addDynamicShortcuts, updateShortcuts
    • Functions return false when rate-limited.
    • Rate limiting resets when app returns to foreground.
  • Make sure to call reportShortcutUsed

    • Whenever the underlying functionality is used
    • System uses this to order shortcuts.

二.圆形图标

在N中,不仅支持方形图标,也支持圆形图标。

android:icon="@mipmap/ic_launcher"
  android:roundIcon="@mipmap/ic_launcher_round"

在Android Studio中可以创建圆形图标。

三.增强壁纸的元数据

对于壁纸应用可以添加更多的版权信息,用于版权保护

<wallpaper
      android:showMetadataInPreview="true"
      android:contextUri="@string/wallpaper_context_uri"
      android:contextDescription="@string/wallpaper_context"/>

四.图片键盘支持

原生的EditText支持发图片

  • New CommitContent API added in N MR1 allows keyboards to send images and other rich content into text fields.
  • MIME-based: Declare what media types your application accepts (image/png,image/gif,image/jpeg,etc)
  • Open API :Third party developers can develop custom keyboards.

向后兼容。

private EditText createEditTextWithContentMimeTypes(final String[] mimeTypes){
    EditText editText = new EditText(this){
        @override
        public InputConnection onCreateInputConnection(EditorInfo editorInfo){
          final InputConnection ic = super.onCreateInputConnection(editorInfo);
          EditorInfoCompat.setConTentMimeTypes(editorInfo, mimeTypes);
          final InputConnectionCompat.OnCommitContentListener callback = new 
                InputConnectionCompat.OnCommitContentListener(){
                int flags, Bundle opts){
                  //...
                };
          return InputConnectionCompat.createWrapper(ic, editorInfo, callback);
        }
    };
    return exitText;
  }

首先需要定义一个不一样的文件类型,之后就可以接受非文字以外的事物,之后再得到一些权限后,我们就可以把图片输入到输入框里面:

@override
    public boolean oncommitContent(InputContentInfoCompat inputContentInfo, int flags, Bundle opts){
      if((flag & InputContentInfoCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0){
        try{
          inputContentInfo.requestPermission();
        }catch(Exception e){
          Log.e(TAG,"InputContentInfoCompat#requestPermission() failed.", e);
          return false;
        }
      }

      //Render image asynchronously
      Uri uri = inputContentInfo.getContentUri();
      renderImage(uri);

      //Public link for sending off-device
      Uri publicUri = inputContentInfo.getLinkUri();
      return true;
    }

五.管理 Storage Intent

用于应用去引导用户去处理释放没有用存储空间。

Intent intent  = new Intent(Storagemanager.ACTION.MANAGE_STORAGE);
    startActivity(intent);

六.Demo User

在应用处于内测或者公测阶段,可以将一些新的特性,以视频剪辑或gif动图的形式向用户展现。

userManager.isDemoUser();

results matching ""

    No results matching ""