成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【騰訊bugly干貨】關(guān)于 Android N 那些你不知道的事兒

zombieda / 1674人閱讀

今年3月,Google 破天荒提前半年發(fā)布了 Android N 開(kāi)發(fā)者預(yù)覽版。當(dāng)然,作為一個(gè)不合格的谷粉并沒(méi)有第一時(shí)間體驗(yàn)安裝,因?yàn)橹两袢匀荒軌蚧貞浧饋?lái)去年今日此門中(霧)興沖沖刷了 Android M Preview 的時(shí)候發(fā)現(xiàn)各種 Crash 就連微信也(不出所料得)中招時(shí)自己一臉懵逼的心情。當(dāng)然,為自己的機(jī)智而慶幸并沒(méi)有過(guò)多久,很快就有微信好友(當(dāng)然也是純純的谷粉)反饋微信又雙叒叕在 Android 新版本下 Crash了……好吧這次我們的時(shí)間很充裕,因?yàn)?5 個(gè) preview 之后才會(huì)發(fā)布最終 release 版本。令人失望(咦)的是,我們的工程師在一天之內(nèi)就修復(fù)了這個(gè) bug 并且趕在當(dāng)天 6.3.15 alpha 版本發(fā)布之前修復(fù)并合入主線,辜負(fù)了 Google 的一片苦心。

痛定思痛,當(dāng)天我就拎起來(lái)麒麟臂,在 Chrome 的地址欄重重得敲入:http://developer.android.com/preview/overview.html ,并且聽(tīng)說(shuō)Google 在北京舉辦了 Android 開(kāi)發(fā)者大會(huì)的時(shí)候,屁顛屁顛得過(guò)去了。

假如我是產(chǎn)品經(jīng)理

在這個(gè)『人人都是產(chǎn)品經(jīng)理』的年代,作為程序員當(dāng)然是敲得起代碼,當(dāng)?shù)闷鸾?jīng)理(。。。)。如果我是產(chǎn)品經(jīng)理,Android N 的更新無(wú)非是以下三個(gè)點(diǎn):
默認(rèn)多窗口支持
強(qiáng)化通知,里邊有你最喜歡的直接回復(fù)
沒(méi)了…當(dāng)然不是:Android Developer 一筆帶過(guò)的重磅 feature:允許第三方應(yīng)用在快速設(shè)置中添加自己的服務(wù)

默認(rèn)多窗口支持
注意『默認(rèn)』二字:這很重要,這很重要,這很重要。

Android M 里邊,系統(tǒng)允許應(yīng)用在啟動(dòng)某 Activity(對(duì)于 PM 來(lái)說(shuō)可以不嚴(yán)謹(jǐn)?shù)美斫獬山缑妫r(shí)帶上特殊參數(shù),該應(yīng)用可以在最近任務(wù)窗口中和主應(yīng)用分開(kāi)顯示,即 multi-tasking 支持。當(dāng)然,并沒(méi)有多少應(yīng)用鳥(niǎo)這個(gè) Android M 中為數(shù)不多的新特性之一,因?yàn)樾Ч麑?shí)在是不明顯。也有一定的原因是在這個(gè)大部分產(chǎn)品經(jīng)理不會(huì)關(guān)注 Android Developer 的年代,這個(gè)非默認(rèn)的特性實(shí)在不會(huì)引起他們的注意。

在 Android N 中,竟然直接支持了 multi-window!雖然這個(gè)特性并不驚艷,在 iOS 和三星的機(jī)型中早已支持,甚至在 Android M 中,也可以預(yù)埋了這個(gè)特性,并可以通過(guò)某些特殊方法開(kāi)啟。然而,和 iOS 應(yīng)用需要特殊聲明才能支持多窗口的特性不同,Android N竟然默認(rèn)支持了多窗口。這意味著任何一個(gè)應(yīng)用,無(wú)論 target-api 是否是 Android N,都支持從最近任務(wù)中長(zhǎng)按應(yīng)用標(biāo)題欄進(jìn)入多窗口模式。這里是個(gè) Demo。

