摘要:該始終是其唯一僅有的成員,由此啟動(dòng)的任何,如果沒有指定返回棧名稱,則新啟動(dòng)的放入默認(rèn)的返回棧如果指定了返回棧名稱,則將新啟動(dòng)的放入指定的返回棧中。
1. 簡介
? ? ? ?本篇不針對于新手,而是對于Activity中一些常識或者問題進(jìn)行總結(jié)。Activity是Android四大組件之一,為用戶提供與系統(tǒng)交互的界面,每一個(gè)應(yīng)用都有一個(gè)或者多個(gè)Acticity,這樣會有各種各樣的細(xì)節(jié)問題需要查找,我將本人接觸到的知識點(diǎn)匯總到此篇文章。
2. 生命周期? ? ? ?Activity生命周期的回調(diào)主要有onCreate()、onRestart()、onStart()、onResume()、onPause()、onStop()、onDestory()這幾個(gè)方法,Activity的生命周期類別主要分為三種,如下。
整個(gè)生命周期,Activity完整生命周期發(fā)生在onCreate()和onDestroy()之間。在onCreate()中執(zhí)行一些全局性的設(shè)置(例如設(shè)置布局文件,初始化View等等),在onDestroy()中釋放所有資源
可見生命周期,Activity可見生命周期發(fā)生在onStart()和onStop()之間,在這段時(shí)間內(nèi),用戶可以在屏幕上看見Activity并與之交互。在整個(gè)生命周期,Activity對用戶可見和隱藏兩種狀態(tài)可能交替出現(xiàn),系統(tǒng)就會多次調(diào)用onStart()和onStop()方法。
前臺生命周期,Activity的前臺生命周期發(fā)生在onResume()和onPause()之間,在這段時(shí)間內(nèi),Activity位于屏幕上其他Activiy之前,而且獲取屏幕的焦點(diǎn)。Activity可能頻繁的轉(zhuǎn)入或轉(zhuǎn)出前臺,例如當(dāng)設(shè)備休眠或者彈出對話框時(shí),系統(tǒng)會調(diào)用onPause()方法。因?yàn)榇藸顟B(tài)可能經(jīng)常發(fā)生變化,所以在這兩個(gè)方法中建議做一些輕量級操作。
Activity生命周期圖如下:
3. 啟動(dòng)與關(guān)閉 3.1 啟動(dòng)被啟動(dòng)的Activity必須要在AndroidManifest.xml文件中聲明,否則會拋出異常。
正常啟動(dòng)一個(gè)Activity的代碼如下:
// 顯示啟動(dòng) Intent intent = new Intent(this, MyActivity.class); // 設(shè)置傳遞的數(shù)據(jù) intent.put(KEY_NAME, value); startActivity(intent); // 隱式啟動(dòng) Intent intent = new Intent(ACTION_NAME); // 設(shè)置其他匹配規(guī)則 ... // 設(shè)置傳遞的數(shù)據(jù),bundle數(shù)據(jù)集 intent.putExtras(bundle); startActivity(intent);
啟動(dòng)一個(gè)Activity并獲取其執(zhí)行結(jié)果。
Intent intent = new Intent(this, MyActivity.class); startActivityForResult(intent, REQUEST_CODE);
需要當(dāng)前Activity重寫onActivityResult()方法以獲取結(jié)果。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // 如果結(jié)果碼是OK,而且請求碼和我們設(shè)置的請求碼相同 if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE) { // 其他操作 } }3.2 關(guān)閉
finish()結(jié)束當(dāng)前的Activity
finishActivity(int requestCode)結(jié)束當(dāng)前Activity使用startActivityForResult()方法啟動(dòng)的子Activity
4. 啟動(dòng)其他Activity時(shí)候生命周期協(xié)調(diào)? ? ? ?當(dāng)一個(gè)Activity A去啟動(dòng)一個(gè)新的Activity B時(shí)候,A和B的生命周期并不是依次進(jìn)行,也就是說它們的生命周期會有所重疊。在創(chuàng)建B的時(shí)候,A不會完全停止,更確切的說,啟動(dòng)B的過程與A停止的過程會有重疊。所以A和B生命周期回調(diào)的順序就很重要了,回調(diào)順序如下。
Activity A的onPause()方法執(zhí)行
Activity B的onCreate()、onStart()、onResume()方法依次執(zhí)行。onResume()方法執(zhí)行后,Activity B獲取屏幕焦點(diǎn)
Activity A的onStop()方法執(zhí)行
? ? ? ?在知道了從一個(gè)Activity到另一個(gè)Activity轉(zhuǎn)變時(shí)候生命周期的順序,平時(shí)研發(fā)時(shí)候就需要注意了。例如,當(dāng)必須在第一個(gè)Activity停止之前存儲數(shù)據(jù),以便下一個(gè)Activity能夠使用,應(yīng)該在onPause()方法中儲存而不是onStop()方法中。
5. 狀態(tài)保存? ? ? ?用戶與頁面交互過程中,會出現(xiàn)應(yīng)用前后臺切換或者進(jìn)入其他頁面等等的情況,也就是Activity調(diào)用暫停(onPause)或者停止(onStop)但是未調(diào)用(onDestroy),此時(shí)Activity仍然在內(nèi)存中,其有關(guān)狀態(tài)和成員信息處于活躍狀態(tài),用戶在Activity中所作的任何更改都會得到保留,這樣一來,當(dāng)Activity返回前臺繼續(xù)執(zhí)行時(shí)候,這些更改信息依然存在,頁面能夠繼續(xù)顯示。
? ? ? ?但是一旦系統(tǒng)需要內(nèi)存而將某個(gè)Activity銷毀時(shí),當(dāng)再次回到這個(gè)Activity,系統(tǒng)需要重建這個(gè)Activity,但是用戶并不知道系統(tǒng)銷毀了這個(gè)Activity需要重建,他們希望返回頁面時(shí)候頁面還是保存之前的狀態(tài)。這種情況下,需要我們手動(dòng)將一些信息給保存起來,可以實(shí)現(xiàn)Activity中的另一個(gè)回調(diào)方法onSaveInstanceState(),保存Activity狀態(tài)的一些重要信息。系統(tǒng)會向該方法傳遞一個(gè)Bundle,然后我們可以向這個(gè)Bundle里面儲存一些重要信息。當(dāng)系統(tǒng)重建Activity時(shí)候,系統(tǒng)會將這個(gè)Bundle同時(shí)傳遞給onCreate()和onRestoreInstanceState()方法,我們可以在這兩個(gè)方法中恢復(fù)之前場景。
看一下狀態(tài)保存的介紹圖。
面試時(shí)候可能會問到onSaveInstanceState()調(diào)用時(shí)機(jī),看一下官方源代碼的注釋。
Do not confuse this method with activity lifecycle callbacks such as {@link #onPause}, which is always called when an activity is being placed in the background or on its way to destruction, or {@link #onStop} which is called before destruction. One example of when {@link #onPause} and {@link #onStop} is called and not this method is when a user navigates back from activity B to activity A。
不要把onSaveInstanceState()這個(gè)方法和Activity生命周期的幾個(gè)方法混淆了,這個(gè)方法只有在Activity切換到后臺或者即將被銷毀時(shí)候被調(diào)用。有一個(gè)例子是如果從Activity B返回到Activity A,這個(gè)方法是不會被調(diào)用的。
? ? ? ?也許很難理解這段注釋的意思,我個(gè)人理解是,如果一個(gè)Activity失去了屏幕焦點(diǎn)后,失去屏幕焦點(diǎn)一般是指onPause()和onStop()方法被調(diào)用,onSaveInstanceState()方法就會被調(diào)用,有一種特殊情況是從一個(gè)Activity B返回到上一個(gè)Activity A,這個(gè)方法并不會被調(diào)用。
個(gè)人總結(jié)了一下,大體有以下幾種情況會調(diào)用onSaveInstanceState()
按下Home將程序切換到后臺
關(guān)閉屏幕
Activity A啟動(dòng)一個(gè)新的Activity B,會回調(diào)A中onSaveInstanceState()方法
屏幕橫豎屏方向切換
長按Home或者菜單鍵進(jìn)入程序列表頁面
為什么平時(shí)并沒有實(shí)現(xiàn)onSaveInstanceState()和onRestoreInstanceState()方法,但是有些時(shí)候,Activity中的UI狀態(tài)依然得到了保存,是為什么?
? ? ? ?在Android中,Activity類的onSaveInstanceState()方法默認(rèn)實(shí)現(xiàn)會調(diào)用布局中每個(gè)View的onSaveInstanceState()方法去保存其本身的狀態(tài)信息,Android框架中幾乎每個(gè)控件都會實(shí)現(xiàn)這個(gè)方法。我們只需要為想要保存其狀態(tài)的每個(gè)控件提供一個(gè)唯一的ID(在xml中設(shè)置 android:id屬性),如果控件沒有 ID,則系統(tǒng)無法保存其狀態(tài)。
? ? ? ?我們可以通過將View的android:saveEnabled屬性設(shè)置為false或通過調(diào)用View的setSaveEnabled()方法顯式阻止布局內(nèi)的視圖保存其狀態(tài),通常不需要設(shè)置這些屬性,但如果想以不同方式恢復(fù)Activity UI的狀態(tài),可以這樣做。
注:由于無法保證系統(tǒng)調(diào)用onSaveInstanceState()的時(shí)機(jī),我們只用它來保存Activity的瞬間狀態(tài),不要用它來儲存持久性數(shù)據(jù),上面提到過,建議在onPause()中儲存持久性數(shù)據(jù)。
6. 啟動(dòng)模式敲黑板敲黑板,劃重點(diǎn)來了,同學(xué)們快拿出筆和紙快做筆記。
? ? ? ?一個(gè)應(yīng)用一般包含很多Activity,它們按照各自打開的順序排列在返回棧(Back Stack)中,這些Activity統(tǒng)稱為Task。大多數(shù)Task的起點(diǎn)是用戶在屏幕中點(diǎn)擊應(yīng)用圖標(biāo)啟動(dòng)應(yīng)用,該應(yīng)用的Task出現(xiàn)在前臺,如果該應(yīng)用沒有Task,也就是最近未被打開,則會新建一個(gè)Task,并且會將該應(yīng)用的MainActivity加入返回棧中,作為返回棧中的根Activity。
? ? ? ?通常情況下,當(dāng)前一個(gè)Activity啟動(dòng)一個(gè)新的Activity時(shí)候,新的Activity會被加入返回棧中,并處于棧頂,獲取屏幕焦點(diǎn),而前一個(gè)Activity仍保留在返回棧中,處于停止(onStop)狀態(tài)。 Activity停止時(shí),如上所說,系統(tǒng)會保存其頁面狀態(tài)。當(dāng)用戶返回時(shí)候,當(dāng)前處于棧頂?shù)腁ctivity會從返回棧中彈出,并被銷毀(onDestroy),恢復(fù)前一個(gè)Activity的狀態(tài)。返回棧中的Activity永遠(yuǎn)不會重新排列,遵循先進(jìn)后出的原則。
上述講的只是標(biāo)準(zhǔn)的Activity與返回棧的關(guān)系,在Android中Activity有四種啟動(dòng)模式,分別是standard、singleTop、singleTask、singleInstance。
6.1 設(shè)置啟動(dòng)模式我們可以通過在AndroidManifest.xml配置Activity的啟動(dòng)模式。
或者在代碼中向Intent添加相應(yīng)標(biāo)志。
Intent intent = new Intent(this, MyActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
注:第二種方法設(shè)置啟動(dòng)模式的優(yōu)先級高于第一種,如果兩者都存在,以第二種為準(zhǔn)。
6.2 standard(默認(rèn)模式)默認(rèn)的啟動(dòng)模式,新啟動(dòng)的Activity放入返回棧棧頂,遵循先進(jìn)后出原則,同一個(gè)Activity可以被實(shí)例化多次。
6.3 singleTop如果當(dāng)前返回棧的頂部不存在該Activity,則新建該Activity并放入棧頂;
如果當(dāng)前返回棧的頂部已存在Activity的一個(gè)實(shí)例,則系統(tǒng)會通過調(diào)用該實(shí)例的onNewIntent()方法向其傳送Intent,不創(chuàng)建該Activity的新實(shí)例。
6.4 singleTask如果該Activity需要的返回棧是A,但是當(dāng)前系統(tǒng)中不存在A返回棧,系統(tǒng)會新建返回棧A,然后再創(chuàng)建該Activity實(shí)例將其壓入返回棧中。
如果該Activity需要的返回棧存在,而且返回棧中沒有該Activity,則新建Activity并放入Task棧頂
如果該Activity需要的返回棧存在,而且返回棧中有該Activity
如果該Activity在棧頂,調(diào)用其onNewIntent()方法傳入Intent
如果該Activity不在棧頂,彈出其上面的所有Activity,讓該Activity置于棧頂,并調(diào)用其onNewIntent()方法傳入Intent
? ? ? ?默認(rèn)情況下,所有Activity所需要的返回棧名稱為應(yīng)用的包名,我們可以在AndroidManifest.xml中通過設(shè)置Activity的android:taskAffinity屬性來指定該Activity需要的返回棧名稱,這個(gè)名稱不能和應(yīng)用包名相同,否則相當(dāng)于沒有指定。taskAffinity翻譯過來是返回棧親和性,我個(gè)人理解這個(gè)屬性是指定與返回棧親和度或者優(yōu)先級,并不是每次都會新建返回棧。注意一般android:taskAffinity屬性和singleTask一起使用才有意義,會新建返回棧,如果只是指定了android:taskAffinity屬性但是依然是singleTop和standard模式,新啟動(dòng)的Activity依然會在原來的返回棧中。
6.5 singleInstance? ? ? ?系統(tǒng)創(chuàng)建一個(gè)新的Task并創(chuàng)建Activity的新實(shí)例置于新Task返回棧中,但是系統(tǒng)不會將任何其他Activity的實(shí)例放入這個(gè)新建的Task中。該Activity始終是其Task唯一僅有的成員,由此Activity啟動(dòng)的任何Activity,如果沒有指定返回棧名稱,則新啟動(dòng)的Activity放入默認(rèn)的返回棧;如果指定了返回棧名稱,則將新啟動(dòng)的Activity放入指定的返回棧中。
6.6 返回棧順序調(diào)用圖(個(gè)人理解,大家可跳過)Android中返回棧分為前臺返回棧和后臺返回棧,前臺返回棧是指返回棧棧頂?shù)腁ctivity正在和用戶進(jìn)行交互。
上面說了幾種啟動(dòng)模式,下面看一下幾種啟動(dòng)模式混合時(shí)候返回棧調(diào)度情況,我個(gè)人的理解和官方有些不同,這個(gè)大家可以跳過,去看官方的介紹。
個(gè)人理解一個(gè)應(yīng)用創(chuàng)建的默認(rèn)返回棧為基準(zhǔn),按返回鍵時(shí)候,根據(jù)返回棧創(chuàng)建順序依次清空返回棧,當(dāng)默認(rèn)返回棧清空時(shí)候,應(yīng)用也就關(guān)閉了,但是有些后臺返回棧中的Activity并不會立即銷毀。
下面列出幾種特殊情況的返回棧書序調(diào)用圖。
情況一
Activity A和Activity B為默認(rèn)啟動(dòng)模式,未設(shè)置taskAffinity屬性。 Activity C啟動(dòng)模式是singleTask,設(shè)置了taskAffinity屬性。 啟動(dòng)順序是`Activity A -> Activity B -> Activity C` 看一下返回棧調(diào)用情況:
情況二 Activity A和Activity B為默認(rèn)啟動(dòng)模式,A未設(shè)置taskAffinity屬性,B設(shè)置taskAffinity屬性為默認(rèn)返回棧。 Activity C和Activity D啟動(dòng)模式是singleTask,設(shè)置了相同的taskAffinity屬性。 啟動(dòng)順序是Activity A -> Activity C -> Activity D -> Activity B 返回棧調(diào)用情況如下圖:
官方圖,這里注意一下,官方圖中在StartActivity Y后,Y與X所在返回棧和1與2所在的返回棧是不同的,他們并不在同一個(gè)返回棧:
情況三 Activity A和Activity C為默認(rèn)啟動(dòng)模式,未設(shè)置taskAffinity屬性 Activity B啟動(dòng)模式是singleInstance 啟動(dòng)順序是Activity A -> Activity B -> Activity C 返回棧調(diào)用情況如下圖:
注:按返回鍵和啟動(dòng)Activity從返回棧A到返回棧B結(jié)果是不同的,按返回鍵時(shí)候,會首先彈出返回棧A中的Activity,等到返回棧沒有Activity時(shí)候,才會進(jìn)入另一個(gè)返回棧,這個(gè)時(shí)候返回棧A已經(jīng)沒有Activity了。
6.7 XML添加屬性和Intent添加標(biāo)簽設(shè)置啟動(dòng)模式對比上面講到的四種啟動(dòng)模式都是在Androidmanifest.xml中設(shè)置啟動(dòng)模式,也提及了用Intent添加flags來設(shè)置啟動(dòng)模式。下面針對兩種方法做一下對比。
FLAG_ACTIVITY_SINGLE_TOP,這個(gè)標(biāo)記的作用是為Activity指定singleTop啟動(dòng)模式,與在XML設(shè)置啟動(dòng)模式相同
FLAG_ACTIVITY_NEW_TASK,經(jīng)CClusXX指教,這個(gè)標(biāo)記只是在設(shè)置了taskAffinity屬性下有意義,如果被標(biāo)記的Activity需要de 返回棧不存在,則新建返回棧,然后新建Activity;如果被標(biāo)記Activity需要的返回棧存在,則將返回棧帶回前臺,并不會創(chuàng)建新的Activity或者調(diào)用onNewIntent。
FLAG_ACTIVITY_CLEAR_TOP,用這個(gè)標(biāo)記啟動(dòng)的Activity,當(dāng)它啟動(dòng)是,在同一個(gè)任務(wù)戰(zhàn)中所有位于它上面的Activity都要出棧。這個(gè)標(biāo)記一般會和singleTask啟動(dòng)模式一起出現(xiàn),在這種情況下,被啟動(dòng)的Activity的實(shí)力如果已經(jīng)存在,那么系統(tǒng)就會調(diào)用它的onNewIntent。如果被啟動(dòng)的Activity采用standard啟動(dòng)模式,那么連同它和它之上的Activity都要出棧,系統(tǒng)會創(chuàng)建新的Activity實(shí)力并放入棧頂。singleTask啟動(dòng)模式默認(rèn)就具有此標(biāo)記的效果。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,用這個(gè)標(biāo)記啟動(dòng)的Activity不會出現(xiàn)在近期任務(wù)中,也就是在Android任務(wù)列表中隱藏了該Activity,和在XML設(shè)置android:excludeFromRecents="true"相同,這個(gè)屬性需要配合singleInstance啟動(dòng)模式才有用
可以看到XML設(shè)置沒有類似FLAG_ACTIVITY_CLEAR_TOP標(biāo)記這種效果的啟動(dòng)模式,而標(biāo)記中沒有singleInstance這種啟動(dòng)模式的標(biāo)記。
注:平時(shí)如果我們使用ApplicationContext.startActivity去啟動(dòng)一個(gè)standard啟動(dòng)模式的Activity時(shí)候,會報(bào)錯(cuò)如下,這是因?yàn)?b>standard模式的Activity會默認(rèn)進(jìn)入啟動(dòng)它的Activity的返回棧中,但是由于非Activity類型的Context(如ApplicationContext)并沒有所謂的返回棧,所以拋出這個(gè)異常。解決這個(gè)問題的方法就是在Intent中添加FLAG_ACTIVITY_NEW_TASK的標(biāo)記,這個(gè)時(shí)候啟動(dòng)其實(shí)是以singleTask模式啟動(dòng)的
ERROR/AndroidRuntime(5066): Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?6.8 taskAffinity和allowTaskReparenting結(jié)合
? ? ? ?在AndroidManifest.xml中可以為Activity同時(shí)設(shè)置這兩個(gè)屬性,taskAffinity這個(gè)屬性上面將結(jié)果,allowTaskReparenting這個(gè)屬性是標(biāo)記Activity是否可以更換返回棧,也就是從一個(gè)返回棧轉(zhuǎn)移到另一個(gè)返回棧。當(dāng)應(yīng)用需要給其他應(yīng)用提供頁面支持的時(shí)候,這兩者結(jié)合起來就很有意義。
B應(yīng)用提供了一個(gè)對外的Activity C,taskAffinity屬性是應(yīng)用B包名,allowTaskReparenting設(shè)置為true。
應(yīng)用A調(diào)用了應(yīng)用B的Activity C,然后按Home鍵退回到主屏幕,單擊應(yīng)用B的桌面圖標(biāo)。
如果應(yīng)用B已經(jīng)啟動(dòng),Activity C會出現(xiàn)在應(yīng)用B返回棧的棧頂,應(yīng)用B顯示Activity C,應(yīng)用A中Activity C消失,也就將是Activity C從應(yīng)用A的返回棧轉(zhuǎn)移到應(yīng)用B的返回棧
如果應(yīng)用B未啟動(dòng),這個(gè)時(shí)候并不是啟動(dòng)應(yīng)用B的MainActivity,而是重新顯示了已經(jīng)被應(yīng)用A啟動(dòng)的Activity C,或者說Activity C從應(yīng)用A的返回棧轉(zhuǎn)移到了應(yīng)用B的返回棧中??梢岳斫獬桑捎趹?yīng)用A啟動(dòng)Activity C,當(dāng)應(yīng)用B啟動(dòng)新建返回棧時(shí)候,系統(tǒng)發(fā)現(xiàn)Activity C原本所想要的返回棧創(chuàng)建完畢,就把Activity C從應(yīng)用A的返回棧轉(zhuǎn)移到應(yīng)用B的返回棧。
7. 清空返回棧如果用戶將應(yīng)用長時(shí)間的切換到后臺,系統(tǒng)會清除返回棧中除了根Activity的所有Activity。當(dāng)用戶再次回到應(yīng)用時(shí)候,僅恢復(fù)根Activity。有幾個(gè)標(biāo)簽?zāi)軌騾f(xié)助我們控制返回棧的清空。
alwaysRetainTaskState,如果根Activity的該屬性設(shè)置為True,系統(tǒng)會長時(shí)間的保存所有的Activity在返回棧中,并不會清空。(殺死應(yīng)用除外)
clearTaskOnLaunch,如果根Activity的該屬性設(shè)置為True,每當(dāng)用戶離開再返回時(shí)候,系統(tǒng)都會將返回棧清空只留下根Activity。這個(gè)屬性和alwaysRetainTaskState剛好相反,即時(shí)用戶只離開片刻,系統(tǒng)也會清空返回棧。
8.結(jié)束語從開始學(xué)Android開始,就想對四大組件進(jìn)行一些梳理,將自己的知識點(diǎn)細(xì)化并記錄下來,可能網(wǎng)上已經(jīng)有很多關(guān)于Activity的文章,沒用的很多,還是自己來寫靠譜,溫故而知新,共勉。
注:關(guān)于Activity啟動(dòng)匹配比較復(fù)雜,可以去查看我的另一篇文章Intent以及IntentFilter。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/70546.html
摘要:但是,一定會被執(zhí)行,從而保證了廣播在死亡前一定會被注銷,從而防止內(nèi)存泄露。對于應(yīng)用內(nèi)廣播的動(dòng)態(tài)注冊非方式,回調(diào)中的返回值是 前言 BroadcastReceiver(廣播接收器),屬于Android四大組件之一 在Android開發(fā)中,BroadcastReceiver的應(yīng)用場景非常多 今天,我將詳細(xì)講解關(guān)于BroadcastReceiver的一切相關(guān)知識 目錄 showImg(...
摘要:四大組件都支持這個(gè)屬性。到目前為止,中總共有三種啟動(dòng)方式。返回值方法有一個(gè)的返回值,這個(gè)返回值標(biāo)識服務(wù)關(guān)閉后系統(tǒng)的后續(xù)操作。,啟動(dòng)后的服務(wù)被殺死,不能保證系統(tǒng)一定會重新創(chuàng)建。 1. 簡介 這篇文章會從Service的一些小知識點(diǎn),延伸到Android中幾種常用進(jìn)程間通信方法。 2. 進(jìn)程 ? ? ? ?Service是一種不提供用戶交互頁面但是可以在后臺長時(shí)間運(yùn)行的組件,可以通過在An...
閱讀 3149·2021-09-22 15:20
閱讀 2670·2019-08-30 15:54
閱讀 2038·2019-08-30 14:06
閱讀 3187·2019-08-30 13:05
閱讀 2551·2019-08-29 18:36
閱讀 627·2019-08-29 15:10
閱讀 582·2019-08-29 11:17
閱讀 890·2019-08-28 18:11