欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

探索Android,探索發(fā)現(xiàn)

Android開發(fā)藝術探索讀書筆記之AIDL

AIDL是 Android Interface definition language的縮寫,一看就明白,它是一種android內部進程通信接口的描述語言,通過它我們可以定義進程間的通信接口

目前創(chuàng)新互聯(lián)建站已為上1000+的企業(yè)提供了網(wǎng)站建設、域名、虛擬空間、綿陽服務器托管、企業(yè)網(wǎng)站設計、諸暨網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

AIDL可以實現(xiàn)跨進程的方法調用。定義進程通信接口供服務端和客戶端調用。

在AIDL文件中并不是所有數(shù)據(jù)類型都可以使用。只支持下列數(shù)據(jù)類型

默認情況下AIDL的調用過程是同步的,所以不能直接進行比較耗時的操作,否則容易導致客戶端ANR。如果需要進行異步操作,在服務端不需要另起線程,但是在客戶端需要另起線程訪問遠程方法,再通過Handler通知到UI線程即可!

Android: Activity啟動模式 FLAG_ACTIVITY_NEW_TASK 詳細探索

最近遇到了一個小問題,在我使用了多種Activity啟動模式的時候,重新打開其中的一個Activity會啟動另一個我已經(jīng)停止的Activity,從而調用了一些已經(jīng)失效的方法導致程序崩潰。

由于項目工程復雜,Activity名稱不夠直觀,我新建了一個ActivityTaskTest 工程來重現(xiàn)遇到的問題。

ActivityA是工程的主活動。因為一些必要的原因, ActivityA的啟動模式是SingleInstance的。ActivityA可以啟動ActivityB,ActivityB沒有設置任何啟動模式,即默認的standard啟動模式。在ActivityB中,將會啟動一個ServiceA。 ServiceA中啟動一個了一個ActivityC,由于Activity是在非Acitivity環(huán)境下啟動的,需要設置 FLAG_ACTIVITY_NEW_TASK標簽(這里就是我們討論的重點,稍候會詳細分析)。當ActivityC完成任務后會重新跳轉到ActivityA。

最后,見證奇葩的時刻到了,我們點擊ActivityA的啟動ActivityB的button,ActivityC出現(xiàn)在了我們的眼前,而不是ActivityB!!這一刻我仿佛劉謙附體,但在我發(fā)現(xiàn)我身邊并沒有董卿之后,我深刻地意識到了我是一個工程師,不能搞這些裝神弄鬼的事情。ok,Let's find out what‘s going on with our precious app!

關于Activity啟動模式和Activity Task的內容推薦一篇非常好的文章: Android中Activity四種啟動模式和taskAffinity屬性詳解 。這篇文章已經(jīng)講得非常詳細了,這里就不再贅述了,偷個懶哈哈。

如果你已經(jīng)看了文章,你應該已經(jīng)知道問題的所在了,對,就是這個該死的taskAffinity。簡單的說,就是我們雖然使用了FLAG_ACTIVITY_NEW_TASK標簽去啟動了ActivityC,但是因為我們忘了給Activity設置taskAffinity這個小婊砸,所以導致ActivityC的taskAffinity值和ActivityB一樣都是默認的包名。所以我們啟動ActivityC的時候系統(tǒng)將ActivityC壓入了ActivityB所在的task。我們可以使用adb shell dumpsys activity activities 指令看下一在我們重新從A中啟動B之前,Task的情況:

我們可以看到正如我們所想的,ActivityC和ActivityB在一個Task中,由于ActivityA是singleInstance模式,所以A只能做一輩子單身狗了。那么為什么我們明明啟動的是B,怎么會出現(xiàn)C呢?

我們來先看看Google官方文檔對于FLAG_ACTIVITY_NEW_TASK是怎么說的:

