當前位置:首頁 » 安卓系統 » android如何activity

android如何activity

發布時間: 2023-08-07 00:23:23

⑴ Android 10.0 Activity的啟動流程

本文主要學習記錄,基於Android 10的源碼,有錯誤歡迎指正,主要目的是梳理流程圖。

以進程為單位的調用棧圖如下:

1.activity中的startActivity方法最終都會通過拿到ATSM的代理IActivityTaskManager調用的startActivity;

2.之後進入system server進程中的ATMS startActivity,ATMS 經過收集Intent信息,然後使用ActivityStackSupervisor.startSpecificActivityLocked,如果進程已經存在,則直接使用realStartActivityLocked,通過App的binder客戶端的代理ApplicationThread調用回到bindApplication,走入Activity的啟動流程;如果進程不存在則通過socket鏈接Zygote,請求fork新的進程;

3.App進程創建完成後,進程啟動會調用ActivityThread.main方法,初始化主線程Handler,接著走入attach方法,然後通過AMS的代理調用AMS的attachApplication方法,並將App進程的通信代理ApplicationThread傳入AMS;

4.AMS獲取到ATMS調用ApplicationThread的bindApplication回到App進程的ActivityThread.ApplicationThread.bindApplication方法中,然後使用Handler切換到主線程執行handleBindApplication,這里初始化了App的進程名字、時間,用戶的硬體配置,包括App的文件系統,創建了App的Context實例,Instrumentation實例,調用App的onCreate回調方法,同時告訴AMS APP初始化工作完畢;

5.AMS接著會調用ATMS的attachApplication,最後調用ClientLifecycleManager的scheleTransaction方法,通過App的Binder代理ApplicationThread回到ActivityThread;

6.進入ActivityThread.ApplicationThread.scheleTransaction方法之後就進入了Activity的onStart、onResume回調

創建進程之前的過程主要是AMS的內部信息收集的判斷的過程,下面主要看一下App進程啟動的源碼流程

從應用進程被創建開始,ActivityThread.main被執行

調用ActivityThread的attach方法,然後將activity和AMS通信的Binder代理IApplicationThread實例傳入AMS

接著進入AMS進程,ActivityManagerService.attachApplicationLocked

1.thread.bindApplication :該方法主要講App進程的配置信息通過IApplicationThread Binder通信回傳到ActivityThread中

2.mAtmInternal.attachApplication :mAtmInternal實際就是ActivityTaskManager的實例,通過LocalServices載入

那麼這里相當於走到了ActivityTaskManagerServer的attachApplication中

先看第一條:

注意:ActivityThread中存在於Binder通信的代理--》ApplicationThread extends IApplicationThread.Stub

ActivityThread--》ApplicationThread--》bindApplication

這里的bindApplication主要初始化了AppBindData,然後發送BIND_APPLICATION給APP的主線程BIND_APPLICATION,最後執行了handleBindApplication

handleBindApplication如下:

ActivityThread--》class H extends Handler

該方法主要在App進程中對App的一些硬體資源配置申請的屬性、App的文件夾等完成App基本信息的初始化

接著看第二條:mAtmInternal.attachApplication

mAtmInternal.attachApplication最終會調用mRootActivityContainer.attachApplication(wpc)

RootActivityContainer.attachApplication

接著調用ActivityStackSupervisor.realStartActivityLocked開始創建Activity

ActivityStackSupervisor.realStartActivityLocked

創建ClientLifecycleManager和ClientTransactionHandler來輔助管理Activity的生命周期

注意

clientTransaction.addCallback是LaunchActivityItem

lifecycleItem是ResumeActivityItem

ClientLifecycleManager.scheleTransaction最終會調用ClientTransaction的schele方法

那麼這個mClient是IApplicationThread的實例,那麼此時也就回到了ActivityThread的ApplicationThread中

ActivityThread的ApplicationThread中

因為ActivityThread繼承ClientTransactionHandler,所以到了ClientTransactionHandler中

