AndroidStudyDemo之Android6.x新API介绍(二)

Android6.x新API介绍(二)

作者:李旺成

时间:2016年4月20日


接上篇:AndroidStudyDemo之Android6.x新API介绍(一)

五、 Text Selection

先看下效果:

TextSelection 示例

简介

Android 6.x 提供了 Text Selection,在选择文本后,可以显示一个浮动工具栏,一般可以提供剪切、拷贝、粘贴等操作,这个 TextSelection 的交互过程和实现 与 contextual action bar 的实现一样。

注意:
如果使用的是 Android Support Library revision 22.2,需要注意浮动工具栏不向后兼容且因为 appcompat 默认接管 ActionMode 对象,阻止了浮动工具栏被显示。为了在 AppCompatActivity 中支持 ActionMode,需要调用getDelegate()方法,之后对返回的 AppCompatDelegate 对象调用setHandleNativeActionModesEnabled() 方法,并设置输入参数为 false,该调用将ActionMode对象的控制交还给系统框架层。在 Android6.0(API level 23) 的设备上,框架层支持 ActionBar 或浮动工具栏模式,在 Android 5.1(API level 22) 及以下的设备上,只支持 ActionBar 模式。

简单使用

演示代码很简单,直接看代码:

@TargetApi(23)
private void initData() {
    mCallback2 = new ActionMode.Callback2() {
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            MenuInflater inflater = mode.getMenuInflater();
            if (inflater == null) {
                return false;
            }
            inflater.inflate(R.menu.actionmode_menu, menu);
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            Toast.makeText(TextSelectionActivity.this, item.getTitle(), Toast.LENGTH_LONG).show();
            mode.finish();
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {

        }

        // 控制浮动菜单的位置
        @Override
        public void onGetContentRect(ActionMode mode, View view, Rect outRect) {
            super.onGetContentRect(mode, view, outRect);
        }

    };
    this.mTestTV.setCustomSelectionActionModeCallback(mCallback2);
}

注意事项

实现选择文字后的浮动工具栏,在app代码中需要做如下修改:

  1. 在View 或 Activity对象
    ActionMode的调用从startActionMode(Callback) 变为 startActionMode(Callback, ActionMode.TYPE_FLOATING)
  2. 替换原有的ActionMode.Callback为ActionMode.Callback2
  3. 重写OnGetContentRect()方法,提供内容Rect对象(文本选择的矩形框)在view中的位置
  4. 在矩形框作为唯一的元素不再有效时,调用invalidateContentRect() 方法

(参考自:值得你关注的Android6.0上的重要变化(一)

相机 API

先看 Demo 效果:

Camera TorchMode 演示

Android 6 提供了 setTorchMode() 方法来直接控制闪光灯,并且可以监听闪光灯的开光状态。这里演示一下闪关灯控制以及监听闪关灯状态,主要使用了 CameraManager 中的方法:

CameraManager 类

代码很简单,直接看代码:

public class CameraTestActivity extends AppCompatActivity {

    private Switch mTorchModeSwitch;
    private TextView mShowTorchModeTV;

    private CameraManager mCameraManager;
    private CameraManager.TorchCallback mTorchCallback;
    private String[] mCameraIdList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cameratest);

        initView();
        initData();
        initListener();

    }

    private void initView() {
        this.mTorchModeSwitch = (Switch) this.findViewById(R.id.switch_torchmode);
        this.mShowTorchModeTV = (TextView) this.findViewById(R.id.tv_showtorchmode);
    }

    @TargetApi(23)
    private void initData() {
        mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
        mTorchCallback = new CameraManager.TorchCallback() {
            @Override
            public void onTorchModeChanged(String cameraId, boolean enabled) {
                super.onTorchModeChanged(cameraId, enabled);
                mShowTorchModeTV.setText("Camera:" + cameraId + " TorchMode change :" + enabled);
            }

            @Override
            public void onTorchModeUnavailable(String cameraId) {
                super.onTorchModeUnavailable(cameraId);
            }
        };
        try {
            mCameraIdList = mCameraManager.getCameraIdList();
        } catch (CameraAccessException e) {
            mCameraIdList = null;
            e.printStackTrace();
        }
        // 注册回调监听
        mCameraManager.registerTorchCallback(mTorchCallback, new Handler());
    }

    private void initListener() {
        this.mTorchModeSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (mCameraIdList == null) return;
                changeTorchMode(isChecked);
            }
        });
    }

    @TargetApi(23)
    private void changeTorchMode(boolean isChecked) {
        try {
            mCameraManager.setTorchMode(mCameraIdList[0], isChecked);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }
    
    @TargetApi(23)
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mCameraManager.unregisterTorchCallback(mTorchCallback);
    }
}

支持主题化的 ColorStateLists

先看 Demo 的效果:

ColorStateList 使用演示

简介

使用 context.getColorStateList(int id) 可以获取当前主题对应的 ColorStateLists,使用 ColorStateList,就能为按钮的每个状态提供不同的颜色。

