導航:首頁 > 知識產權 > kotlin版權

kotlin版權

發布時間:2021-06-21 01:42:16

『壹』 為什麼Java越來越火

Java是由Sun Microsystems公司於1995年5月推出的Java面向對象程序設計語言和Java平台的總稱。由James Gosling和同事們共同研發,並在1995年正式推出。
Java分為三個體系:
JavaSE(J2SE)(Java2 Platform Standard Edition,java平台標准版)
JavaEE(J2EE)(Java 2 Platform,Enterprise Edition,java平台企業版)
JavaME(J2ME)(Java 2 Platform Micro Edition,java平台微型版)。
2005年6月,JavaOne大會召開,SUN公司公開Java SE 6。此時,Java的各種版本已經更名以取消其中的數字"2":J2EE更名為Java EE, J2SE更名為Java SE,J2ME更名為Java ME。
主要特性
Java語言是簡單的:
Java語言的語法與C語言和C++語言很接近,使得大多數程序員很容易學習和使用。另一方面,Java丟棄了C++中很少使用的、很難理解的、令人迷惑的那些特性,如操作符重載、多繼承、自動的強制類型轉換。特別地,Java語言不使用指針,而是引用。並提供了自動的廢料收集,使得程序員不必為內存管理而擔憂。如果你想學習Java可以來這個群,首先是二二零,中間是一四二,最後是九零六,裡面有大量的學習資料可以下載。
Java語言是面向對象的:
Java語言提供類、介面和繼承等原語,為了簡單起見,只支持類之間的單繼承,但支持介面之間的多繼承,並支持類與介面之間的實現機制(關鍵字為implements)。Java語言全面支持動態綁定,而C++語言只對虛函數使用動態綁定。總之,Java語言是一個純的面向對象程序設計語言。
Java語言是分布式的:
Java語言支持Internet應用的開發,在基本的Java應用編程介面中有一個網路應用編程介面(java net),它提供了用於網路應用編程的類庫,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(遠程方法激活)機制也是開發分布式應用的重要手段。
Java語言是健壯的:
Java的強類型機制、異常處理、垃圾的自動收集等是Java程序健壯性的重要保證。對指針的丟棄是Java的明智選擇。Java的安全檢查機制使得Java更具健壯性。
Java語言是安全的:
Java通常被用在網路環境中,為此,Java提供了一個安全機制以防惡意代碼的攻擊。除了Java語言具有的許多安全特性以外,Java對通過網路下載的類具有一個安全防範機制(類ClassLoader),如分配不同的名字空間以防替代本地的同名類、位元組代碼檢查,並提供安全管理機制(類SecurityManager)讓Java應用設置安全哨兵。
Java語言是體系結構中立的:
Java程序(後綴為java的文件)在Java平台上被編譯為體系結構中立的位元組碼格式(後綴為class的文件),然後可以在實現這個Java平台的任何系統中運行。這種途徑適合於異構的網路環境和軟體的分發。
Java語言是可移植的:
這種可移植性來源於體系結構中立性,另外,Java還嚴格規定了各個基本數據類型的長度。Java系統本身也具有很強的可移植性,Java編譯器是用Java實現的,Java的運行環境是用ANSI C實現的。
Java語言是解釋型的:
如前所述,Java程序在Java平台上被編譯為位元組碼格式,然後可以在實現這個Java平台的任何系統中運行。在運行時,Java平台中的Java解釋器對這些位元組碼進行解釋執行,執行過程中需要的類在聯接階段被載入到運行環境中。
Java是高性能的:
與那些解釋型的高級腳本語言相比,Java的確是高性能的。事實上,Java的運行速度隨著JIT(Just-In-Time)編譯器技術的發展越來越接近於C++。
Java語言是多線程的:
在Java語言中,線程是一種特殊的對象,它必須由Thread類或其子(孫)類來創建。通常有兩種方法來創建線程:其一,使用型構為Thread(Runnable)的構造子將一個實現了Runnable介面的對象包裝成一個線程,其二,從Thread類派生出子類並重寫run方法,使用該子類創建的對象即為線程。值得注意的是Thread類已經實現了Runnable介面,因此,任何一個線程均有它的run方法,而run方法中包含了線程所要運行的代碼。線程的活動由一組方法來控制。Java語言支持多個線程的同時執行,並提供多線程之間的同步機制(關鍵字為synchronized)。
Java語言是動態的:
Java語言的設計目標之一是適應於動態變化的環境。Java程序需要的類能夠動態地被載入到運行環境,也可以通過網路來載入所需要的類。這也有利於軟體的升級。另外,Java中的類有一個運行時刻的表示,能進行運行時刻的類型檢查。

