1. 程式人生 > >android開發之android:process屬性_application中onCreate執行多次

android開發之android:process屬性_application中onCreate執行多次

應用做的匆忙,很多地方只顧實現功能,沒有兼顧好效能,所以停下來重構程式碼優化效能,結果在打log看啟動時間的時候,發現

Application的onCreate執行了多次,這樣導致重複初始化資源,初始化了3次導致接近1s時間。

發現這個是由獨立程序引起的。即:process這個屬性。

android:process

 服務所在程序的名字。通常,一個應用的所有元件都執行在系統為這個應用所建立的預設程序中。這個預設程序是用這個應用的包名來命名的。

 標籤的process屬性可以設定成和所有元件都不同的預設值。但是這些元件可以通過設定自己的process值來覆寫這個預設值,這樣可以讓你的應用跨多程序執行。

如果被設定的程序名是以一個冒號開頭的,則這個新的程序對於這個應用來說是私有的,當它被需要或者這個服務需要在新程序中執行的時候,這個新程序將會被建立。如果這個程序的名字是以小寫字元開頭的,則這個服務將執行在一個以這個名字命名的全域性的程序中,當然前提是它有相應的許可權。這將允許在不同應用中的各種元件可以共享一個程序,從而減少資源的佔用。

 例如一個應用執行在程序com.aoyousatuo.example中,android:process屬性設定為com.rabbit.man,則新的程序名字為com.rabbit.run.

一般情況下一個服務沒有自己獨立的程序,它一般是作為一個執行緒運行於它所在的應用的程序中。但是也有例外,Android宣告檔案中的android:process屬性卻可以為任意元件包括應用指定程序,換句話說,通過在宣告檔案中設定android:process屬性,我們可以讓元件(例如Activity, Service等)和應用(Application)建立並運行於我們指定的程序中。

 如果我們需要讓一個服務在一個遠端程序中執行(而不是標準的它所在的

apk的程序中執行),我們可以在宣告檔案中這個服務的標籤中通過android:process屬性為其指定一個程序。

       注意:這裡選擇”remote”這個名字是隨意主觀的,你能用其他名字來讓這個服務在另外的程序中執行。冒號’:’這個字首將把這個名字附加到你的包所執行的標準程序名字的後面作為新的程序名稱。比如我這裡有一個百度地圖的服務,設定如下:

   <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":baiduMap" >
        </service>

在DDMS中可以看到這個程序為
com.example.hello:baiduMap

(如果宣告檔案中的元件或者應用沒有指定這個屬性則預設應用和其元件將相應執行在以其包名命名的程序中)

解決方法如下:

@Override
	public void onCreate() {
		super.onCreate();
		mApplication = this;
		long s1 = System.currentTimeMillis();
		String processName = OsUtils.getProcessName(this,
				android.os.Process.myPid());
		L.d(WModel.Time, "程序名稱"+processName);
		if (processName != null) {
			boolean defaultProcess = processName
					.equals(WMapConstants.REAL_PACKAGE_NAME);
			if (defaultProcess) {
				//必要的初始化資源操作
			}
		}
		L.d(WModel.Time, "onCreate耗時" + (System.currentTimeMillis() - s1));
	}
/**
     * @return null may be returned if the specified process not found
     */
    public static String getProcessName(Context cxt, int pid) {
        ActivityManager am = (ActivityManager) cxt.getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
        if (runningApps == null) {
            return null;
        }
        for (RunningAppProcessInfo procInfo : runningApps) {
            if (procInfo.pid == pid) {
                return procInfo.processName;
            }
        }
        return null;
    }

這樣一來只初始化一次,不會導致很長時間的浪費。

作者:jason0539

掃碼關注我微信公眾號


相關推薦

android開發android:process屬性_applicationonCreate執行

應用做的匆忙,很多地方只顧實現功能,沒有兼顧好效能,所以停下來重構程式碼優化效能,結果在打log看啟動時間的時候,發現Application的onCreate執行了多次,這樣導致重複初始化資源,初始化了

Android的ApplicationonCreate執行解決方案

       一般情況下,一個應用開啟一個程序,application會被執行一次,如果涉及多開程序,那情況就不同了,application就會被執行多次,下面筆者根據這問題對應用開啟多程序的進行分析: android:process        說到

Android開發Android studio的Theme Editor的簡單使用

本文章可以看到: 1. Android Studio 中 Theme 的編輯神器 如下圖: 主要功能:主題風格編輯 可以看到,裡面有外面熟悉的colorPrimary、colorPrimaryD

android開發自定義屬性、View和使用

“自定義”這三字聽起來就像是一個高階程式設計師所擁有的一樣!太不接地氣了!come on,baby,讓我們成為高階程式設計師吧!哈哈! 第一步:首先建立一個工程專案,在專案中的res/values/下建立atts.xml檔案,在該檔案中: <?xml version