默認(rèn)支持也就意味著除非特殊聲明,任何應(yīng)用都支持前述視屏所示效果,也就是說(shuō)如果應(yīng)用不針對(duì)這種模式進(jìn)行完美適配,或者說(shuō)用了絕對(duì)布局的話,你的應(yīng)用就會(huì)。。。。呵呵呵。

當(dāng)然,這種老掉牙的特性是不會(huì)引起高冷的 PM 的注意的,只會(huì)扔給開(kāi)發(fā)狗交給我們?nèi)ミm配。那好吧,來(lái)一個(gè) one more thing 刺激一下你:
在 Android N 中,將支持分屏情況下 drag and drop,讓這個(gè)4.0開(kāi)始就支持 faeture 煥發(fā)了新生。這也就意味著你可以將一個(gè)應(yīng)用內(nèi)、甚至不同應(yīng)用間的分屏情況將一個(gè)分屏幕控件拖拽到另外一個(gè)分屏幕。也許可以用來(lái)拖拽圖片快速發(fā)圖,或者。。隨便你想干什么。
當(dāng)然,從開(kāi)發(fā)狗的角度來(lái)說(shuō),這里有一點(diǎn)安全隱患:如果通過(guò)拖拽將數(shù)據(jù)傳遞過(guò)來(lái),你甚至不知道來(lái)源是什么。但是想想也是,畢竟用的和粘貼板一樣的接口,還能指望什么呢?

另外,作為分屏的一種特殊形式,畫中畫(picture in picture)也得到了相應(yīng)的支持。不過(guò)據(jù) Google 的工程師說(shuō),畫中畫模式主推 Android TV 中應(yīng)用(也許 Google 認(rèn)為在手持設(shè)備上場(chǎng)景不足)。不過(guò) whatever,現(xiàn)在很多功能已經(jīng)可以通過(guò)浮窗接口實(shí)現(xiàn)。畫中畫對(duì)于做視頻應(yīng)用或者有視頻支持功能的應(yīng)用非常有幫助。

此外,給程序員朋友們幾個(gè)小貼士
雖然分屏狀態(tài)下兩個(gè)應(yīng)用都可見(jiàn),但是對(duì)于非 Focus 狀態(tài)的應(yīng)用當(dāng)前是處于 onStop 狀態(tài)的,也就是說(shuō),并沒(méi)有實(shí)際在運(yùn)行中。原本 onStop 的時(shí)候應(yīng)用應(yīng)該是不可見(jiàn),但是現(xiàn)在可見(jiàn)了。。。原本的一些惡心邏輯注意修改下。
雖然分屏狀態(tài)下的應(yīng)用不會(huì) double 內(nèi)存占用,但是內(nèi)存占用肯定會(huì)比正常狀態(tài)大,注意分屏模式下即時(shí)釋放內(nèi)存。
適配好你的程序,該加 scroll 的地方加 scroll。當(dāng)然,如果原本的你的程序就已經(jīng)針對(duì)多尺寸屏幕有了處理,就已經(jīng)完美適配了這個(gè)模式

強(qiáng)化通知

通知欄一直是 Android 引以為豪的方面。相對(duì)于 iOS 的通知欄來(lái)說(shuō), Android 的通知欄具有幾乎完爆的功能:自定義控件,自定義 Action,可以定義下來(lái)拓展的控件……除了快速回復(fù)。
在這之前,先上一段 Android N 新版本的通知欄和快速設(shè)置欄,至于為什么放視頻,嗯。。。因?yàn)槲矣X(jué)得很好看:點(diǎn)我看視頻

