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

Android6.x新API介紹(二)

作者:李旺成

時間:2016年4月20日


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

五帽衙、 Text Selection

先看下效果:

TextSelection 示例

簡介

Android 6.x 提供了 Text Selection,在選擇文本后七蜘,可以顯示一個浮動工具欄费彼,一般可以提供剪切瓣喊、拷貝癞埠、粘貼等操作鸽粉,這個 TextSelection 的交互過程和實現(xiàn) 與 contextual action bar 的實現(xiàn)一樣斜脂。

注意:
如果使用的是 Android Support Library revision 22.2,需要注意浮動工具欄不向后兼容且因為 appcompat 默認接管 ActionMode 對象触机,阻止了浮動工具欄被顯示帚戳。為了在 AppCompatActivity 中支持 ActionMode,需要調(diào)用getDelegate()方法儡首,之后對返回的 AppCompatDelegate 對象調(diào)用setHandleNativeActionModesEnabled() 方法片任,并設(shè)置輸入?yún)?shù)為 false,該調(diào)用將ActionMode對象的控制交還給系統(tǒng)框架層蔬胯。在 Android6.0(API level 23) 的設(shè)備上蚂踊,框架層支持 ActionBar 或浮動工具欄模式,在 Android 5.1(API level 22) 及以下的設(shè)備上笔宿,只支持 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);
}

注意事項

實現(xiàn)選擇文字后的浮動工具欄泼橘,在app代碼中需要做如下修改:

  1. 在View 或 Activity對象
    ActionMode的調(diào)用從startActionMode(Callback) 變?yōu)?startActionMode(Callback, ActionMode.TYPE_FLOATING)
  2. 替換原有的ActionMode.Callback為ActionMode.Callback2
  3. 重寫OnGetContentRect()方法涝动,提供內(nèi)容Rect對象(文本選擇的矩形框)在view中的位置
  4. 在矩形框作為唯一的元素不再有效時,調(diào)用invalidateContentRect() 方法

(參考自:值得你關(guān)注的Android6.0上的重要變化(一)

相機 API

先看 Demo 效果:

Camera TorchMode 演示

Android 6 提供了 setTorchMode() 方法來直接控制閃光燈炬灭,并且可以監(jiān)聽閃光燈的開光狀態(tài)醋粟。這里演示一下閃關(guān)燈控制以及監(jiān)聽閃關(guān)燈狀態(tài),主要使用了 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();
        }
        // 注冊回調(diào)監(jiān)聽
        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) 可以獲取當(dāng)前主題對應(yīng)的 ColorStateLists米愿,使用 ColorStateList,就能為按鈕的每個狀態(tài)提供不同的顏色鼻吮。

ColorStateList 并不是個新東西育苟,看官方介紹:

ColorStateList 類

文檔中說 ColorStateList 是從 xml 創(chuàng)建的,在 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());
}

其實還是調(diào)的 Resources 中的相關(guān)方法椎木。

簡單使用

使用很簡單违柏,直接看代碼:

@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 和網(wǎng)頁直接打通的技術(shù)博烂,能夠讓 APP 能夠直接來處理你的網(wǎng)站普通的 URL 鏈接,來展示你對應(yīng)的網(wǎng)站內(nèi)容漱竖。這絕對是一個值得關(guān)注的改進禽篱,Web 和 APP 之間縫隙將越來越小。這對既有網(wǎng)站又有 APP 的應(yīng)用來說非常有利馍惹,例如知乎和淘寶等躺率。

有點類似于之前的 APP 的 Deep link,可以通過特殊的Schema也可以讓 APP 直接打開對應(yīng)的內(nèi)容万矾。APP Linking 的特點是肥照,只要使用傳統(tǒng)的 URL 就可以,而且是根據(jù) URL 的域名對應(yīng)特定的 APP 的勤众。