通過Handler發送消息EXECUTE_TRANSACTION到H中

接著TransactionExecutor的execute方法

LaunchActivityItem.execute方法

client其實是在ActivityThread的實例,那麼就回到了ActivityThread的handleLaunchActivity

接著調用performLaunchActivity

在performLaunchActivity中,主要是載入App的資源包,然後創建了Activity的context實例,並創建了Activity的實例,接著調用activity.attach方法,attach執行完之後調用了onCreate方法。

activity.attach

activity.attach中主要

1.創建了PhoneWindow實例

2.設置了Window介面的監聽

3.初始化了成員變數,包括線程和WindowManager

到此Oncreate已經完成,那麼OnStart和OnResume去哪了?

TransactionExecutor的execute方法

之前們只分析了executeCallbacks,接著executeLifecycleState方法

TransactionExecutor的executeLifecycleState方法

cycleToPath:lifecycleItem即為ResumeActivityItem

第一點:

int finish = lifecycleItem.getTargetState()

lifecycleItem對應ResumeActivityItem,如下:

ResumeActivityItem的getTargetState方法

對應ActivityLifecycleItem中的枚舉類型:

第二點:ActivityClientRecord中的mLifecycleState,由於在前面已經執行了handleLaunchActivity所以mLifecycleState=1

對應ActivityLifecycleItem中的枚舉類型:

PRE_ON_CREATE = 0

所以final int star = 1

接著看getLifecyclePath,此時start=1,finish=3

那麼返回的IntArray就是2

接著看performLifecycleSequence

最終執行的是handleStartActivity所以最終走到了ActivityThread的handleResumeActivity

兩點:

調用activity.performStart

調用Instrumetation.callActivityOnPostCreate

performStart方法:

調用了Instrumentation.callActivityOnStart方法:

最終到了activity的onStart方法

第二點:Instrumentation.callActivityOnPostCreate

上面主要走了cycleToPath,接著ResumeActivityItem.execute

調用了handleResumeActivity方法

handleResumeActivity最終調用performResumeActivity

調用了Instrumentation.callActivityOnResume,

到了activity.onResume()方法

參考文章: https://blog.csdn.net/u011386173/article/details/87802765

⑵ Android 中如何在java類中調用activity 中的一個方法

通常,您不應該以這種方式創建新的 MainActivity 實例。要打開一個新的 MainActivity,請使用 Intent。在您的情況下,您應該引用原始 MainActivity 實例,並在那裡調用此方法。不要以任何方式創建新的,因為您已經在運行它。
一個簡單的解決方法:
MainActivity.this.myMethod("Hello there")
您不必存儲mContext. 你已經在 MainActivity 裡面了。
因此,完整的代碼將是:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView myWebView = findViewById(R.id.webview);
myWebView.loadUrl("http://www.google.com");
myWebView.addJavascriptInterface(new WebAppInterface(), "Android");
}
public void myMethod(String test){
Toast.makeText(this, test, Toast.LENGTH_SHORT).show();
}
public class WebAppInterface {
/** Show a toast from the web page */

@JavascriptInterface
public void showToast(String toast) {
MainActivity.this.myMethod("Hello there");
}
}
}
實際上,我認為您甚至可以避免使用MainActivity.this., 並myMethod直接調用。

⑶ android新創建Activity是否需要在Manifest文件中注冊,如何進行注冊

在android創建Activity是必須進行注冊,沒有注冊的activity不能使用,運行工程是會報錯。例如: 創建一個叫MyActivity的activity的簡單工程代碼如下:

代碼如下:

<activity android:name="com.bwie.test.MyActivity"></activity>

語句解釋:

在工程名前邊的是包名,這是創建簡單的activity的語句,<activity ></activity>作為一個標簽 。

拓展資料:

(1)Activity是Android系統中的四大組件之一,可以用於顯示View。

(2)Activity是一個與用記交互的系統模塊,幾乎所有的Activity都是和用戶進行交互的。