還有我們所熟知的安卓更是促進了Java語言的發展

那麼我們聊聊為什麼安卓開發會用Java呢?
下面是一位來自知乎網友的回答:
首先我們需要選用一個語言來開發本地App。
那麼,我們第一步幹啥了。
在現有的語言中挑選語言。
那麼首先考慮的條件是不火的語言和沒前途的語言是不在選擇范圍的。
---因為沒人用,那麼庫就會少。因為庫少就不會好用。因為不好用。所以用的人更少。生態圈的核心思想。
--那這個世界是不是只有C++/Java了。肯定不是。因為有些語言是有前途的。最大的特點是。簡化了程序員的負擔。或者效率更高。未來肯定是主流。
那麼我們常用的語言和有前景的語言是哪些
C/C++/Java/C#/Python/Ruby/Go/JavaScript+Html
好。這些是我們常用的語言。我們看待的是怎麼把這些語言一步步的踢掉。然後只剩下Java的。
首先踢掉的是C。至今大型的超過10萬行代碼的圖形化界面程序沒有幾個是用C的。因為復雜的錯誤處理和沒有糾錯機制。使得程序非常容易崩潰。同時。因為C沒有面向對象。那麼工程化開發顯得非常麻煩。
相信沒有人現在主動說。用C開發App這種多界面程序吧。
繼續踢掉的是C#。我幹嘛要用一個一出生就為了對付Java的。還是微軟的私貨的語言。對。Android是開源界的。而C#註定不是適合開源界的語言。
那我們繼續踢語言:
我們該要一門重語言還是輕語言?
Java/C++/C#/Go/C是重語言。
Python/Ruby/JavaScript+Html/是輕語言。
對。我心目中劃分語言的標准基本上是屬於這樣的,只要在代碼中體現我們需要講效率的。那就是重語言。
重語言首先講究的是運行效率。然後講究工程化。
輕語言講究開發效率,講究敏捷性開發。
回到我們選語言的原則。
我們想開發一款本地App。還在性能不高的手機上。
那麼除了C之外的開發語言中。運行效率最高的是C++,然後是Java。
那麼輕型語言就要被一個個踢掉了。
Ruby在網頁端有作為。但是庫太少。圖形庫更少,開發者都是網頁端的人。被踢。
JavaScript+Html - ----> 這是未來大一統的趨勢。但是我們現在是找一門開發本地App的語言。
外加真心html+JavaScript有著先天的劣勢。(效率+Offline)
Python有著完善的庫。有著極高的人氣社區。在手機上開發也有過嘗試。(Nokia就干過這事。Ubuntu Phone的UML也是一種類python的語言。)Google也是python的大用戶。效率是問題。但是不是絕對的。先對Python實現保留意見。
那麼我們看這一輪入圍的四門語言
Java/C++/Python/Go
再說Go。Go語言還不成熟。庫也不多。開發者少。但是作為Google主打的語言。很有可能。Google會提供基於Go的Android sdk。至少現在Android的主打語言不會是Go。
剩下三門
C++/Python/Java
C++重運行效率。但是跨平台性較弱。開發難度較高。庫多,用的人多。
Python,重開發效率。跨平台性高。開發難度低,庫多,用的人多。
Java。重開發效率。不及python,重運行效率,不及C++。開發難度低。庫多。用的人多。
那再回到需求:
Google是想要一門開發本地App的語言。Google想屏蔽掉底層硬體的差異。實現對於開發者來說是一個統一的平台。
同時。對於手機這個現階段的平台來說。耗電,以及性能。是無法迴避的問題。
那麼這門語言的跨平台性要求很高。同時效率又很高。
說Python:效率實在無法達到其普遍的手機要求。尤其是對於圖像處理這種高計算操作。且。社區無法與C++/Java相比。意味著庫沒有Java和C++多,開發者不是跟Java和C++一個等級的。
說C++:用過JNI的人都知道本地的C/C++庫,至少要編譯多次。不同的框架就代表者不同的編譯環境。而且直接用C++編譯運行的話。C++並不能很好的屏蔽掉硬體差異。所以對於開發來說調試來說,都是一個比較艱巨的任務。
C++也不是一個非常好的工程化開發語言。
那有沒有破解法。Qt。可以用框架屏蔽掉大部分的細節操作。Qt5.0支持Android。
為什麼沒用。估摸著是跟Qt不是Google家的產品加不開源的問題吧。
說Java:虛擬機是核心。因為虛擬機真正能屏蔽掉開發的很多差異。而且通過虛擬機。開發者只要在打包的時候翻譯成運行碼而不需要翻譯成機器碼。通過虛擬機完成很多差異的解決。而效率並不是丟的非常嚴重。
且Java比C++更受開源界和工業界的共同歡迎。即使Java也有版權問題。。。
我們屏蔽掉最基礎的硬體差異。通過Linux,在屏蔽掉手機的一些基本功能差異。然後提供純粹的利於開發者開發和測試的方法。只有通過虛擬機了。而這個虛擬機是需要講性能的。
Google搞了一個Davlik虛擬機。對。這就是Android的核心。就是因為性能要求高。不得不重新開發虛擬機。Davlik就是一個非常講效率的虛擬機。而其他的常用庫都有的,現成的。根本就不需要自己去寫的。只要打包就好。
那麼還有些必須考效率的庫和應用。怎麼辦。
用JNI技術調用C++
對就這么坑爹。
為什麼Object-C這門語言無視我說的大部分要求了。因為Apple有能力創造一門更好的語言。Google對於Android,只是在開源社區挑一門語言。
且。ObjectC生在Apple,死在Apple。兼容性。人家才不需要考慮。所以人家敢用Object-C,而Android為了實現真正的跨平台。只能選Java。