開發(fā)者需要做的是在AndroidManifest.xml做一下對應(yīng)的聲明即可舆绎。如果需要讓系統(tǒng)默認用你的 APP 打開對應(yīng)的 URL 的話,還需要網(wǎng)站配合提供assetlinks.json们颜。詳情可以參考這里吕朵。
(參考自:Android 6.0 中的新技術(shù)總結(jié)

簡單使用

鑒于手頭的資源不夠,沒有服務(wù)器上傳 web-app關(guān)聯(lián)文(statements.json)窥突,所以這里就不做實驗了努溃。

有幾篇文章我認為講解得挺詳細了,有興趣的建議去看看:
Android M 的"App Links"實現(xiàn)詳解
Android M DeepLinks AppLinks 詳解
Android M App Links: 實現(xiàn), 缺陷以及解決辦法

其他

還有很多新 API 以及改動的 API 沒有介紹阻问,這里也不打算介紹了梧税。前后兩篇文章挑了 Android 6.x 中新提供的幾個比較重要和我感興趣的 API,簡單的做了個 Demo称近。

雖然第队,不打算繼續(xù)介紹其余的新 API,這里做個簡單的記錄刨秆,以后用到了再去詳細了解:

  • 指紋解鎖:FingerprintManager
  • 支持藍牙觸控筆
  • 新的省電模式:Doze 和 App Standby
  • APP 數(shù)據(jù)自動備份
  • 通知(Notifications):移除了Notification.setLatestEventInfo()
  • AudioManager Changes:setStreamSolo()方法過時和setStreamMute()方法過時
  • Browser Bookmark Changes:移除了全局書簽的支持凳谦、Browser.getAllBookmarks()移除、Browser.saveBookmark()移除衡未、READ_HISTORY_BOOKMARKS權(quán)限移除尸执、WRITE_HISTORY_BOOKMARKS權(quán)限移除
  • Android KeyStore變化:Android Keystore provider 不再支持DSA,仍舊支持ECDSA
  • Wi-If和網(wǎng)絡(luò)變化:只能修改你自己創(chuàng)建的WifiConfiguration對象的狀態(tài)缓醋,添加 multinetwork APIs
  • 相機服務(wù)變化:改為基于優(yōu)先級的訪問方式
  • 企業(yè)Android的變化
  • 數(shù)據(jù)流量統(tǒng)計(Data Usage)
  • 全局設(shè)置變化:不再能通過setGlobalSettings()來設(shè)置如失,現(xiàn)在能通過setGlobalSettings()來設(shè)置
  • Runtime:可以恰當(dāng)?shù)膶崿F(xiàn)newInstance()的訪問規(guī)則

小結(jié)

關(guān)于 Android 6.x 的新 API 介紹就到這里了,下一篇開始介紹 Android 6.x 的新控件送粱。
未完待續(xù)...

項目地址

GitHub

附件

Andoid6思維導(dǎo)圖

揭秘Android 6.0之Text Selection
值得你關(guān)注的Android6.0上的重要變化(一)
Android M新特性Doze and App Standby模式詳解
Android學(xué)習(xí) 之 ColorStateList按鈕文字變色
Android ColorStateList使用方法
Android 6.0 中的新技術(shù)總結(jié)
Android M 的"App Links"實現(xiàn)詳解
Android M App Links: 實現(xiàn), 缺陷以及解決辦法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末褪贵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子葫督,更是在濱河造成了極大的恐慌竭鞍,老刑警劉巖板惑,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橄镜,死亡現(xiàn)場離奇詭異偎快,居然都是意外死亡,警方通過查閱死者的電腦和手機洽胶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門晒夹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人姊氓,你說我怎么就攤上這事丐怯。” “怎么了翔横?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵读跷,是天一觀的道長。 經(jīng)常有香客問我禾唁,道長效览,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任荡短,我火速辦了婚禮丐枉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掘托。我一直安慰自己瘦锹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布闪盔。 她就那樣靜靜地躺著弯院,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泪掀。 梳的紋絲不亂的頭發(fā)上抽兆,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音族淮,去河邊找鬼辫红。 笑死,一個胖子當(dāng)著我的面吹牛祝辣,可吹牛的內(nèi)容都是我干的贴妻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蝙斜,長吁一口氣:“原來是場噩夢啊……” “哼名惩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起孕荠,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤娩鹉,失蹤者是張志新(化名)和其女友劉穎攻谁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弯予,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡戚宦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了锈嫩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片受楼。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖呼寸,靈堂內(nèi)的尸體忽然破棺而出艳汽,到底是詐尸還是另有隱情,我是刑警寧澤对雪,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布河狐,位于F島的核電站,受9級特大地震影響瑟捣,放射性物質(zhì)發(fā)生泄漏馋艺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一蝶柿、第九天 我趴在偏房一處隱蔽的房頂上張望丈钙。 院中可真熱鬧,春花似錦交汤、人聲如沸雏赦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽星岗。三九已至,卻和暖如春戒洼,著一層夾襖步出監(jiān)牢的瞬間俏橘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工圈浇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寥掐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓磷蜀,卻偏偏與公主長得像粥血,于是被迫代替她去往敵國和親进陡。 傳聞我的和親對象是個殘疾皇子具钥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,146評論 25 707
  • 作者:李旺成 時間:2016年4月19日 接上篇:AndroidStudyDemo之Android5.x新控件介紹...
    diygreen閱讀 3,058評論 5 56
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫侦锯、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,104評論 4 62
  • 「 我還在努力,你千萬不要喜歡其他人 」 料想我并非善男信女固惯,委屈自己從來也都有一個特定情景才能忍的理所當(dāng)然梆造,否則...
    嵐楓紫諾閱讀 434評論 0 1
  • 老陳跟老莫當(dāng)年是相親認識的缝呕,閃婚斧散。 28年過去了供常,每次說起這個相親鸡捐,老陳跟老莫依然能互懟半天,我們幾兄妹在一旁圍觀...
    nage南墻閱讀 386評論 0 0