Activity有四種狀態:
(1)活動狀態::當Activity處於Stack(棧)頂時,就是手機當前的現實屏幕,這是 Activity就
處於activity或者運行狀態。

(2)運行狀態:失去焦點,當Activity還處於運行狀態時,但是屏幕是有另外一個Activity
處於文檔處於焦點狀態,當前的Activity就處於pause。

(3)停止狀態:當Activity被另一個Activity完全覆蓋的時候,就被停止了,其實就是雖然在

(4)結束狀態:當Activity處於pause或者stop時,系統可以結束 Activity,回收資源,這
是Activity就是處於結束狀態了。

⑷ android 怎麼設置activity的啟動模式

android 怎麼獲取一個activity啟動模式

在Android中每個界面都是一個Activity,切換界面操作其實是多個不同Activity之間的實例化操作。在Android中Activity的啟動模式決定了Activity的啟動運行方式。
Android總Activity的啟動模式分為四種:
Activity啟動模式設置:
<activity android:name=".MainActivity" android:launchMode="standard" />
Activity的四種啟動模式:
1. standard
模式啟動模式,每次激活Activity時都會創建Activity,並放入任務棧中。
2. singleTop
如果在任務的棧頂正好存在該Activity的實例, 就重用該實例,否者就會創建新的實例並放入棧頂(即使棧中已經存在該Activity實例,只要不在棧頂,都會創建實例)。
3. singleTask
如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的onNewIntent())。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移除棧。如果棧中不存在該實例,將會創建新的實例放入棧中。
4. singleInstance
在一個新棧中創建該Activity實例,並讓多個應用共享改棧中的該Activity實例。一旦改模式的Activity的實例存在於某個棧中,任何應用再激活改Activity時都會重用該棧中的實例,其效果相當於多個應用程序共享一個應用,不管誰激活該Activity都會進入同一個應用中。
其中standard是系統默認的啟動模式。

下面通過實例來演示standard的運行機制:
1 private TextView text_show;
2 private Button btn_mode;
3
4 @Override
5 public void onCreate(Bundle savedInstanceState) {
6 super.onCreate(savedInstanceState);
7 setContentView(R.layout.activity_main);
8
9 text_show = (TextView) this.findViewById(R.id.text_show);
10
11 text_show.setText(this.toString());
12
13 btn_mode = (Button) this.findViewById(R.id.btn_mode);
14
15 }
16
按鈕單擊事件
17 public void LaunchStandard(View v){
18 startActivity(new Intent(this,MainActivity.class));
19
20 text_show.setText(this.toString());
21 }

如何設置Activity的啟動模式

  • Activity的四種啟動模式:standard:這是默認模式,每次激活Activity時都會創建Activity實例,並放入任務棧中。 singleTop: 如果在任務的棧頂正好存在該Activity的實例,就重用該實例( 會調用實例的 onNewIntent() ),否則就會創建新的實例並放...

android 主activity用什麼啟動模式

在android里,有4種activity的啟動模式,分別為:
「standard」 (默認)
「singleTop」
「singleTask」
「singleInstance」
1. 如何決定所屬task
「standard」和」singleTop」的activity的目標task,和收到的Intent的發送者在同一個task內,除非intent包括參數FLAG_ACTIVITY_NEW_TASK。
如果提供了FLAG_ACTIVITY_NEW_TASK參數,會啟動到別的task里。
2. 是否允許多個實例
「standard」和」singleTop」可以被實例化多次,並且存在於不同的task中,且一個task可以包括一個activity的多個實例;
「singleTask」和」singleInstance」則限制只生成一個實例,並且是task的根元素。
singleTop要求如果創建intent的時候棧頂已經有要創建 的Activity的實例,則將intent發送給該實例,而不發送給新的實例。
3. 是否允許其它activity存在於本task內
「singleInstance」獨佔一個task,其它activity不能存在那個task里;如果它啟動了一個新的activity,不管新的activity的launch mode 如何,新的activity都將會到別的task里運行(如同加了FLAG_ACTIVITY_NEW_TASK參數)。
而另外三種模式,則可以和其它activity共存。
4. 是否每次都生成新實例
「standard」對於沒一個啟動Intent都會生成一個activity的新實例;
「singleTop」的activity如果在task的棧頂的話,則不生成新的該activity的實例,直接使用棧頂的實例,否則,生成該activity的實例。
比如現在task棧元素為A-B-C-D(D在棧頂),這時候給D發一個啟動intent,如果D是 「standard」的,則生成D的一個新實例,棧變為A-B-C-D-D。
如果D是singleTop的話,則不會生產D的新實例,棧狀態仍為A-B-C-D
如果這時候給B發Intent的話,不管B的launchmode是」standard」 還是 「singleTop」 ,都會生成B的新實例,棧狀態變為A-B-C-D-B。

