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