當前位置:首頁 » 安卓系統 » android共享進程

android共享進程

發布時間: 2022-07-10 15:58:15

Ⅰ Android進程與線程區別

所以下來特地去查了以下資料,先說說線程:
(1)在Android APP中,只允許有一個主線程,進行UI的渲染等等,但是不能進行耗時操作(網路交互等等),否則會造成ANR,就是線程阻塞卡死,未響應。
(2)除了主線程之外,耗時操作都應該規范到子線程中,線程之間會有相應的通信方式,但相互獨立。
(3)然後看了一下所查資料:
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。線程比進程更小,基本上不擁有系統資源,故對它的調度所用資源小,能更高效的提高系統內多個程序間並發執行的。 嗯,從大的說就是這樣。
在平時的Android開發過程中,基本上都會用到線程handler,thread等等,具體的實現方法我就不在這里寫了。

進程:
根據所查資料:是一個具有獨立功能的程序關於某個數據集合的一次運行活動。進程是系統進行資源分配和調度的一個獨立單位。可以申請和擁有系統資源,是一個動態的概念,是一個活動的實體,是一個「執行中的程序」。不只是程序的代碼,還包括當前的活動。
這應該是一個比較大的概念,存在於一個系統中,與線程的區別是:

1、子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器為其執行上下文。
2、進程間相互獨立,同一進程的各線程間共享。某進程內的線程在其它進程不可見。

3、進程間通信IPC,線程間可以直接讀寫進程數據段(如全局變數)來進行通信——需要進程同步和互斥手段的輔助,以保證數據的一致性。

4、線程上下文切換比進程上下文切換要快得多。

Ⅱ Android 進程間通信的幾種實現方式

Android 進程間通信的幾種實現方式

主要有4種方式:

這4種方式正好對應於android系統中4種應用程序組件:Activity、Content Provider、Broadcast和Service。

主要實現原理:

由於應用程序之間不能共享內存。為了在不同應用程序之間交互數據(跨進程通訊),AndroidSDK中提供了4種用於跨進程通訊的方式進行交互數據,實現進程間通信主要是使用sdk中提供的4組組件根據實際開發情況進行實現數據交互。

詳細實現方式:

Acitivity實現方式

Activity的跨進程訪問與進程內訪問略有不同。雖然它們都需要Intent對象,但跨進程訪問並不需要指定Context對象和Activity的 Class對象,而需要指定的是要訪問的Activity所對應的Action(一個字元串)。有些Activity還需要指定一個Uri(通過 Intent構造方法的第2個參數指定)。 在android系統中有很多應用程序提供了可以跨進程訪問的Activity,例如,下面的代碼可以直接調用撥打電話的Activity。

java">IntentcallIntent=newIntent(Intent.ACTION_CALL,Uri.parse("tel:12345678");
startActivity(callIntent);


Content Provider實現方式

Android應用程序可以使用文件或SqlLite資料庫存儲數據。Content Provider提供了一種在多個應用程序之間數據共享的方式(跨進程共享數據)

應用程序可以利用Content Provider完成下面的工作

1. 查詢數據
2. 修改數據
3. 添加數據
4. 刪除數據

Broadcast 廣播實現方式

廣播是一種被動跨進程通訊的方式。當某個程序向系統發送廣播時,其他的應用程序只能被動地接收廣播數據。這就象電台進行廣播一樣,聽眾只能被動地收聽,而不能主動與電台進行溝通。在應用程序中發送廣播比較簡單。只需要調用sendBroadcast方法即可。該方法需要一個Intent對象。通過Intent對象可以發送需要廣播的數據。


Service實現方式

常用的使用方式之一:利用AIDL Service實現跨進程通信

這是我個人比較推崇的方式,因為它相比Broadcast而言,雖然實現上稍微麻煩了一點,但是它的優勢就是不會像廣播那樣在手機中的廣播較多時會有明顯的時延,甚至有廣播發送不成功的情況出現。

注意普通的Service並不能實現跨進程操作,實際上普通的Service和它所在的應用處於同一個進程中,而且它也不會專門開一條新的線程,因此如果在普通的Service中實現在耗時的任務,需要新開線程。

要實現跨進程通信,需要藉助AIDL(Android Interface Definition Language)。Android中的跨進程服務其實是採用C/S的架構,因而AIDL的目的就是實現通信介面。


總結

跨進程通訊這個方面service方式的通訊遠遠復雜於其他幾種通訊方式,實際開發中Activity、Content Provider、Broadcast和Service。4種經常用到,學習過程中要對沒種實現方式有一定的了解。

Ⅲ 如何android多Activity間共享數據

