Android6.0 AMS啟動Activity(五) 在新程序中啟動Activity
前面我們在分析Activity啟動過程的時候,看到同一個應用程式的Activity一般都是在同一個程序中啟動,事實上,Activity也可以像Service一樣在新的程序中啟動,這樣,一個應用程式就可以跨越好幾個程序了,本文就分析一下在新的程序中啟動Activity的方法和過程。
在Android系統中,每一個應用程式都是由一些Activity和Service組成的,一般Service執行在獨立的程序中,而Activity有可能執行在同一個程序中,也有可能執行在不同的程序中。在前面我們已經介紹了Android應用程式在Launcher桌面啟動一個Activity需要啟動一個程序,也介紹了在程序內部啟動Activity過程(startActivity)。而現在,我們就來看一下同一個Android應用程式如何在新的程序中啟動新的Activity。
要做到這個其實很簡單,只需要在AndroidManifest.xml中將主Activity和要啟動的Activity的android:process屬性設定為不同的
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="shy.luo.task" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name"> android:process=":com.example.process.main" <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SubActivity" android:label="@string/sub_activity" android:process=":shy.luo.process.sub"> <intent-filter> <action android:name="com.example.process.subactivity"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> </application> </manifest>
同一個應用程式的Activity元件都是執行在同一個程序中,但是,如果Activity配置了android:process這個屬性,那麼,它就會執行在自己的程序中。如果android:process屬性的值以":"開頭,則表示這個程序是私有的;如果android:process屬性的值以小寫字母開頭,則表示這是一個全域性程序,允許其它應用程式元件也在這個程序中執行。
因此,這裡我們以":"開頭,表示建立的是私有的程序。事實上,這裡我們不要前面的":"也是可以的,但是必須保證這個屬性性字串內至少有一個"."字元。
具體解析AndroidManifest.xml會在安裝apk的時候在PKMS呼叫PackageParser的parseBaseApplication來解析。具體程式碼我們會在後續部落格(專門講PKMS安裝apk)中再分析。
這樣processName不一樣之後,在AMS啟動一個Activity時開啟一個程序。當再啟動一個Activity的時候,因為processName不一樣,發現沒有程序的processName是這個name。所以就要再起一個程序,具體程式碼我們之前部落格也分析過,是在ActivityStackSupervisor的startSpecificActivityLocked函式中,發現沒有這個processName的程序後。會呼叫mService.startProcessLocked函式重啟啟動一個程序,也會新建一個ProcessRecord儲存這個程序的資訊。
void startSpecificActivityLocked(ActivityRecord r,
boolean andResume, boolean checkConfig) {
// Is this activity's application already running?
ProcessRecord app = mService.getProcessRecordLocked(r.processName,
r.info.applicationInfo.uid, true);
r.task.stack.setLaunchTime(r);
if (app != null && app.thread != null) {
try {
if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0
|| !"android".equals(r.info.packageName)) {
// Don't add this if it is a platform component that is marked
// to run in multiple processes, because this is actually
// part of the framework so doesn't make sense to track as a
// separate apk in the process.
app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode,
mService.mProcessStats);
}
realStartActivityLocked(r, app, andResume, checkConfig);
return;
} catch (RemoteException e) {
Slog.w(TAG, "Exception when starting activity "
+ r.intent.getComponent().flattenToShortString(), e);
}
// If a dead object exception was thrown -- fall through to
// restart the application.
}
mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
"activity", r.intent.getComponent(), false, false, true);
}
相關推薦
Android6.0 AMS啟動Activity(五) 在新程序中啟動Activity
前面我們在分析Activity啟動過程的時候,看到同一個應用程式的Activity一般都是在同一個程序中啟動,事實上,Activity也可以像Service一樣在新的程序中啟動,這樣,一個應用程式就可以跨越好幾個程序了,本文就分析一下在新的程序中啟動Activity的
android6.0 Activity(五) Activity的測量(Measure)、佈局(Layout)和繪製(Draw)
Android應用程式視窗的繪圖表面在建立完成之後,我們就可以從上到下地繪製它裡面的各個檢視了,即各個UI元素了。不過在繪製這些UI元素之前,我們還需要從上到下地測量它們實際所需要的大小,以及對它們的位置進行合適的安排,即對它們進行合適的佈局。在本文中,我們就將詳細
Android6.0 AMS 新程序中啟動Activity
看到同一個應用程式的Activity一般都是在同一個程序中啟動,事實上,Activity也可以像Service一樣在新的程序中啟動,這樣,一個應用程式就可以跨越好幾個程序了,本文就分析一下在新的程序中啟動Activity的方法和過程。 在Android系統中
Linux用戶管理(五)Linux系統的啟動
linux系統啟動Linux系統的啟動一.啟動步驟和GRUB1.Linux啟動過程分析 (1)BIOS自檢l 硬件檢測及初始化l 引導啟動設備(2)引導啟動設備l 軟盤(0磁道第一個扇
spring boot 2.0 源碼分析(五)
pen div shutdown down etc messages servle started fec 在上一篇文章中我們詳細分析了spring boot是如何準備上下文環境的,今天我們來看一下run函數剩余的內容。還是先把run函數貼出來: /**
android6.0指紋識別學習 (二)--------阿冬專欄!!!
轉載自:http://blog.csdn.net/baniel01/article/details/51991764 在Android 6.0中google終於給android系統加上了指紋識別的支援,這個功能在iPhone上早就已經實現了,並且在很多廠商的定製的R
從0開始學架構(五)複雜度來源:低成本、安全、規模
低成本 一般中小公司基本都是靠引入新技術來達到低成本的目標;而大公司更有可能自己去創造新的技術來達到低成本的目標,因為大公司才有足夠的資源、技術和時間去創造新技術。 安全 安全本身是一個龐大而又複雜的技術領域,並且一旦出問題,對業務和企業形象影響非常大。 從技術的角
k8s1.13.0二進位制部署Dashboard(五)
部署UI 下載yaml檔案https://github.com/kubernetes/kubernetes [[email protected] ~]# git clone https://github.com/kubernetes/kubernetes.git [[email
Hyperledger Fabric 1.0 從零開始(五)——執行測試e2e
3:執行測試e2e 3.1、執行fabric-samples的問題說明 該問題說明能夠解決6.1、平臺特定使用的二進位制檔案配置第一步的問題。可以選擇繼續閱讀該說明,或者等參考到6.1小節時再反向閱讀本說明,具體在6.1中會重新指向本步驟。 一般情況下,我們會參照官網來完成第一個網路測試,在該線上文件中會讓我
Android基礎知識之四大元件Activity(五)Activity生命週期場景的應用
今天,來寫一個關於Android四大元件Activity生命週期的一個簡單應用,做一個關於極簡單的音樂播放器(只是為了鞏固一下Activity的生命週期,並不能當作專案來用)。 先來截個介面的圖: 很簡單吧,只有三個按鈕,播放一首歌,但來研究Activity的生命週期,這
[Android6.0][RK3399] 電池系統(三)電量計 CW2015 驅動流程分析
Platform: RK3399 OS: Android 6.0 Kernel: 4.4 Version: v2017.04 IC: TI BQ25700、RK808 已知問題 驅動分析 函式呼叫鏈 已知問題 cw2
藍芽4.0 BLE 資料傳輸(五)
原文地址:http://blog.sina.com.cn/s/blog_869234dc0102uxse.html相信看了《藍芽4.0 BLE 資料傳輸(四)》,大家應該知道怎麼通過傳送特徵值來控制CC2540了,不說別的,就用這個,點亮一個LED就能忽悠一下我們老師,期末
android6.0 adbd深入分析(一)adb驅動初始化、讀取adb節點執行緒
adbd之前看過一次,覺得程式碼太複雜然後,又是adb client adb server adbd交織在一起感覺看起來太累,最近專案需要把它大致看完了,梳理下,感覺從adbd能學到很多東西,在此總結下,adbd的程式碼。 我只分析我看懂了,不可能面面俱到。而且主要注重在
[Android6.0][RK3399] 電池系統(二)BQ IC 新增 DC 充電功能
Platform: RK3399 OS: Android 6.0 Kernel: 4.4 Version: v2017.04 IC: TI BQ25700、RK808 解決思路 程式碼新增 驗證結果 遇到 Bug 我們也
Android深入四大元件(五)Content Provider的啟動過程
前言 Content Provider做為四大元件之一,通常情況下並沒有其他的元件使用頻繁,但這不能作為我們不去深入學習它的理由。關於Content Provider一篇文章是寫不完的,這一篇文章先來介紹它的啟動過程。 1.query方法到AMS
從0開發3D引擎(五):函數語言程式設計及其在引擎中的應用
目錄 上一篇博文 函數語言程式設計的優點與缺點 優點 缺點 為什麼使用Reason語言 函數語言程式設計學習資料 引擎中相關的函數語言程式設計
python系列(五)centos6.x中部署多個python版本
python pyenv centos6.x virtualenv 博主QQ:819594300博客地址:http://zpf666.blog.51cto.com/有什麽疑問的朋友可以聯系博主,博主會幫你們解答,謝謝支持!使用pyenv+virtualenv方式部署python多版本pyenv
企業分布式微服務雲SpringCloud SpringBoot mybatis (五)Spring Boot中Web應用的統一異常處理
src one exception learn 微服務 public .net 可能 訪問 我們在做Web應用的時候,請求處理過程中發生錯誤是非常常見的情況。Spring Boot提供了一個默認的映射:/error,當處理中拋出異常之後,會轉到該請求中處理,並且該請求有一個
痞子衡嵌入式:飛思卡爾i.MX RT系列微控制器啟動篇(9)- 從Parallel NOR啟動
16bit erase section cloud 你會 命令執行 選型 兩個 寬度 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是飛思卡爾i.MX RT系列MCU的Parallel NOR啟動。 上一篇講i.MXRT從Raw NAND啟動的文章
react系列(五)在React中使用Redux
上一篇展示了Redux的基本使用,可以看到Redux非常簡單易用,不限於React,也可以在Angular、Vue等框架中使用,只要需要Redux的設計思想的地方,就可以使用它。 這篇主要講解在React中使用Redux,首先是安裝。 安裝React Redux yarn add redux yarn a