如今,這一點(diǎn)已經(jīng)被 Google 迎頭趕上,并且體驗(yàn)絕不亞于 iOS,甚至好很多。
當(dāng)然,如果一次來(lái)了多條消息并且都不是一個(gè)會(huì)話中,快速回復(fù)也是毫無(wú)壓力:
這個(gè)新特性簡(jiǎn)而言之就是滿足了快速回復(fù)的一切需求,也許從此再也不用擔(dān)心沉浸式閱讀時(shí)需要跳出回復(fù)消息這種傷害體驗(yàn)的情況。
當(dāng)然了,除了快速回復(fù),還有根據(jù)應(yīng)用歸檔通知,這無(wú)疑是一個(gè)大殺器:

同時(shí),這里需要同時(shí)提醒PM和開(kāi)發(fā)同學(xué)的是:如果真的需要在通知上設(shè)置自定義控件,請(qǐng)調(diào)用DecoratedCustomViewStyle()。它會(huì)讓你的自定義控件在通知欄顯得更加和諧。Sample:
[Java] 純文本查看 復(fù)制代碼
?
1
2
3
4
5
6
Notification noti = new Notification.Builder()

       .setSmallIcon(R.drawable.ic_stat_player)
       .setLargeIcon(albumArtBitmap))
       .setCustomContentView(contentView);
       .setStyle(new Notification.DecoratedCustomViewStyle())
       .build();

『何必這樣,我寫一個(gè)BroadcastReceiver監(jiān)聽(tīng)CONNECTIVITY_ACTION然后處理不就行了,naive!』
科科。
為了防止這個(gè)沒(méi)有節(jié)操的事情發(fā)生,Google 在 Android N中拿掉了這三個(gè)廣播:
CONNECTIVITY_ACTION:網(wǎng)絡(luò)變化
ACTION_NEW_PICTURE:添加新圖片
ACTION_NEW_VIDEO:添加新視頻

這也是我非常佩服 Google 的一個(gè)點(diǎn),敢于做減法。當(dāng)然,留下的坑就多了,比如 CONNECTIVITY_ ACTION,很多應(yīng)用(包括微信)都會(huì)監(jiān)聽(tīng)。今后需要使用 JobScheduler 實(shí)現(xiàn)相同的邏輯了。JobScheduler 有非常多的好處,他會(huì)根據(jù)用戶當(dāng)前設(shè)備的情況,比如當(dāng)前 RAM、電量、模式、是否應(yīng)用在前臺(tái)等等,決定是否執(zhí)行該邏輯。你也不希望自己的程序變成用戶手機(jī)變卡的罪魁禍?zhǔn)?,從而讓用戶怒刪,對(duì)吧?

當(dāng)然了,不允許監(jiān)聽(tīng) CONNECTIVITY_ ACTION 針對(duì)的是靜態(tài)注冊(cè)的 BroadcastReceiver,如果是動(dòng)態(tài)注冊(cè)的 BroadcastReceiver 則并不會(huì)受到影響。

Java 8支持

早在前年開(kāi)始研究 Annotation 的時(shí)候,就在感慨為什么 Android 一直不支持 Java 8,即使現(xiàn)在 Java 9 都快出了。終于的終于,Android從N 版本開(kāi)始支持 Java 8的編譯,前提是要在 Gradle 文件中顯式聲明使用 Jack 編譯器。
這個(gè) Jack 是什么鬼呢?簡(jiǎn)單來(lái)說(shuō),傳統(tǒng)的編譯工具鏈?zhǔn)菍?java 代碼通過(guò) javac 編譯成.class 文件,再通過(guò) dx 編譯成 .dex。也就是醬紫的:
[Java] 純文本查看 復(fù)制代碼
?
1
javac (.java --> .class) --> dx (.class --> .dex)
而 Jack 則是一條龍服務(wù),中間不需要經(jīng)過(guò)其他工具或者命令,一條命令就可以將.java 文件編譯成.jack 從而編程.dex:
[Java] 純文本查看 復(fù)制代碼
?
1
ack (.java --> .jack --> .dex)
使用 jack 非常簡(jiǎn)單,gradle 配置即可
[Java] 純文本查看 復(fù)制代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
android {
...
defaultConfig {

...
jackOptions {
  enabled true
 }

}
compileOptions {

sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8

}
}
不過(guò),Android N 版本的 Java 8特性并沒(méi)有支持全,不過(guò)主流的 feature 已經(jīng)支持,包括:
定義接口默認(rèn)實(shí)現(xiàn)方法
Lamda 表達(dá)式支持(喜歡語(yǔ)法糖的同學(xué)的福利)
Repeatable annotations。這個(gè)已經(jīng)可以說(shuō)的內(nèi)容很多,改天有空給大家慢慢介紹。
Method Reference。這個(gè)實(shí)話實(shí)說(shuō)我并不是太了解,也是語(yǔ)法糖一種。感興趣的同學(xué)可以看看這個(gè)鏈接:https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html