其實有如下5種方式:
1.基於消息的通信機制 Intent ---boudle ,extra
數據類型有限,比如遇到不可序列化的數據Bitmap,InputStream, 或者LinkList鏈表等等數據類型就不太好用。
2. 利用static靜態數據,public static成員變數;
3.基於外部存儲的傳輸, File/Preference/ Sqlite ,如果要針對第三方應用需要Content Provider

4.基於IPC的通信機制context 與Service之間的傳輸,如Activity與Service之間的通信,定義AIDL介面文件。
5. 基於Application Context
這裡面我覺得第五種方法更具普適性,在網上找了篇講解得好的文章,原文如下:

在Android中使用Intent在兩個Activity間傳遞數據時,只能是基本類型數據,或者是序列化對象。Intent是一種基於消息的進程內和進程間通信模型,當我們需要在我們應用程序內部,多個Activity間進行復雜數據對象共享交互時,使用Intent就顯得很不方便。此時,我們就需要一種數據共享的機制來實現。當然,直接使用java語言中的靜態變數是可以的,但在Android中有更為優雅的實現方式。

The more general problem you are encountering is how to save stateacross several Activities and all parts of your application. A staticvariable (for instance, a singleton) is a common Java way of achievingthis. I have found however, that a more elegant way in Android is toassociate your state with the Application context.

--如想在整個應用中使用,在java中一般是使用靜態變數,而在android中有個更優雅的方式是使用Application context。

As you know, each Activity is also a Context, which is informationabout its execution environment in the broadest sense. Your applicationalso has a context, and Android guarantees that it will exist as asingle instance across your application.

--每個Activity 都是Context,其包含了其運行時的一些狀態,android保證了其是single instance的。

The way to do this is to create your own subclass of android.app.Application,and then specify that class in the application tag in your manifest.Now Android will automatically create an instance of that class andmake it available for your entire application. You can access it fromany context using the Context.getApplicationContext() method (Activityalso provides a method getApplication() which has the exact sameeffect):

--方法是創建一個屬於你自己的android.app.Application的子類,然後在manifest中申明一下這個類,這是android就為此建立一個全局可用的實例,你可以在其他任何地方使用Context.getApplicationContext()方法獲取這個實例,進而獲取其中的狀態(變數)。

class MyApp extends Application { private String myState; public String getState(){ return myState; } public void setState(String s){ myState = s; } } class Blah extends Activity { @Override public void onCreate(Bundle b){ ... MyApp appState = ((MyApp)getApplicationContext()); String state = appState.getState(); ... } }

對於Application的生命周期,今天測試了一下,Application類型在該APP被install的時候就已經實例化了,並且onCreate也已經被調用了。
如果需要創建類型裡面可能需要用到的對象的話,就可以在構造函數裡面實現,但是如果需要將該類型bind Service或者registerReceiver等操作時,需要將這些操作放到onCreate中,否則會拋出異常。其原因主要是這個對象還沒有創建完成,此時你用這個對象來bindservice必然會出現意想不到的情況,所以在使用時還需要注意。

Ⅳ android匿名共享內存兩個進程間必須知道文件描述符嗎

在Android 匿名共享內存驅動源碼分析中詳細分析了匿名共享內存在Linux內核空間的實現,雖然內核空間實現了匿名共享內存,但仍然需要在用戶空間為用戶使用匿名共享內存提供訪問介面。Android系統在用戶空間,C++應用程序框架層,Java層分別提供了訪問介面

本文首先介紹匿名共享內存在用戶空間提供的C語言介面,在後續文章中在介紹Android匿名共享內存的C++及Java介面,從而全面理解並掌握Android匿名共享內存的使用。
1)匿名共享內存的創建
system\core\libcutils\ashmem-dev.c
Java代碼 收藏代碼
int ashmem_create_region(const char *name, size_t size)
{
int fd, ret;
//打開"/dev/ashmem"設備文件
fd = open(ASHMEM_DEVICE, O_RDWR);
if (fd < 0)
return fd;
//根據Java空間傳過來的名稱修改設備文件名
if (name) {
char buf[ASHMEM_NAME_LEN];
strlcpy(buf, name, sizeof(buf));
//進入匿名共享內存驅動修改匿名共享內存名稱
ret = ioctl(fd, ASHMEM_SET_NAME, buf);
if (ret < 0)
goto error;
}
////進入匿名共享內存驅動修改匿名共享內存大小
ret = ioctl(fd, ASHMEM_SET_SIZE, size);
if (ret < 0)
goto error;
return fd;
error:
close(fd);
return ret;
}
ASHMEM_DEVICE的宏定義如下:
Java代碼 收藏代碼
#define ASHMEM_DEVICE "/dev/ashmem"
函數ashmem_create_region首先通過open函數進入匿名共享內存驅動打開/dev/ashmem設備文件,打開過程在Android 匿名共享內存驅動源碼分析中已經詳細分析了,就是在匿名共享內存初始化過程創建的slab緩沖區ashmem_area_cachep中創建並初始化一個ashmem_area結構體了,接著通過IO命令來修改該ashmem_area結構體的成員name和size,具體設置過程請查看Android 匿名共享內存驅動源碼分析。匿名共享內存的創建過程可以歸納為以下三個步驟:
1.打開/dev/ashmem設備文件;
2. 修改匿名共享內存名稱
3. 修改匿名共享內存大小