『貳』 如何看待 Kotlin 成為 Android 官方支持開發語言

由於甲骨文收購了java,老因為java版權和谷歌問題打官司,所以谷歌為了戰略利益,選擇其它優秀的開發語言,是不得已而為之

『叄』 從允許華為參與5G到暫停與華為合作,英國態度轉變為何這么快

原文:通過美帝對華為的技術霸凌透見Java的戰爭!

2019年5月,徹底撕破臉的特朗普掀起對華為的戰爭,谷歌被迫吊銷了華為的安卓授權。開源軟體的版權問題,使我不禁想起軟體業的一宗驚天巨案。

看過《手機基帶晶元故事》的朋友,一定記得喬布斯曾強烈表達過對谷歌抄襲蘋果的憤怒:「我要用盡蘋果400億美金的存款,發動一場熱核戰爭,來摧毀安卓,because it's a stolen proct。」

千萬別認為喬幫主只是說著玩的。

雖然他不幸仙去多年,他最好的朋友甲骨文(Oracle)董事長拉里埃里森仍然在堅持這項未竟的事業。

桀驁不羈的埃里森在回顧喬布斯臨終情景時動情地說:他已經被癌症消耗光了,他實在太累了又太痛了。雖然他絕對是我見過最堅強的人,但他還是最終放棄了和死神的對抗。他最後停葯的決定震驚了所有人,三天後幫主駕鶴西去。

眾所周知,美國是法官立法的國家。聯邦最高法院的判決會深遠影響軟體業的很多懸案。

法官們還要決定的是,谷歌的抄襲行為是故意侵權還是合理使用。甲骨文已經舉證說安卓在10年間為谷歌賺了超過420億美元。

對甲骨文不利的是,安卓已經是大到不能倒了,沒有法官會支持禁止安卓手機的銷售。正因為如此,谷歌一直把案件拖了九年。

藉此充足的時間,谷歌把安卓Java 庫轉到OpenJDK,把DVM轉到ART,把Java語言轉到Kotlin。

六、

2019年4月底,聯邦最高法院正式發文給美國司法部,要求聯邦檢察官協助斷案。這似乎是美國三權分立的一個漏洞,但也說明了此案判決難度極大。