但是現(xiàn)在還沒(méi)有支持一個(gè)很重要的特性:Stream。但是現(xiàn)在還在 Preview 階段,比如剛剛的第四條 Method Reference 就是 Preview2 支持的,可以期待下 release 中是否會(huì)支持(最新消息:已經(jīng)支持 java.util.stream 接口,棒棒的!)。

此外還需要注意兩點(diǎn):
Lamda 表達(dá)式本質(zhì)上回生成匿名類,在性能敏感的模塊慎用
由于 Jack 編譯器不會(huì)產(chǎn)生.class 中間文件,因此在.class 上做 trick 的一些庫(kù)或者項(xiàng)目可能就會(huì)失效或者出問(wèn)題。因此在使用之前,一定要好好測(cè)試。

其他應(yīng)該注意的事項(xiàng)

Data Saver:乍看上去是一個(gè)數(shù)據(jù)存儲(chǔ)的 API,感覺(jué)很興奮,結(jié)果點(diǎn)開(kāi)一看是流量節(jié)省。。。好吧,博大精深的英文。從 Android N 開(kāi)始,系統(tǒng)層級(jí)支持用戶針對(duì)每一個(gè)應(yīng)用添加自己的流量控制限制。今后開(kāi)發(fā)的時(shí)候需要先通過(guò) ConnectivityManager.getRestrictBackgroundStatus() 接口獲取本應(yīng)用流量控制情況。
Key Attestation:對(duì)于絕大部分應(yīng)用并不需要仔細(xì)研究的 feature,甚至可以當(dāng)做不存在,但是對(duì)于我個(gè)人所做的生物認(rèn)證項(xiàng)目來(lái)說(shuō),可謂是非常重要的 feature。
針對(duì)文件目錄或類型申請(qǐng)權(quán)限:實(shí)話實(shí)說(shuō),這個(gè)也算是一個(gè)很重要的 feature。從 Android 6.0 開(kāi)始,如果需要使用存儲(chǔ)空間,包括讀寫,需要?jiǎng)討B(tài)申請(qǐng)權(quán)限。然而對(duì)于大部分應(yīng)用來(lái)說(shuō),都需要申請(qǐng)這個(gè)權(quán)限,而且一旦用戶允許,應(yīng)用就可以為所欲為。因此,Android N 中允許應(yīng)用聲明僅僅授權(quán)某個(gè)文件夾或者文件類型的存儲(chǔ)。

禁止 Native 動(dòng)態(tài)鏈接系統(tǒng)庫(kù)

這一點(diǎn) Android Developer 沒(méi)有講,至少暫時(shí)沒(méi)有講
還記得之前我說(shuō)的微信升級(jí)到 N 會(huì) Crash 么?實(shí)際上就是這個(gè)原因。