「singleInstance」是其所在棧的唯一activity,它會每次都被重用。

「singleTask」如果在棧頂,則接受intent,否則,該intent會被丟棄,但是該task仍會回到前台。

當已經存在的activity實例處理新的intent時候,會調用onNewIntent()方法
如果收到intent生成一個activity實例,那麼用戶可以通過back鍵回到上一個狀態;如果是已經存在的一個activity來處理這個intent的話,用戶不能通過按back鍵返回到這之前的狀態。
總結如下:
standard 每次都會新建,每個Task都可以有,且每個Task都可以有多個實例(每個Task都可以有,且可以有多個)
singleTop 當前實例如果在棧頂,就不新建實例,調用其OnNewIntent。 如不在棧頂,則新建實例 (每個Task都可以有,且可以有多個,在棧頂時可復用)
singleTask 新建一個Task,如果已經有其他的Task並且包含該實例,那就直接調用那個Task的實例。(只有一個Task中會有)
singleInstance 新建一個Task,且在該Task中只有它的唯一一個實例。 (只有一個Task會有,且該Task中只有它)
FLAG_ACTIVITY_NEW_TASK 類似singleTask
FLAG_ACTIVITY_SINGLE_TOP 類似singleTop
FLAG_ACTIVITY_CLEAR_TOP 無對應

Android開發,activity的默認啟動模式為標准啟動模式,什麼時候會用到其他的啟動模式?