似乎大多數程序員都很厭惡甲骨文對開源的霸道行為,但是埃里森為喬布斯「復仇」的舉動又讓人充滿感動。畢竟谷歌確實存在「抄襲」蘋果和Java的行為並由此獲取了巨額利潤。

考慮到對喬幫主的感情和華為的事情,我自己內心還是希望谷歌最終付出代價。

『肆』 安卓app主要用什麼編程語言的

安卓App用Java和Kotlin作為開發語言。

Google IO 2017宣布了 Kotlin 會成為 Android 官方開發語言。在Kotlin 語言出現之前,幾乎所有的安卓應用程序都是使用Java語言編寫的。

(4)kotlin版權擴展閱讀

Google在今年I/O2017開發者大會中宣布,正式把Kotlin納入Android程序的一級開發語言(First-classlanguage),並與開發團隊JetBrains合組非牟利基金會推廣Kotlin。據多間外國媒體報導,這是GoogleI/O開發者大會中引來最多歡呼聲的消息。

Kotlin將於AndroidStudio3.0得到支持,JetBrians指開發者不用再安裝額外元件或擔心兼容問題。Kotlin能與Java互通,但擁有Java不支持的功能。Google相信利用Kotlin可使Android程序開發更快捷有趣,但他們補充,此舉絕非取代Java和C++的官方支持。

『伍』 在一個Activity的java程序中,具體看問題描述

1、Intent

Intent是各個組件之間交互的一種重要方式,它不僅可以指明當前組件想要執行的動作,而且還能在各組件之間傳遞數據。Intent一般可用於啟動Activity、啟動Service、發送廣播等場景。

Intent大致可分為2中:

1、顯示Intent

2、隱式Intent

1.1、顯示Intent打開Activity

fun openActivity(){
val intent = Intent(this, KotlinFirstActivity::class.java)

intent.putExtra("param", "testParams")

startActivity(intent)

}

注意:KotlinFirstActivity::class.java就相當於Java中的KotlinFirstActivity.class。

1.2、隱式Intent打開程序內的Activity

相比於顯示Intent,隱式Intent並不指明啟動那個Activity而是指定了一系列的action和category,然後交由系統去分析找到合適的Activity並打開。

什麼是合適的Activity,其實就是和隱式Intent中指定的action和category完全匹配的Activity,而action和category我們可以在AdnroidManifest中指定。

在標簽中配置了action和category,只有和隱式Intent中的action和category完全匹配才能正常的打開該頁面。

val intent = Intent("com.example.abu.alertdialogdemo.ACTION_START")

startActivity(intent)

不是說action和category要完全匹配才能打開頁面嗎?這是因為android.intent.category.DEFAULT是一種默認的category,在調用startActivity()時會自動將這個category添加到Intent中。所以在Manifest中一定不要忘記配置這個默認的category:android.intent.category.DEFAULT,否則會報錯。

還有一點需要注意:Intent中只能添加一個action,但是可以添加多個category。

1.3、隱式Intent打開程序外的Activity

比如我們要打開系統的瀏覽器

fun openWeb(view: View) {
val intent = Intent(Intent.ACTION_VIEW)

intent.data = Uri.parse("https://www..com")

startActivity(intent)

}

Intent.ACTION_VIEW是系統內置的動作,然後將https://www..com通過Uri.parse()轉換成Uri對象,傳遞給intent.setData(Uri uri)函數。Kotlin中intent.data=Uri.parse("https://www..com")就相當於Java中的intent.setData(Uri.parse("https://www..com")),這是Kotlin中的語法糖。

與此對應在標簽中配置一個標簽,用於更精確的指定當前Activity能夠相應的數據。標簽中主要可以配置一下內容:

1、android:scheme:用於指定數據的協議部分,如https

2、android:host:用於指定數據的主機名部分,如www..com

3、android:port:用於指定數據的埠,一般緊隨主機名後

4、android:path:用於指定數據的路徑

5、android:mimeType:用於指定支持的數據類型

只有當標簽中指定的內容和Intent中攜帶的data完全一致時,當前Activity才能響應該Intent。下面我們通過設置data,讓它也能響應打開網頁的Intent。