2)設置匿名共享內存屬性
通過Ioctl命令控制系統調用進入內核空間的匿名共享內存驅動來設置匿名共享內存塊的屬性值,比如設置匿名共享內存塊的鎖定與解鎖,設置匿名共享內存塊的大小,名稱,保護位等屬性信息。Android對匿名共享內存的這些屬性訪問也提供了相應的C語言介面:

1. 設置匿名共享內存的保護位

Java代碼 收藏代碼
int ashmem_set_prot_region(int fd, int prot)
{
return ioctl(fd, ASHMEM_SET_PROT_MASK, prot);
}

2.鎖定匿名共享內存塊
Java代碼 收藏代碼
int ashmem_pin_region(int fd, size_t offset, size_t len)
{
struct ashmem_pin pin = { offset, len };
return ioctl(fd, ASHMEM_PIN, &pin);
}

3.解鎖指定匿名共享內存塊
Java代碼 收藏代碼
int ashmem_unpin_region(int fd, size_t offset, size_t len)
{
struct ashmem_pin pin = { offset, len };
return ioctl(fd, ASHMEM_UNPIN, &pin);
}

4.獲取創建的匿名共享內存大小
Java代碼 收藏代碼
int ashmem_get_size_region(int fd)
{
return ioctl(fd, ASHMEM_GET_SIZE, NULL);
}
無論是匿名共享內存的屬性設置還是獲取,都是直接使用ioctl系統調用進入匿名共享內存驅動中實現的,關於匿名共享內存驅動是如何實現這些功能的,在Android 匿名共享內存驅動源碼分析中有詳細的介紹,這里就不重復介紹了。這里我們知道Android提供的匿名共享內存C語言介面比較簡單。了解了匿名共享內存的C語言介面之後也為以後學習匿名共享內存的C++介面提供基礎。

Ⅳ 安卓sharepreference能跨進程共享數據嗎

使用的SharePreferences
都是使用模式Context.MODE_PRIVATE,這樣就不能被其他程序訪問到,用不同的模式可以實現跨進程,跨應用獲取該文件內容