Android開發自定義屬性的使用

自定義屬性一般會在我們自定義一個view的時候會用到,這個其實在系統應用中相當的常見,比如我目前維護的系統launcher應用,裡面就是相當多的自定義view會用到這個自定義屬性設定,那麼現將其總結總結。有些東西不去總結下來,時間久了真的會忘記。 步驟一:

Android開發 Android專案如何正確的引入第三方jar包(工程)

感謝作者方家仁兄 Android專案中如何正確的引入第三方jar包(工程) 最近在學習一個Android技術點時,需要在工程專案中引入第三方jar包,遇到的問題是在編譯的時候能通過,但是在實際執行的時候會出錯。後來經過調研發現,原來是在引入第三方jar包的時候出

Android開發Android studio 3.2.1配置androidannotations

androidannotations,Butterknife 元件等大大的提高了開發效率,但在配置androidannotations 的時候卻出現了問題,根據根據網上的資料配置 annotationProcessor “org.androidannotations:androidannot

Android開發 Android-Studio 開發環境配置

今天給大家帶來一篇Android開發的文章,這也正是督促我自己學習安卓開發的一個方式,本文作為開篇文章,就很簡單的給大家演示下Android-Studio開發環境的配置步驟;目前大家在安卓開發上用的最多的可能就是Android-Studio了,在我讀大學的時候聽

Android開發Android studio自動簽名打包release 版本的正確姿勢(完整版)

1.從以下方面講解打包正式版本分為:自動打包(也就是每次專案跑起來就是release正式版本)apk手動打包:就是每次需要重新簽名後選擇release正式版本再跑起來生成apk先說手動版本特別簡單圖文解說:你要先建立一個簽名檔案如下:再說下自動簽名打包:

mybatisupdate執行

首先得在連結資料庫的url中加入 mysql中 jdbc.url=jdbc:mysql://localhost:3306/springmvc?useUnicode=true&amp;cha

Android開發在xml設定自定義屬性

xml中設定自定義屬性 分三步: 1. 在專案中的values檔案中建立attrs檔案 <?xml version="1.0" encoding="utf-8"?> <resourc

Android開發Webview原生與JS互動

文章目錄 概述 使用場景 互動方式 Java呼叫JS程式碼 JS呼叫Java程式碼 總結 概述 由於手機硬體資源的快速提升,使得采用混合開發的可能性逐漸成為現實並且流行起來。Android開發中

android開發-相對佈局的屬性

// 相對於給定ID控制元件 android:layout_above 將該控制元件的底部置於給定ID的控制元件之上; android:layout_below 將該控制元件的底部置於給定ID的控制元件之下; android:layout_toLeftOf    將該控制元

android開發在activity控制另一個activity的UI更新

第一種方法: 遇到一個問題,需要在一個activity中控制另一個acitivity做一些更新,沒想到傳遞handler的方法,通過以下方式解決。 1.在MyAPP中定義屬性handler package jason.com; import jason.com.MasterAc

Android 開發】: Android 訊息處理機制三: Handler sendMessage() 原始碼剖析

  閱讀此文,請先閱讀以下相關連線: sendMessage()的幾種過載方法的使用方式的不同以及它們的原始碼的剖析.   通過前面幾講的內容,我們知道Android不但可以使用非同步任務處理多執行

Android開發自動生成的AndroidManifest.xml的allowBackup屬性的含義和危險性例項講解

一、前言 今天在開發的過程中遇到一個問題,就是關於AndroidManifest.xml中的allowBackup屬性,也算是自己之前對這個屬性的不瞭解,加上IDE的自動生成程式碼,沒太注意這個屬性,但是沒想到這個屬性會直接導致隱私資料的丟失。下面就來看一下這個屬性的影

Android開發ScrollView巢狀ListView的解決方案

import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.widget.BaseAdapter;

Android開發layout_weight屬性的應用

在Android開發過程中,Android開發者之間的交流學習是互通開源的。關於Android開發中layout佈局檔案中常用到的屬性,有很多小盆友不瞭解,今天就來為童鞋們整理分享如下內容: 在layout佈局檔案中經常用到android:layout_width、andr

Android開發TextView屬性大全

最近由於專案的需要,要對TextView的顯示做一些加粗,斜體等操作,在網上檢視TextView的屬性的時候,發現TextView的屬性真的很多很全,有一些我完全沒用過,所以根本不瞭解,於是我整理的一

Android開發EditText屬性詳解

1、EditText輸入的文字為密碼形式的設定 (1)通過.xml裡設定:  把該EditText設為:android:password="true" // 以”.”形式顯示文字 (2)在程式碼裡設定: 通過設定EditText的setTransformation