我們在ThirdActivity的中配置當前Activity能夠響應的action是Intent.ACTION_VIEW的常量值,而category指定了默認的category值,另外在標簽data中我們通過android:scheme="https"指定了數據的協議必須是https。另外由於AndroidStudio認為能夠響應ACTION_VIEW的Activity都應該加上BROWSABLE的category,否則會報出警告。加上BROWSABLE的category是為了實現deep link 功能和目前學習無關,所以我們在intent-filter標簽上添加tools:ignore="AppLinkUrlError"忽略警告。

然後我們就能通過隱式Intent的方法打開ThirdActivity了,代碼如下:

val intent= Intent(Intent.ACTION_VIEW)

intent.data=Uri.parse("https:")

startActivity(intent)

除了指定android:scheme為https我們也能隨意指定它的值,只需要保證AndroidManifest中設置的值和Intent中設置的data相對應即可。

2、Activity的生命周期

Activity類中定義了7個回調方法,覆蓋了Activity聲明周期的每一個環節。

1、onCreate(): 在Activity第一次創建時調用

2、onStart():在Activity可見但是沒有焦點時調用

3、onResume():在Activity可見並且有焦點時調用

4、onPause():這個方法會在准備啟動或者恢復另一個Activity時調用,我們通常在該方法中釋放消耗CPU的資源或者保存數據,但在該方法內不能做耗時操作,否則影響另一個另一個Activity的啟動或恢復。

5、onStop():在Activity不可見時調用,它和onPause主要區別就是:onPause在失去焦點時會調用但是依然可見,而onStop是完全不可見。

6、onDestory():在Activity被銷毀前調用

7、onRestart():在Activity由不在棧頂到再次回到棧頂並且可見時調用。

為了更好的理解Activity的生命周期,看下圖

Activity生命周期.png

3、體驗Activity的生命周期

下面我們通過實例更直觀的看下Activity的生命周期過程。

1、打開FirstActivity,生命周期過程如下

FirstActivity onCreate

FirstActivity onStart

FirstActivity onResume

2、在FirstActivity中打開SecondActivity,生命周期過程如下

FirstActivity onPause

SecondActivity onCreate

SecondActivity onStart

SecondActivity onResume

FirstActivity onStop

可以看到在打開SecondActivity時FirstActivity的onPause會執行,所以在onPause中是不能做耗時操作的,否則會影響SecondActivity的打開。

3、按返回鍵回到FirstActivity,生命周期過程如下

SecondActivity onPause

FirstActivity onRestart

FirstActivity onStart

FirstActivity onResume

SecondActivity onStop

SecondActivity onDestroy

可以看到在返回FirstActivity時會調用SecondActivity的onPause,如果SecondActivity的onPause中做了耗時操作的話,那麼也會影響Activity的返回。而且當FirstActivity再次回到棧頂時會調用其onRestart,此時並不會執行onCreate因為FirstActivity並沒有銷毀。

4、Activity被回收了時的生命周期

現在描述一種場景:打開ActivityA,然後在ActivityA的頁面中打開ActivityB,此時ActivityA不在棧頂了如果內存不足可能會被回收,此時從ActivityB再回到ActivityA,下面描述下整個過程的生命周期。

1、打開ActivityA,執行的生命周期

ActivityA onCreate

ActivityA onStart

ActivityA onResume

2、打開ActivityB執行的生命周期

ActivityA onPause

ActivityB onCreate

ActivityB onStart

ActivityB onResume

ActivityA onStop

3、此時因內存不足,導致ActivityA被回收了,並返回ActivityA

ActivityA onDestory

ActivityB onPause

ActivityA onCreate

ActivityA onStart

ActivityA onResume

ActivityB onStop

從上面可以看出在ActivityA被回收後再次回到ActivityA時不再調用ActivityA的onRestart了,而是調用了ActivityA的onCreate,因為ActivityA已經被銷毀了。

5、Activity被銷毀,其中的臨時數據怎麼辦

ActivityA被銷毀了,這也就說明其中的臨時數據也會丟失了,比如ActivityA中有一個EditText,我們在其中輸入了一段文字,然後啟動ActivityB,此時由於內存緊張處於停止狀態的ActivityA被回收了,返回到ActivityA你會發現EditText中輸入的文字不見了,因為ActivityA重新創建了。