注意文檔中的內容,“如果要啟動的 activity 已經(jīng)運行于某 task 中,則那個 task 將調入前臺,最后保存的狀態(tài)也將恢復”,注意這里是所在task被直接調入前臺,也就是說B所在的整個Task將被移入前臺。這就解釋了為什么我們去啟動B而出現(xiàn)的是C了。看起來我們好像大功告成了,但是,等等,總覺得哪里有點不太對勁,我們的ActivityB明明沒有設置啟動模式啊,你這個是FLAG_ACTIVITY_NEW_TASK標簽,我沒用啊,我讀書多你可別騙我。

仔細想想應該是ActivityA的singleInstance的鍋。

我們再來看看Google官方文檔對于singleInstance是怎么說的吧:

看到最后一句,終于可以結案了。也就是說,當一個被設置為singleInstance的Activity去啟動其他的Activity的時候,其默認是自帶FLAG_ACTIVITY_NEW_TASK標簽的。

1、FLAG_ACTIVITY_NEW_TASK標簽必須配合taskAffinity屬性使用,如果不設置taskAffinity屬性值,將不會生成新task。

2、當從啟動模式為singleInstance的Acitivity中啟動新的Acitivity時,新的Activity自帶FLAG_ACTIVITY_NEW_TASK標簽。

心得:官方文檔是個好東西。

Android 仿微博,探索使用ShortcutManager添加應用程序的快捷方式

在Android 7.1(API 25)之后添加的新功能,應用快捷方式。ShortcutManager管理一個應用程序的快捷方式。只要在長按應用圖標的情況下,在應用圖標上顯示的快捷方式,用戶可以快速訪問任意一個Activity。

現(xiàn)在市場上已經(jīng)是有很多應用增加了這項功能,例如微博、美團、支付寶、知乎、印象筆記等。

按照慣例,我們先看看效果圖:

二、這個Dome主要是通過動態(tài)的方式,下面我們來看看動態(tài)創(chuàng)建的方式,是通過ShortcutManager實現(xiàn)快捷方式的增加、刪除、更新的操作,使用起來很簡單。

strings.xml

在進來的頁面中,我們通過傳值去做一些業(yè)務邏輯判斷

好了,本篇文章就這樣啦,存在總結不到位的地方還望指導,感謝~

最后附上官網(wǎng)地址:

《Android開發(fā)藝術探索》值得買嗎

值得買。《Android開發(fā)藝術探索》深入的講解View的工作原理,View的事件體系,屬性動畫,IPC機制,JNI技術,緩存與優(yōu)化等知識。作者不僅僅沒有簡單的堆砌文檔,而是結合自身工作經(jīng)驗來講解。由于這些技術屬于Android進階技術,所以不適合新手入門,比較適合進階中高的開發(fā)的工程師。

android深度探索 hal與驅動開發(fā) 怎么樣

 《Android深度探索(卷1):HAL與驅動開發(fā)》注重理論和實踐相結合。在介紹了大量的基礎知識的同時,為每一個知識點提供了完整的案例,使讀者可以通過實際的代碼更好地理解Linux驅動和Android底層技術。

探索 Android 中的 Span

在 Android 中,使用 Span 定義文本的樣式. 通過 Span 改變幾個文字的顏色,讓它們可點擊,放縮文字的大小甚至是繪制自定義的項目符號點(bullet points,國外人名中名字之間的間隔符號 · ,HTML 中無序列表項的默認符號)。Span 能夠改變 TextPaint 屬性,在 Canvas 上繪制,甚至是改變文本的布局和影響像行高這樣的元素。Span 是可以附加到文本或者從本文分離的標記對象(markup objects);它們可以被應用到部分或整段的文本中。

讓我們來看看Span如何使用、提供了哪些開箱即用的功能、怎樣簡單地創(chuàng)建我們自己的 Span 以及如何使用和測試它們。

Styling text in Android

Creating custom spans

Testing custom spans implementation

Testing spans usage

Android 提供了幾種定義文本樣式的方法:

單一樣式 使用 XML 屬性或者 樣式和主題 引入了 TextView 的所有內容的樣式。這種方式實現(xiàn)簡單,通過 XML 即可實現(xiàn),但是并不能只定義部分內容的樣式。舉個例子,通過設置 textStyle=”bold” ,所有的文本都會變?yōu)楹隗w;你不能只定義特定的幾個字符為黑體。

多重樣式 引入了給一段文本添加多種樣式的功能。例如,一個單詞斜體而另一個粗體。多重樣式可以通過使用 HTML 標簽、 Span 或者是在 Canvas 上處理自定義的文本繪制。

左圖:單一樣式文本。設置了 textSize=”32sp” 和 textStyle=”bold” 的 TextView 。右圖:多重樣式文本。設置了 ForegroundColorSpan, StyleSpan(ITALIC), ScaleXSpan(1.5f), StrikethroughSpan 的文本。

HTML 標簽 是解決簡單問題的簡單辦法,例如使文本加粗、斜體,甚至是顯示項目符號點。為了展示含有 HTML 標簽的文本,使用 Html.fromHtml 方法。在內部實現(xiàn)時,HTML 標簽被轉換成了 span 。但是請注意, Html 類并不支持完整的 HTML 標簽和 CSS 樣式,例如將小黑點改為其他的顏色。

當你有文本樣式的需求,但是 Android 平臺默認不支持時,你還可以手動地在 Canvas 上繪制文本,例如讓文字彎曲排布。

Span 允許你實現(xiàn)具有更細粒度自定義的多重樣式文本。舉個例子,通過 BulletSpan ,你可以定義你的段落文本擁有項目符號點。你可以定制文本和點號之間的間距和點號的顏色。從 Android P 開始,你甚至可以 設置點號的半徑 。你也可以創(chuàng)建 span 的自定義實現(xiàn)。在文章中查看 “創(chuàng)建自定義 span” 部分可以找到如何實現(xiàn)。

左圖:使用 HTML 標簽;中圖:使用 BulletSpan,默認圓點大小;右圖:在 Android P 上使用 BulletSpan 或者自定義實現(xiàn)。

你可以組合使用單一樣式和多重樣式。你可以考慮將設置給 TextView 的樣式作為一種“基本”樣式,而 span 文本樣式是應用在基本樣式“之上”并且會覆蓋基本樣式的樣式。例如,當給一個 TextView 設置了 textColor=”@color.blue” 屬性且給頭4個字符應用了 ForegroundColorSpan(Color.PINK) ,則頭4個字符會使用 span 設置的粉色,而其他文本使用 TextView 屬性設置的顏色。

TextView 組合使用 XML 屬性和 span 樣式

當使用 span 時,你會和以下類的其中之一打交道: SpannedString , SpannableString 或 SpannableStringBuilder 。 它們之間的區(qū)別在于文本或標記對象是可改變的還是不可改變的以及它們使用的內部結構: SpannedString 和 SpannableString 使用線性數(shù)組記錄已添加的 span,而 SpannableStringBuilder 使用 區(qū)間樹 。

下面是如何決定使用哪一個的方法:

舉個例子,你用到的文本并不會改變,但你想要附加 span 時,你應該使用 SpannableString 。

上面所有的這些類都繼承自 Spanned 接口,但擁有可變標記的類( SpannableString 和 SpannableStringBuilder ) 同時也繼承自 Spannable 。

Spanned -- 帶有不可變標記的不可變文本

Spannable (繼承自 Spanned) -- 帶有可變標記的不可變文本

通過 Spannable 對象調用 setSpan(Object what, int start, int end, int flags) 方法應用 span。 What 對象是一個標記,應用于從開始到結束的索引之間的文本。falg 標志位標記了 span 是否應該擴展至包含插入文本的開始和結束的點。任何標志位設置以后,只要插入文本的位置位于開始位置和結束位置之間,span 就會自動的擴展。

舉個例子,設置 ForegroundColorSpan 可以像下面這樣完成:

因為 span 設置時使用了 SPAN_EXCLUSIVE_INCLUSIVE 標志位,在 span 的后面插入文本時,新插入的文本也會自動地繼承此 span。