String content = null;
Context c = null;
try {
c = this.createPackageContext(PREFERENCE_PACKAGE,
Context.CONTEXT_IGNORE_SECURITY);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d(TAG, "" + c);
SharedPreferences sh = c.getSharedPreferences(PREFERENCE_NAME, Context.MODE_WORLD_READABLE | Context.MODE_MULTI_PROCESS);
content = sh.getString("tr069token3", null);
在Android 4.0上通過以上方法可以跨進程訪問,之前沒有加入Context.MODE_MULTI_PROCESS參數,導致不能獲取到修改後的數據。在2.3的室內機上不能獲取,沒有許可權。

Ⅵ Android中的線程與進程之間的關系簡單解釋

一、Android中的進程
當一個程序第一次啟動的時候,Android會啟動一個LINUX進程和一個主線程。默認的情況下,所有該程序的組件都將在該進程和線程中運行。 同時,Android會為每個應用程序分配一個單獨的LINUX用戶。Android會盡量保留一個正在運行進程,只在內存資源出現不足時,Android會嘗試停止一些進程從而釋放足夠的資源給其他新的進程使用, 也能保證用戶正在訪問的當前進程有足夠的資源去及時地響應用戶的事件。
我們可以將一些組件運行在其他進程中,並且可以為任意的進程添加線程。組件運行在哪個進程中是在manifest文件里設置的,其中<Activity>,<Service>,<receiver>和<provider>都有一個process屬性來指定該組件運行在哪個進程之中。我們可以設置這個屬性,使得每個組件運行在它們自己的進程中,或是幾個組件共同享用一個進程,或是不共同享用。<application>元素也有一個process屬性,用來指定所有的組件的默認屬性。
Android中的所有組件都在指定的進程中的主線程中實例化的,對組件的系統調用也是由主線程發出的。每個實例不會建立新的線程。對系統調用進行響應的方法——例如負責執行用戶動作的View.onKeyDown()和組件的生命周期函數——都是運行在這個主線程中的。這意味著當系統調用這個組件時,這個組件不能長時間的阻塞主線程。例如進行網路操作時或是更新UI時,如果運行時間較長,就不能直接在主線程中運行,因為這樣會阻塞這個進程中其他的組件,我們可以將這樣的組件分配到新建的線程中或是其他的線程中運行。
二、Android中的線程
線程在代碼是使用標準的java Thread對象來建立,那麼在Android系統中提供了一系列方便的類來管理線程——Looper用來在一個線程中執行消息循環,Handler用來處理消息,HandlerThread創建帶有消息循環的線程。
三、進程與線程的關系
它們之間的區別:

1、線程是進程的一部分,所以線程有的時候被稱為是輕權進程或者輕量級進程。
2、一個沒有線程的進程是可以被看作單線程的,如果一個進程內擁有多個進程,進程的執行過程不是一條線(線程)的,而是多條線(線程)共同完成的。
3、系統在運行的時候會為每個進程分配不同的內存區域,但是不會為線程分配內存(線程所使用的資源是它所屬的進程的資源),線程組只能共享資源。那就是說,出了CPU之外(線程在運行的時候要佔用CPU資源),計算機內部的軟硬體資源的分配與線程無關,線程只能共享它所屬進程的資源。
4、與進程的控製表PCB相似,線程也有自己的控製表TCB,但是TCB中所保存的線程狀態比PCB表中少多了。
5、進程是系統所有資源分配時候的一個基本單位,擁有一個完整的虛擬空間地址,並不依賴線程而獨立存在。
它們之間的聯系:
簡單的說就是:一個程序包含進程,進程又包含線程,線程是進程的一個組成部分,進程是操作系統分配資源的基本單位,線程是不會分配資源的,一個進程可以包含多個線程,然後這些線程共享進程的資源。
分開來說就是:
線程是進程的一個實體,是CPU 調度和分配的基本單位,其本身不擁有系統資源,只含有程序計數器、寄存器和棧等一些運行時必不可少的基本資源。同屬一個進程的線程共享進程中的全部資源。
進程是系統資源分配時的一個基本單位,擁有一個完整的虛擬空間地址。
系統在運行的時候會為每個進程分配不同的內存區域。
線程組只能共享資源,即除了CPU外,計算機內部的軟硬體資源的分配與線程無關,線程只能共享它所屬進程的資源。

Ⅶ Android中線程與線程,進程與進程之間如何通信

使用handler發送message,消息隊列排隊

進程是一個具有獨立功能的程序關於某個數據集合的一次運行活動。它可以申請和擁有系統資源,是一個動態的概念,是一個活動的實體。它不只是程序的代碼,還包括當前的活動,通過程序計數器的值和處理寄存器的內容來表示。
進程是一個「執行中的程序」。程序是一個沒有生命的實體,只有處理器賦予程序生命時,它才能成為一個活動的實體,我們稱其為進程。
通常在一個進程中可以包含若干個線程,它們可以利用進程所擁有的資源。在引入線程的操作系統中,通常都是把進程作為分配資源的基本單位,而把線程作為獨立運行和獨立調度的基本單位。由於線程比進程更小,基本上不擁有系統資源,故對它的調度所付出的開銷就會小得多,能更高效的提高系統內多個程序間並發執行的程度。
線程和進程的區別在於,子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器為其執行上下文。多線程主要是為了節約CPU時間,發揮利用,根據具體情況而定。線程的運行中需要使用計算機的內存資源和CPU。

熱點內容
跳轉頁源碼 發布:2024-09-17 03:13:05 瀏覽:543
html文件上傳表單 發布:2024-09-17 03:08:02 瀏覽:784
聊天軟體編程 發布:2024-09-17 03:00:07 瀏覽:726
linuxoracle安裝路徑 發布:2024-09-17 01:57:29 瀏覽:688
兩個安卓手機照片怎麼同步 發布:2024-09-17 01:51:53 瀏覽:207
cf編譯後沒有黑框跳出來 發布:2024-09-17 01:46:54 瀏覽:249
安卓怎麼禁用應用讀取列表 發布:2024-09-17 01:46:45 瀏覽:524
win10設密碼在哪裡 發布:2024-09-17 01:33:32 瀏覽:662
情逢敵手迅雷下載ftp 發布:2024-09-17 01:32:35 瀏覽:337
安卓如何讓軟體按照步驟自動運行 發布:2024-09-17 01:28:27 瀏覽:197