為此Activity提供了onSaveInstanceState方法,該方法能確保在被回收之前被調用,我們就能在onSaveInstanceState方法中進行臨時數據的保存,然後我們可以在onCreate(savedInstanceState: Bundle?)中利用savedInstanceState進行數據的恢復。Activity被回收重新創建時onCreate(savedInstanceState: Bundle?)中的savedInstanceState不再為null否則為null,其中帶有在savedInstanceState中保存的所有數據。

具體代碼如下:

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

Log.e("tag", "$tag onCreate")

//恢復數據

val tempData = savedInstanceState?.getString("data") ?: ""

et.setText(tempData)

}

//保存數據

override fun onSaveInstanceState(outState: Bundle?) {
super.onSaveInstanceState(outState)

Log.e("tag", "$tag onSaveInstanceState")

val tempData = et.text.toString().trim()

outState?.putString("data", tempData)

}

6、onSaveInstanceState()調用時機

1、用戶按下HOME鍵

2、長按HOME鍵進入其他程序

3、按下電源鍵關閉屏幕

4、從ActivityA跳轉到一個新的Activity

5、屏幕方向切換時,如從豎屏變成橫屏

總而言之,onSaveInstanceState()是在你的Activity有可能在未經允許的情況下被回收時調用,Activity被銷毀之前onSaveInstanceState()肯定會被觸發,我們可以onSaveInstanceState()中保存臨時數據,持久化的數據可以在onPause()中保存。

另外,雖然屏幕方向切換時,會造成Activity的重建會調用onSaveInstanceState(),但是不建議使用onSaveInstanceState()進行數據的保存,我們可以禁止屏幕的旋轉或禁止屏幕旋轉時Activity的重建。

禁止屏幕旋轉

可以在Mainifest中設置屏幕固定為豎屏

android:screenOrieritation="portrait"

禁止屏幕旋轉時Activity的重建

android:configChanges="orientation丨keyboardHidden丨screenSize"

7、Activity的啟動模式

啟動模式分為4種:

1、standard

2、singleTop

3、singleTask

4、singleInstance

我們可以在Manifest中通過android:launchMode指定啟動模式。

7.1、standard模式

如果不顯示指定啟動模式,那麼Activity的啟動模式就是standard,在該模式下不管Activity棧中有無該Activity,均會創建一個新的Activity並入棧,並處於棧頂的位置。

7.2、singleTop模式

1、要啟動的Activity位於棧頂

在啟動一個ActivityA時,如果棧頂的Activity就是ActivityA,那麼就不會重新創建ActivityA,而是直接使用,此時並不會調用ActivityA的onCreate(),因為並沒有重新創建Activity,ActivityA的生命周期如下:

ActivityA onPause

ActivityA onNewIntent

ActivityA onResume

可以看到調用了onNewIntent(intent: Intent?),我們可以在onNewIntent(intent: Intent?)中通過intent來獲取新傳遞過來的數據,因為此時數據可能已經發生了變化。

2、要啟動的Activity不在棧頂

雖然我們指定了ActivityA的啟動模式為singleTop,但是如果ActivityA在棧中但是不在棧頂的話,那麼此時啟動ActivityA的話會重新創建一個新的ActivityA並入棧,此時棧中就有2個ActivityA的實例了。

7.3、singleTask模式

如果准備啟動的ActivityA的啟動模式為singleTask的話,那麼會先從棧中查找是否存在ActivityA的實例:

場景一、如果存在則將ActivityA之上的Activity都出棧,並調用ActivityA的onNewIntent()。

場景二、如果ActivityA位於棧頂,則直接使用並調用onNewInent(),此時和singleTop一樣。

場景三、 如果棧中不存在ActivityA的實例則會創建一個新的Activity並入棧。

場景一:ActivityA啟動ActivityB,然後啟動ActivityA,此時生命周期過程:

ActivityB onPause

ActivityA onRestart

ActivityA onStart

ActivityA onNewIntent

ActivityA onResume

ActivityB onStop

ActivityB onDestroy

此時ActivityA不在棧頂,ActivityA之上有ActivityB,所以在啟動ActivityA時ActivityA之上的ActivityB會出棧,ActivityA將置於棧頂,所以ActivityA的onRestart和ActivityB的onDestory會執行。

場景二:ActivityA啟動ActivityA,此時生命周期過程:

ActivityA onPause

ActivityA onNewIntent

ActivityA onResume