左圖:帶有 ForegroundColorSpan 的文本;右圖:帶有 ForegroundColorSpan 和 Spannable.SPAN_EXCLUSIVE_INCLUSIVE 的文本。

如果 span 設置了 Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 標志位,在 span 后面插入文本時則不會修改 span 的結束索引。

多個 span 可以被組合且同時附加到同一段文本上。例如,粗體紅色的文本可以像這樣構建:

帶有多種 span 的文本:ForegroundColorSpan(Color.RED) 和 StyleSpan(BOLD)

Android framework 定義了幾個接口和抽象類,它們會在測量和渲染時被檢查。這些類有允許 span 訪問像 TextPaint 或 Canvas 對象的方法。

Android framework 在 android.text.style 包、主要接口的字類和抽象類中提供了20+的 span, 我們可以通過下面幾個方式對 span 進行分類:

span 類別:字符對比段落,外形對比大小

第一種類型以修改外形的方式在字符級別起作用:文本或背景顏色、下劃線、中橫線等等,它會觸發(fā)文本重新繪制但是并不會重新布局。這些 span 引入了 UpdateAppearance 且繼承自 CharacterStyle . CharacterStyle 字類通過提供更新 TextPaint 的訪問方法,定義了怎樣繪制文本。

影響外形的 span

影響尺寸 的 span 更改了文本的尺寸和布局,因此觀察 span 的變化的對象會重新繪制文本以保證布局和渲染的正確。

舉個例子,影響文本字體大小的 span 要求重新測量和布局,也要求重新繪制。這種 span 通常繼承自 MetricAffectingSpan 類。這個抽象類通過提供對 TextPaint 的訪問,允許字類定義 span 如何影響文本測量,而 MetricAffectingSpan 繼承自 CharacterSpan ,子類在字符級別影響文本的外形。

影響尺寸的 span

你可能會想要一直重新創(chuàng)建帶有文本和標記的 CharSequence 并且調用 TextView.setText(CharSequence) 方法,但是這樣做很有可能一直觸發(fā)已經(jīng)創(chuàng)建好的布局和額外的對象的重新測量和重新繪制。為了減少性能損耗,將文本設置為 TextView.setText(Spannable, BufferType.SPANNABLE) ,然后當你需要更改 span 的時候,通過將 TextView.getText() 轉換為 Spannable 從 TextView 獲得 Spannable 對象。我們會在未來的文章中詳細討論 TextView.setText 的實現(xiàn)原理和不同的性能優(yōu)化方式。

舉個例子,考慮通過這樣的方式設置和獲取 Spannable :

現(xiàn)在,當我們在 spannableText 上設置了 span 之后,我們就不需要再調用 textView.setText 了,因為我們正在直接修改 TextView 持有的 CharSequence 對象的引用。

這是當我們設置了不同的 span 之后會發(fā)生什么:

情形1: 影響外觀的 span

當我們附加了一個影響外觀的 span 之后, TextView.onDraw 方法被調用但 TextView.onLayout 沒有。這是文本重繪,但寬和高保持原樣。

情形2: 影響尺寸的 span

因為 RelativeSizeSpan 改變了文本的大小,文本的寬和高變化,文本的布局方式(舉個例子,在 TextView 的大小沒有變化的情況下,一個特定的單詞現(xiàn)在可能會換行)。 TextView 需要計算新的大小所以 onMeasure 和 onLayout 均被調用。

左圖:ForegroundColorSpan——影響外觀的 span;右圖:RelativeSizeSpan——影響尺寸的 span

一個 span 對文本產(chǎn)生的影響既可以在字符級別,更新元素,如背景顏色、樣式或大小,也可以在段落級別,更改整個文本塊的對齊或者邊距。根據(jù)所需的樣式,span 既可以繼承自 CharacterStyle ,也可以引入 ParagraphStyle 。 繼承自 ParagraphStyle 的 span 必須從第一個字符附加到單個段落的最后一個字符,否則 span 不會被顯示。在 Android 中,段落是基于換行符 (\n) 定義的。