自 Android N 開(kāi)始,系統(tǒng)將禁止第三方應(yīng)用 so 文件鏈接系統(tǒng) lib 庫(kù),包括并不限于 libcrypto.so,libandroidruntime.so,libicu.so,libbinder.so。動(dòng)態(tài)鏈接上述庫(kù)輕則彈 Toast 提示,重則直接 crash。Android 此舉原因大家可以討論,但是事實(shí)已然如此,盡管對(duì)于大多數(shù)應(yīng)用而言并無(wú)妨礙,但是對(duì)于類似微信這種在底層做了大量?jī)?yōu)化和調(diào)用的應(yīng)用來(lái)說(shuō)還是很傷腦筋的。至于解決方法。。。暫時(shí)只想到了改用靜態(tài)鏈接,對(duì)于包的大小增加并不會(huì)太大。如果有更好的方法,歡迎大家討論。
實(shí)話實(shí)說(shuō),這次 Android N 的更新對(duì)于我們程序員來(lái)說(shuō)還是干貨滿滿,滿到我有些話想說(shuō)。

扯淡
前面說(shuō)的都是 Android N,現(xiàn)在終于開(kāi)始講扯淡了。實(shí)際上,從 Android L 開(kāi)始,Google 就已經(jīng)開(kāi)始反省自己過(guò)分開(kāi)放的策略。原本后臺(tái)任務(wù)滿天飛的系統(tǒng),現(xiàn)在漸漸地被控制得有序起來(lái)。比如 Android L 發(fā)布的 JobScheduler,Android M 發(fā)布的 Doze 模式和 APP Standby,Android N 的 Doze 加強(qiáng)以及瘦身計(jì)劃,無(wú)一不是在限制系統(tǒng)的后臺(tái)任務(wù)數(shù)量以及計(jì)算強(qiáng)度。亡羊補(bǔ)牢,不知是否為時(shí)未晚。

同時(shí),關(guān)于設(shè)計(jì)方面,Material Design 推出已經(jīng)接近兩年,盡管有很多應(yīng)用已經(jīng)適配,但是包括微信、Facebook、Twitter 在內(nèi)的很多主流應(yīng)用仍然在堅(jiān)持使用自己的設(shè)計(jì)語(yǔ)言。誠(chéng)然,這里有可以理解的風(fēng)格統(tǒng)一之考慮, MD 本身也有很多缺陷,但是我們很高興能看到的是 MD 自身在不斷的調(diào)整優(yōu)化,越來(lái)越成為一個(gè)漂亮的并且優(yōu)秀的設(shè)計(jì),其層次感以及靈動(dòng)性無(wú)處不撩撥著用戶的神經(jīng)。所以,是不是仍有很多人抱著 2.3 混亂局面或者 4.0 不那么優(yōu)秀的 Android Design 來(lái)臆測(cè) Android 的設(shè)計(jì)風(fēng)格?也許用著 iOS 的諸位對(duì)于 Android 的印象依然是 2.x 時(shí)代那個(gè)臃腫的、落后的以及。。額,難看的形象。就像這樣:


這是2011年左右,畢竟是5年前,那時(shí) iPhone 上的應(yīng)用也并不好看,不過(guò)還是比 Android 要強(qiáng)很多。但是現(xiàn)在 Android 應(yīng)用已經(jīng)長(zhǎng)這樣了(系統(tǒng)自帶應(yīng)用):