啟動模式簡單地說就是Activity啟動時的策略,在AndroidManifest.xml中的標簽的android:launchMode屬性設置;
啟動模式有4種,分別為standard、singleTop、singleTask、singleInstance;
講解啟動模式之前,有必要先了解一下「任務棧」的概念;
一 :
standard 模式:這個就沒有什麼好說的了,Android默認Activity啟動的模式 就是 standard,如果有3個 Activity,Act1,Act2,Act3, 如果從Act1 啟動到Act2 ,在啟動到Act3,那麼Android 的任務棧(task stack)分別為 Act1、Act2、Act3,Act3 在棧頂,如果此時按手機返回鍵,則需要返回3次才能返回到桌面(假設是從桌面啟動的demo),任務棧分銷毀掉 Act3,Act2,最後Act1 。
二 :singleTop模式:
實驗效果:
singleTop模式:該啟動模式和standard模式相差不多,任務棧分配也很相似,如:現有 act1,act 2,在act2 清單文件中配置 android:launchMode="singleTop" ,其他都是默認standard 模式, 若從桌面啟動該實驗demo,從act 1,到act2 ,那麼任務棧則分配為,act1,act2,此時該任務棧和 standard 模式任務棧分配則完全相同,接下來則說明不同的地方,如果在act2 界面中 啟動 到act1, 此時的 任務棧 情況則為 act1,act2,act1,在由act1 啟動到act2,在啟動到act2,進行多次啟動,(在act2界面)任務棧的情況則為,act1,act2,act1,act2,棧頂的act2 則不會重新創建,則會復用act2 該 Activit, 依次類推。
理論知識:
singleTop,如果任務棧的棧頂元素是要被激活的組件,不會創建新的Activity放在任務棧,而是會復用棧頂的Activity。 如果發現棧頂的元素不是要激活的Activity,就會創建新的Activity 放置到任務棧裡面
singleTop模式應用場景 :
App程序中(或瀏覽器中)保存的書簽,假如用戶看到一個界面保存自己喜歡的標簽,假如要保存10個,這個時候用戶在返回鍵的時候,則會返回10次才能返回到App應用中, Android下singleTop 則解決該問題。
三singleTask 模式 :
實驗效果 相差不大,實驗內容就不多說了,自己可以寫個小demo,兩個Activity,每個Activiy 有兩個button,可以相互啟動 打日誌去動手查看,會理解更加深刻,可以參照著 SingleTop模式去實驗,以下只是講解下 和SingleTop的區別:
區別如下:(理論知識)
SingleTask 操作模式,一般和singleTop操作模式類似,如果他發現任務棧裡面已經有了要啟動的這個Activity,他會清空這個Activity所在的任務棧上面的所有Activiy,然後直接復用這個已經存在的Activity 。
應用場景:
如果一個App中,有一個功能需要載入網頁內容 ,打開一個 browserActiviy現在網頁內容,則內存開銷非常大,首先要初始化webkit /c++ 嵌入式瀏覽器內核broweractivity 配置了singleTask,空間換時間,使用該模式可以節省內存開銷。
四 :singleinstance 模式 :
直接理論知識吧」:
singleInstance操作模式會新開啟一個任務棧,跟其他普通Activity不是 同一個任務棧,比較牛,他的模式流程是 首先要新開啟一個新的任務棧把要激活的Activity放置到新的 任務棧里,這個任務棧裡面只有且 只有一個實例,也比較極端吧。說比較極端也跟他的應用場景有關系。
應用場景 :
App各種詞典,向有道詞典,什麼金山詞典,說極端是因為不想被放置到同一個任務棧裡面,它是全局的系統程序應用,達到節省內存的使用目的。

win7 系統 怎麼設置uefi啟動模式

存有ghost版win7系統iso鏡像文件的u啟動uefi u盤啟動盤插在電腦u *** 介面上,然後重啟電腦,在出現開機畫面時用一鍵u盤啟動快捷鍵的方法進入到啟動項選擇窗口,然後將游標移至UEFI:開頭的項(注意:一定要選擇該項),按回車鍵執行等待進入到u啟動win pe系統,u啟動裝機工具會自動開啟,並載入到u啟動uefi u盤啟動盤中准備的win7系統安裝程序,點擊選擇c盤為系統安裝盤,再點擊「確定」按鈕繼續
隨即會彈出一個詢問是否執行該操作的提示窗口,點擊「確定」按鈕執行操作
然後耐心等待win7系統釋放完成並自動重啟電腦即可
電腦重啟後會完成系統後續程序安裝應用,直到進入win7系統桌面即可

android開發 activity啟動模式中singleTop的疑問

樓主的這一段理論似乎有點不太准確 「在D完成操作以後,我啟動了系統內置的瀏覽器E,根據sdk的說法,瀏覽器E被放進了一個新任務。那麼現在有兩個任務」 你憑什麼確定瀏覽器E被放進了一個新的Task呢? 在啟動瀏覽器E的Intent里設置了flag? intentandroid開發 activity啟動模式中singleTop的疑問

android-Android activity 的啟動模式.新人提問,大俠在哪