在 Android 中,段落是基于換行符 (\n) 定義的。

影響段落的 span

舉個例子,像 BackgroundColorSpan 這樣的 CharacterStyle ,可以被附加到文本中的任何字符上。這里,我們把它附加到第五到第八個字符上。

ParagraphStyle 的 span,像 QuoteSpan ,只能夠被附加到段落的開始,否則行和文本之間的邊距就不會出現(xiàn)。例如,“Text is\nspantastic” 在文本的第8個字符包含了一個換行符,所以我們可以給它附加一個 QuoteSpan ,段落從那里開始就會被添加樣式。如果我們在0或8之外的任何位置附加 span,text 就不會被添加樣式。

左圖:BackgroundColorSpan -- 影響字符的 span。右圖:QuoteSpan -- 影響段落的 span

在實現(xiàn)你自己的 span 時,你需要確定你的 span 是否會影響字符或段落級別的文本,以及它是否也會影響文本的布局或外觀。但是,在從頭開始編寫自己的實現(xiàn)之前,檢查一下是否可以使用 framework 中提供的 span。

太長不看:

假設我們需要實現(xiàn)一個 span,它允許以一定的比例增加文本的大小,比如 RelativeSizeSpan ,并設置文本的顏色,比如 ForegroundColorSpan 。為此,我們可以擴展 RelativeSizeSpan ,并且 RelativeSizeSpan 提供了 updateDrawState 和 updateMeasureState 回調,我們可以復寫繪制狀態(tài)回調并設置 TextPaint 的顏色。

注意:同樣的效果可以通過在同一文本上同時應用 RelativeSizeSpan 和 ForegroundColorSpan 實現(xiàn)。

測試 span 意味著檢查確實已對 TextPaint 進行了預期的修改,或者是否已經(jīng)將正確的元素繪制到了 canvas 上。例如,假設一個 span 的自定義實現(xiàn)為段落添加制定大小和顏色的項目符號點,以及左邊距和項目符號點之間的間隙。在 android-text sample 查看具體實現(xiàn)。為了測試這個類,實現(xiàn)一個 AndroidJUnit 類,確實檢查:

測試 Canvas 的交互可以通過 mock canvas,給 drawLeadingMargin 方法傳 mock 過的引用并使用正確的參數(shù)驗證是否已調用正確的方法來實現(xiàn)。

在 BulletPointSpanTest 查看其余的測試。

Spanned 接口允許給文本設置 span 和從文本獲取 span 。通過實現(xiàn)一個 Android JUnit 測試,檢查是否在正確的位置添加了正確的 span。在 android-text sample 我們把項目符號點標記標簽轉換為了項目符號點。這是通過給文本在正確的位置附加 BulletPointSpans 。 下面展示了它是如何被測試的:

查看 MarkdownBuilderTest 獲取更多測試示例。

span 是一個非常強大的概念,它深深的嵌入在文本渲染功能中。它們可以訪問 TextPaint 和 Canvas 等組件,這些組件允許在 Android 上使用高度可自定義的文本樣式。在 Android P 中,我們?yōu)?framework span 添加了大量文檔,所以,在實現(xiàn)你自己的 span 之前,查看那些能夠獲取到的內容。

在以后的文章中,我們將向你詳細介紹 span 在底層是如何工作的以及怎樣高效地使用它們。例如,你需要使用 textView.setText(CharSequence, BufferType) 或者 Spannable.Factory 。 有關原因的詳細信息,請保持關注。

本文原作者 Florina Muntenescu ,Android Developer Advocate @Google . 原文地址: . 本文由 TonnyL 翻譯,發(fā)表在:

文章題目:探索Android,探索發(fā)現(xiàn)
URL分享:http://chinadenli.net/article13/dsshpgs.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站企業(yè)建站外貿網(wǎng)站建設做網(wǎng)站網(wǎng)站內鏈全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網(wǎng)站建設