個(gè)人認(rèn)為比 Apple 的設(shè)計(jì)。。。(為了防止引戰(zhàn))至少并不差吧。
其實(shí),這里說(shuō)了這么多,精通讀心術(shù)的我也能想到大家心中的疑問(wèn):碎片化如此的 Android 市場(chǎng),我們就算是適配了 N 的特性,大家也沒(méi)有這么快用上,還是歇著吧。嗯,關(guān)于碎片化,首先,Android 目前版本分布是醬紫的(來(lái)自 Google 官方,鏈接 http://developer.android.com/about/dashboards/index.html)

也就是說(shuō),至少截止到今天,接近40%的人的設(shè)備已經(jīng)是 Android 5.0 以及以上,按照如今廠商發(fā)貨的速度,目測(cè)一兩個(gè)月內(nèi)比例就會(huì)過(guò)半。平心而論,針對(duì)這半數(shù)用戶,有幾家應(yīng)用做到了完美支持?無(wú)論是 UI 還是具體功能,大部分應(yīng)用應(yīng)該都是在4.x,甚至2.x版本的基礎(chǔ)上填坑,fix 新版本上的 crash,有幾家用到了新的特性,新的 feature 呢?而大家以為占主流的2.3系統(tǒng),實(shí)際上已經(jīng)不足3%,是不是仍然有很多應(yīng)用的 target api 仍然是 4.x 以下?
而且 Google 現(xiàn)在很雞賊啊(這一點(diǎn)謝老大提醒),一年發(fā)布一個(gè)大版本,前年5.0,去年6.0,今年 7.0,你說(shuō) Google 都到 7.0 了你還好意思連 5.0 都不上?這一點(diǎn)實(shí)際上對(duì)于解決碎片化是非常有幫助的。

面對(duì)占市場(chǎng)份額近 7 成的 Android 設(shè)備本身并不需要救助,一直都沒(méi)有放棄發(fā)展,欣欣向榮。相反,需要救助的是我們?cè)?Android 上的應(yīng)用,低質(zhì)量的應(yīng)用實(shí)現(xiàn)已經(jīng)威脅到了我們自身。不僅僅是要依靠產(chǎn)品經(jīng)理,作為程序員,我們也要學(xué)會(huì)自救。
感謝!

如果你覺(jué)得內(nèi)容意猶未盡,如果你想了解更多相關(guān)信息,請(qǐng)掃描以下二維碼,關(guān)注我們的公眾賬號(hào),可以獲取更多技術(shù)類干貨,還有精彩活動(dòng)與你分享~

騰訊 Bugly是一款專為移動(dòng)開(kāi)發(fā)者打造的質(zhì)量監(jiān)控工具,幫助開(kāi)發(fā)者快速,便捷的定位線上應(yīng)用崩潰的情況以及解決方案。智能合并功能幫助開(kāi)發(fā)同學(xué)把每天上報(bào)的數(shù)千條 Crash 根據(jù)根因合并分類,每日日?qǐng)?bào)會(huì)列出影響用戶數(shù)最多的崩潰,精準(zhǔn)定位功能幫助開(kāi)發(fā)同學(xué)定位到出問(wèn)題的代碼行,實(shí)時(shí)上報(bào)可以在發(fā)布后快速的了解應(yīng)用的質(zhì)量情況,適配最新的 iOS, Android 官方操作系統(tǒng),鵝廠的工程師都在使用,快來(lái)加入我們吧!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65872.html

相關(guān)文章

  • 騰訊Bugly干貨分享】深入理解 ButterKnife,讓你程序?qū)W會(huì)寫代碼

    摘要:這似乎是一個(gè)很有意思的話題,如果你的程序足夠聰明,它就可以自己寫代碼那么這么說(shuō)就是要給生成的代碼添加一個(gè)屬性咯不不不,是添加一組注入關(guān)系,后面生成代碼時(shí),注解管理器就需要根據(jù)這些解析來(lái)的關(guān)系來(lái)組織生成的代碼。 本文來(lái)自于騰訊bugly開(kāi)發(fā)者社區(qū),非經(jīng)作者同意,請(qǐng)勿轉(zhuǎn)載,原文地址:http://dev.qq.com/topic/578753c0c9da73584b025875 0、引子 ...

    seasonley 評(píng)論0 收藏0
  • 3月份前端資源分享

    摘要:面試如何防騙一份優(yōu)秀的前端開(kāi)發(fā)工程師簡(jiǎn)歷是怎么樣的作為,有哪些一般人我都告訴他,但是他都不聽(tīng)的忠告如何面試前端工程師 更多資源請(qǐng)Star:https://github.com/maidishike... 文章轉(zhuǎn)自:https://github.com/jsfront/mo... 3月份前端資源分享 1. Javascript 使用judge.js做信息判斷 javascript...

    nanchen2251 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<