Activity的四種啟動模式:standard:這是默認模式,每次激活Activity時都會創建Activity實例,並放入任務棧中。
singleTop: 如果在任務的棧頂正好存在該Activity的實例,就重用該實例( 會調用實例的 onNewIntent() ),否則就會創建新的實例並放入棧頂,即使棧中已經存在該Activity的實例,只要不在棧頂,都會創建新的實例。
singleTask:如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的 onNewIntent() )。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移出棧。如果棧中不存在該實例,將會創建新的實例放入棧中。
singleInstance:在一個新棧中創建該Activity的實例,並讓多個應用共享該棧中的該Activity實例。一旦該模式的Activity實例已經存在於某個棧中,任何應用再激活該Activity時都會重用該棧中的實例( 會調用實例的 onNewIntent() )。其效果相當於多個應用共享一個應用,不管誰激活該 Activity 都會進入同一個應用中。
位置在 AndroidManifest.xml 文件中 Activity 元素的 android:launchMode 屬性。
不知道你要問什麼,為你解答

activity的啟動模式有哪些

Activity的四種啟動模式:standard:這是默認模式,每次激活Activity時都會創建Activity實例,並放入任務棧中。
singleTop: 如果在任務的棧頂正好存在該Activity的實例,就重用該實例( 會調用實例的 onNewIntent() ),否則就會創建新的實例並放入棧頂,即使棧中已經存在該Activity的實例,只要不在棧頂,都會創建新的實例。
singleTask:如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的 onNewIntent() )。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移出棧。如果棧中不存在該實例,將會創建新的實例放入棧中。
singleInstance:在一個新棧中創建該Activity的實例,並讓多個應用共享該棧中的該Activity實例。一旦該模式的Activity實例已經存在於某個棧中,任何應用再激活該Activity時都會重用該棧中的實例( 會調用實例的 onNewIntent() )。其效果相當於多個應用共享一個應用,不管誰激活該 Activity 都會進入同一個應用中。
位置在 AndroidManifest.xml 文件中 Activity 元素的 android:launchMode 屬性。

⑸ android採用什麼方式管理activity實例

Android採用任務線(Task)的方式來管理Activity的實例。


在開發Android應用時,經常會涉及一些消耗大量系統內存的情況,例如視頻播放、大量圖片或者程序中開啟多個Activity沒有及時關閉等,會導致程序出現錯誤。為了避免這種問題,Google提供了一套完整的機制讓開發人員控制 Android中的任務線。

Android系統中的任務線,類似於一個容器,用於粗枝鏈管理所有的Activity實例。在存放Activity時,滿足「先進後出 (First-In/Last-Out )"的原則。

但是使用任務線有以下缺點:

每開啟一次頁面都會在任務棧中添加一個Activity,而只有任務棧中的Activity全部清除出線時,任務線被銷岩孫毀,程序才會退出。這樣就造成了用戶體驗差, 需要點擊多次返回才可以把程序退出。

每開啟一次頁面都會在任務棧中添加一個Activity還會造成數據冗餘, 重復數據太多, 會導致內存溢出的問題(OOM)。為了解決任務棧產生的問題,Android為Activity設計了啟動模式。

在實際開發中,應根據特定的需求為每個Activity指定恰當的啟動模式。Activity的啟動模式有4種,分別是standard、singleTop、singleTask和singlelnstance。在AndroidManifest.xml中,通過<activity>標簽的android:launchMode屬性可以設置搭模啟動模式。

熱點內容
r7000p2021買哪個配置 發布:2025-02-04 06:40:17 瀏覽:965
如何消除微信小程序緩存 發布:2025-02-04 06:34:24 瀏覽:633
python27mysqldb 發布:2025-02-04 06:28:44 瀏覽:768
svn文件夾許可權 發布:2025-02-04 06:23:47 瀏覽:900
師編程 發布:2025-02-04 06:22:51 瀏覽:168
加密類型wpa 發布:2025-02-04 06:21:27 瀏覽:178
互聯網與雲伺服器 發布:2025-02-04 06:15:56 瀏覽:254
硬碟挖礦源碼 發布:2025-02-04 06:15:45 瀏覽:76
寶馬3系哪個配置合適 發布:2025-02-04 06:03:10 瀏覽:328
磁碟存儲器的管理課後答案 發布:2025-02-04 05:58:58 瀏覽:600