ColorStateList 并不是个新东西,看官方介绍:

ColorStateList 类

文档中说 ColorStateList 是从 xml 创建的,在 Resources 类中提供了如下方法:

@Deprecated
getColorStateList(@ColorRes int id)

getColorStateList(@ColorRes int id, @Nullable Theme theme)

Android 6 在 Context 类中添加了 getColorStateList() 方法:

public final ColorStateList getColorStateList(int id) {
    return getResources().getColorStateList(id, getTheme());
}

其实还是调的 Resources 中的相关方法。

简单使用

使用很简单,直接看代码:

@TargetApi(23)
private void testGetColorStateList() {
    ColorStateList csl = getColorStateList(R.color.text_selector1);
    if (csl != null) {
        mTestBtn.setTextColor(csl);
    }

    Resources resources = getResources();
    ColorStateList csl2 = resources.getColorStateList(R.color.text_selector2);
    if (csl2 != null) {
        mTestBtn2.setTextColor(csl2);
    }
}

App Linking

简介

这是一个把 APP 和网页直接打通的技术,能够让 APP 能够直接来处理你的网站普通的 URL 链接,来展示你对应的网站内容。这绝对是一个值得关注的改进,Web 和 APP 之间缝隙将越来越小。这对既有网站又有 APP 的应用来说非常有利,例如知乎和淘宝等。

有点类似于之前的 APP 的 Deep link,可以通过特殊的Schema也可以让 APP 直接打开对应的内容。APP Linking 的特点是,只要使用传统的 URL 就可以,而且是根据 URL 的域名对应特定的 APP 的。

开发者需要做的是在AndroidManifest.xml做一下对应的声明即可。如果需要让系统默认用你的 APP 打开对应的 URL 的话,还需要网站配合提供assetlinks.json。详情可以参考这里
(参考自:Android 6.0 中的新技术总结

简单使用

鉴于手头的资源不够,没有服务器上传 web-app关联文(statements.json),所以这里就不做实验了。

有几篇文章我认为讲解得挺详细了,有兴趣的建议去看看:
Android M 的"App Links"实现详解
Android M DeepLinks AppLinks 详解
Android M App Links: 实现, 缺陷以及解决办法

其他

还有很多新 API 以及改动的 API 没有介绍,这里也不打算介绍了。前后两篇文章挑了 Android 6.x 中新提供的几个比较重要和我感兴趣的 API,简单的做了个 Demo。

虽然,不打算继续介绍其余的新 API,这里做个简单的记录,以后用到了再去详细了解:

  • 指纹解锁:FingerprintManager
  • 支持蓝牙触控笔
  • 新的省电模式:Doze 和 App Standby
  • APP 数据自动备份
  • 通知(Notifications):移除了Notification.setLatestEventInfo()
  • AudioManager Changes:setStreamSolo()方法过时和setStreamMute()方法过时
  • Browser Bookmark Changes:移除了全局书签的支持、Browser.getAllBookmarks()移除、Browser.saveBookmark()移除、READ_HISTORY_BOOKMARKS权限移除、WRITE_HISTORY_BOOKMARKS权限移除
  • Android KeyStore变化:Android Keystore provider 不再支持DSA,仍旧支持ECDSA
  • Wi-If和网络变化:只能修改你自己创建的WifiConfiguration对象的状态,添加 multinetwork APIs
  • 相机服务变化:改为基于优先级的访问方式
  • 企业Android的变化
  • 数据流量统计(Data Usage)
  • 全局设置变化:不再能通过setGlobalSettings()来设置,现在能通过setGlobalSettings()来设置
  • Runtime:可以恰当的实现newInstance()的访问规则

小结

关于 Android 6.x 的新 API 介绍就到这里了,下一篇开始介绍 Android 6.x 的新控件。
未完待续...

项目地址

GitHub

附件

Andoid6思维导图

揭秘Android 6.0之Text Selection
值得你关注的Android6.0上的重要变化(一)
Android M新特性Doze and App Standby模式详解
Android学习 之 ColorStateList按钮文字变色
Android ColorStateList使用方法
Android 6.0 中的新技术总结
Android M 的"App Links"实现详解
Android M App Links: 实现, 缺陷以及解决办法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,451评论 25 707
  • 作者:李旺成 时间:2016年4月19日 接上篇:AndroidStudyDemo之Android5.x新控件介绍...
    diygreen阅读 3,040评论 5 56
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • 「 我还在努力,你千万不要喜欢其他人 」 料想我并非善男信女,委屈自己从来也都有一个特定情景才能忍的理所当然,否则...
    岚枫紫诺阅读 428评论 0 1
  • 老陈跟老莫当年是相亲认识的,闪婚。 28年过去了,每次说起这个相亲,老陈跟老莫依然能互怼半天,我们几兄妹在一旁围观...
    nage南墙阅读 374评论 0 0