1. 程式人生 > >Android6.0 AMS啟動Activity(五) 在新程序中啟動Activity

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基礎知識之四大元件ActivityActivity生命週期場景的應用

今天,來寫一個關於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 BootWeb應用的統一異常處理

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