此時ActivityA位於棧頂,此時singleTask和singleTop作用一樣,都是直接使用ActivityA,並且會調用ActivityA的onPause、onNewIntent、onResume。

場景三:ActivityA啟動ActivityB,此時生命周期過程:

ActivityA onCreate

ActivityA onStart

ActivityA onResume

7.4、singleInstance模式

不同於另外3個模式,指定singleInstance模式的Activity會啟動一個新的返回棧來管理這個Activity(其實如果singleTask模式指定了不同的taskAffinity,也會啟動一個新的返回棧),這么做的意義是什麼?

想像一個場景:如果我們程序內的一個Activity是允許其他程序訪問的,如果想實現其他程序和我們程序能共享這個Activity實例,該怎麼實現呢?使用前面3中模式是無法做到的,因為每個應用程序都有自己的返回棧,同一個Activity在不同返回棧中肯定都創建了新的實例,而使用singleInstance就可以解決這個問題。在這種模式下,會有一個單獨的返回棧來管理這個Activity,無論哪個應用程序來訪問這個Activity,都在同一個返回棧中,也就解決了共享Activity實例的問題。

為了更好的理解下面我們實戰一下:

1、將ActivityB的啟動模式修改為singleInstance

android:name=".ActivityB"

android:launchMode="singleInstance" />

2、在ActivityA、ActivityB、ActivityC的onCreate中列印taskId

##ActivityA

val tag = javaClass.simpleName

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

Log.e("TAG", "$tag taskId=$taskId")

}

##ActivityB

val tag = javaClass.simpleName

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

setContentView(activity_second)

Log.e("TAG", "$tag taskId=$taskId")

}

##ActivityC

val tag = javaClass.simpleName

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

setContentView(activity_c)

Log.e("TAG", "$tag taskId=$taskId")

}

在Kotlin中javaClass是當前實例的Class對象,相當於Java的getClass().

在Kotlin中ActivityB::class.java是獲取ActivityB類的Class對象,相當於Java中的ActivityB.class。

3、啟動ActivityA->啟動ActivityB->啟動ActivityC,taskId列印結果如下:

ActivityA taskId=4163

ActivityB taskId=4164

ActivityC taskId=4163

可以看到ActivityB的taskId是不同於ActivityA 和ActivityC的,這也說明了ActivityB 是在一個單獨的棧中的,並且返回棧中只有這一個Activity。

4、在ActivityC中按返回鍵,返回到ActivityA,再按返回鍵返回到ActivityB,這是為什麼呢?其實很好理解:ActivityA 和ActivityC 在同一個返回棧中,在ActivityC 中按返回鍵ActivityC 出棧,此時ActivityA就位於棧頂了,ActivityA就展示在界面上了,在ActivityA中再按返回鍵,這是當前的返回棧已經空了,於是就展示了另一個返回棧棧頂的ActivityB了。
————————————————
版權聲明:本文為CSDN博主「保瓶兒」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_31211457/article/details/114052641

『陸』 kotlin自學視頻教程求百度雲盤

現在網路雲盤已經不允許放這些資源了,涉及版權。可以嘗試用電驢找找。

閱讀全文

與kotlin版權相關的資料

熱點內容
武漢疫情投訴 瀏覽:149
知識產權合作開發協議doc 瀏覽:932
廣州加里知識產權代理有限公司 瀏覽:65
企業知識產權部門管理辦法 瀏覽:455
消費315投訴 瀏覽:981
馬鞍山鋼城醫院 瀏覽:793
馮超知識產權 瀏覽:384
介紹小發明英語作文 瀏覽:442
版權使用權協議 瀏覽:1000
2018年基本公共衛生服務考核表 瀏覽:884
馬鞍山候車亭 瀏覽:329
學校矛盾糾紛排查領導小組 瀏覽:709
張江管委會知識產權合作協議 瀏覽:635
關於開展公共衛生服務項目相關項目督導的函 瀏覽:941
閨蜜證書高清 瀏覽:11
轉讓房轉讓合同協議 瀏覽:329
矛盾糾紛排查調處工作協調交賬會議紀要 瀏覽:877
雲南基金從業資格證書查詢 瀏覽:313
新知識的搖籃創造力 瀏覽:187
股轉轉讓協議 瀏覽:676