Android跨程序通訊的四種方式
完整示例請參閱本文提供的原始碼。
方式一:訪問其他應用程式的Activity
Activity既可以在程序內(同一個應用程式)訪問,也可以跨程序訪問。如果想在同一個應用程式中訪問Activity,需要指定Context物件和Activity的Class物件,程式碼如下:
- Intent intent = new Intent(this , Test.class );
- startActivity(intent);
- Intent intent = new Intent(this, Test.class);
-
startActivity(intent);
Activity的跨程序訪問與程序內訪問略有不同。雖然它們都需要Intent物件,但跨程序訪問並不需要指定Context物件和Activity的 Class物件,而需要指定的是要訪問的Activity所對應的Action(一個字串)。有些Activity還需要指定一個Uri(通過 Intent構造方法的第2個引數指定)。
在android系統中有很多應用程式提供了可以跨程序訪問的Activity,例如,下面的程式碼可以直接呼叫撥打電話的Activity。
-
Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:12345678"
- startActivity(callIntent);
- Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:12345678");
- startActivity(callIntent);
執行上面的程式碼後,系統會自動撥號,介面如圖1所示。
在呼叫撥號程式的程式碼中使用了一個Intent.ACTION_CALL常量,該常量的定義如下:
-
public static final String ACTION_CALL = "android.intent.action.CALL"
- publicstaticfinal String ACTION_CALL = "android.intent.action.CALL";
這個常量是一個字串常量,也是我們在這節要介紹的跨程序呼叫Activity的關鍵。如果在應用程式中要共享某個Activity,需要為這個 Activity指定一個字串ID,也就是Action。也可以將這個Action看做這個Activity的key。在其他的應用程式中只要通過這個 Action就可以找到與Action對應的Activity,並通過startActivity方法來啟動這個Activity。
下面先來看一下如何將應用程式的Activity共享出來,讀者可按如下幾步來共享Activity:
1. 在AndroidManifest.xml檔案中指定Action。指定Action要使用<action>標籤,並在該標籤的android:name屬性中指定Action
2. 在AndroidManifest.xml檔案中指定訪問協議。在指定Uri(Intent類的第2個引數)時需要訪問協議。訪問協議需要使 用<data>標籤的android:scheme屬性來指定。如果該屬性的值是“abc”,那麼Uri就應該是“abc://Uri的主體 部分”,也就是說,訪問協議是Uri的開頭部分。
3. 通過getIntent().getData().getHost()方法獲得協議後的Uri的主體部分。這個Host只是個稱謂,並不一定是主機名。讀者可以將其看成是任意的字串。
4. 從Bundle物件中獲得其他應用程式傳遞過來的資料。
5. 這一步當然是獲得資料後做進一步的處理了。至於如何處理這些資料,就得根據具體的需求決定了。
下面來根據這些步驟共享一個Activity。首先建立一個android工程(ActionActivity),工程的主Activity是Main。在 本例中我們會共享這個Main類。首先開啟AndroidManifest.xml檔案,新增一個<activity>標籤,並重新定義了 Main的相應屬性。AndroidManifest.xml檔案的內容如下:
- <!-- 重新配置Main -->
- < activity android:name=".Main" android:label="@string/app_name" >
- <intent-filter>
- <action android:name="net.blogjava.mobile.MYACTION" />
- <data android:scheme="info" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- < /activity>
- <!-- 重新配置Main -->
- <activity android:name=".Main" android:label="@string/app_name">
- <intent-filter>
- <action android:name="net.blogjava.mobile.MYACTION" />
- <data android:scheme="info" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
在配置AndroidManifest.xml時要注意,不能在同一個<activity>中配置多個動作,否則會覆蓋MAIN動作以使該程式無法正常啟動(雖然其他應用程式呼叫Main是正常的)。
從上面的程式碼可以看出,<action>標籤的android:name屬性值是 net.blogjava.mobile.MYACTION,這就是Main自定義的動作。<data>標籤指定了Url的協議。如果指定 了<data>標籤的android:scheme屬性值(info),則在呼叫Main時需要使用如下的URL:
- info://任意字串
- info://任意字串
一般<category>標籤的android:name屬性值可以設成android.intent.category.DEFAULT。
下面來看看如何在Main類的onCreate方法中獲得其他應用程式傳遞過來的資料。
- package net.blogjava.mobile.actionactivity;
- ... ...
- public class Main extends Activity implements OnClickListener
- {
- private EditText editText;
- @Override
- public void onClick(View view)
- {
- // 單擊按鈕,會顯示文字框中的內容(以Toast資訊框形式顯示)
- Toast.makeText(this , editText.getText().toString(), Toast.LENGTH_LONG)
- .show();
- }
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super .onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button button = (Button) findViewById(R.id.button);
- button.setOnClickListener(this );
- editText = (EditText) findViewById(R.id.edittext);
- // 獲得其他應用程式傳遞過來的資料
- if (getIntent().getData() != null )
- {
- // 獲得Host,也就是info://後面的內容
- String host = getIntent().getData().getHost();
- Bundle bundle = getIntent().getExtras();
- // 其他的應用程式會傳遞過來一個value值,在該應用程式中需要獲得這個值
- String value = bundle.getString("value" );
- // 將Host和Value組合在一下顯示在EditText元件中
- editText.setText(host + ":" + value);
- // 呼叫了按鈕的單擊事件,顯示Toast資訊提示框
- onClick(button);
- }
- }
- }
- package net.blogjava.mobile.actionactivity;
- ... ...
- publicclass Main extends Activity implements OnClickListener
- {
- private EditText editText;
- @Override
- publicvoid onClick(View view)
- {
- // 單擊按鈕,會顯示文字框中的內容(以Toast資訊框形式顯示)
- Toast.makeText(this, editText.getText().toString(), Toast.LENGTH_LONG)
- .show();
- }
- @Override
- publicvoid onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button button = (Button) findViewById(R.id.button);
- button.setOnClickListener(this);
- editText = (EditText) findViewById(R.id.edittext);
- // 獲得其他應用程式傳遞過來的資料
- if (getIntent().getData() != null)
- {
- // 獲得Host,也就是info://後面的內容
- String host = getIntent().getData().getHost();
- Bundle bundle = getIntent().getExtras();
- // 其他的應用程式會傳遞過來一個value值,在該應用程式中需要獲得這個值
- String value = bundle.getString("value");
- // 將Host和Value組合在一下顯示在EditText元件中
- editText.setText(host + ":" + value);
- // 呼叫了按鈕的單擊事件,顯示Toast資訊提示框
- onClick(button);
- }
- }
- }
從上面的程式可以看出,首先通過getIntent().getData()來判斷其他的應用程式是否傳遞了Uri(getData方法返回了一個Uri 物件)。如果執行該程式,Uri為null,因此,不會執行if語句裡面的程式碼。當其他的應用程式傳遞了Uri物件後,系統會執行if語句裡面的程式碼。當 執行ActionActivity後,在文字框中輸入“Running”,單擊“顯示文字框的內容”按鈕,會顯示如圖2所示的Toast提示資訊框。
下面來看一下其他的應用程式是如何呼叫ActionActivity中的Main。新建一個android工程(InvokeActivity),並新增一個按鈕,按鈕的單擊事件方法程式碼如下:
- public void onClick(View view)
-
相關推薦
Android跨程序通訊的四種方式
由於android系統中應用程式之間不能共享記憶體。因此,在不同應用程式之間互動資料(跨程序通訊)就稍微麻煩一些。在android SDK中提供了4種用於跨程序通訊的方式。這4種方式正好對應於android系統中4種應用程式元件:Activity、Content
Android 程序間通訊四種方式
android系統中應用程式之間不能共享記憶體,在android SDK中提供了4種用於跨程序通訊的方式。這4種方式正好對應於android系統中4種應用程式元件:Activity、Content Provider、Broadcast和Service。 1、A
最優雅退出 Android 應用程序的 6 種方式
home鍵 應用 一點 container new 出棧 manage 而且 rec 一、容器式建立一個全局容器,把所有的Activity存儲起來,退出時循環遍歷finish所有Activity import java.util.ArrayList; impor
Android activity間通訊幾種方式
read flag 進程 destroy ads sage on() sting ogl Activity 通訊 Bundle 我們可以通過將數據封裝在Bundle對象中 ,然後在Intent跳轉的時候攜帶Bundle對象 bundle 本質上是使用 arrayMap實現
Android跨程序通訊Binder原理分析(二)
文章目錄 1 Binder原始碼分析 1.1 Service的註冊流程 1.2 Service的獲取流程 1.3 Service的使用流程 1 Binder原始碼分析 1.1 Service的註冊流程
Android跨程序通訊Binder原理分析(一)
文章目錄 1. Linux程序基礎 1.1 程序隔離 1.2 使用者空間/核心空間 1.3 核心模組/驅動 1.4 圖解 2. 為什麼要使用Binder 2.1 安全方面 2.2 效能方面(一
Android跨程序通訊:binder機制原理
個人閱讀收穫 通過binder驅動我們可以減少一次io操作,從而減少了我們程序通訊的花費的資源,加快了程序間通訊的速度。我們使用到了Linux的mmap()操作,從而實現了程序間的接收快取區與程序的空間區的對映,從而少了一次io操作。我們的客戶端會發送資訊通過我們io操作講
Android 跨程序通訊(一)
Android 跨程序通訊 Android 本身提供一四種方式進行實現跨程序通訊,他們也分別是Android的四大元件.分別是:Activity,Content Provider,Broadcast和Service. Activity實現跨程序通訊 以Activity方式實現
【朝花夕拾】效能優化篇之(八)AIDL與Android跨程序通訊
一、Linux程序間通訊 1、程序隔離 在作業系統中,程序與程序間的記憶體和資料都是不共享的。兩個程序就好像大海中相互獨立的兩個島嶼,各自生活在互相平行的兩個世界中,互不干擾,各
Android跨程序通訊AIDL詳解(附原始碼)
概述 AIDL:Android Interface Definition Language,即Android介面定義語言,記住,它是一門語言,設計它的目的就是為了實現跨程序通訊,我們知道Android的每一個程序都執行在獨立的記憶體中,程序之間程式碼是不能愉快
Android進階——Android跨程序通訊機制之Binder、IBinder、Parcel、AIDL
前言 Binder機制是Android系統提供的跨程序通訊機制,這篇文章開始會從Linux相關的基礎概念知識開始介紹,從基礎概念知識中引出Binder機制,歸納Binder機制與Linux系統的跨程序機制的優缺點,接著分析Binder的通訊模型和原理,而Bin
【朝花夕拾】Android效能篇之(七)Android跨程序通訊
前言 Android系統的執行由大量相互獨立的程序相互協助來完成的,所以Android程序間通訊問題,是做好Android開發高階工程師必須要跨過的一道坎,也是面試時經常被問及到的知識點。但是,我們是否真的清楚,Android中都有哪些方式實現跨程序通訊
Android跨程序通訊,深入淺出AIDL
今日科技快訊 昨日,美團點評宣佈完成新一輪40億美元融資,投後估值300億美元。此次融資由騰訊領投,引入了新的戰略投資方The Priceline Group以及其他國內外知名機構。此輪融資後,美團點評將在人工智慧、無人配送等前沿技術研發上加大投入,進一步推動現代服務業升級。 作者簡介 明天就
【朝花夕拾】一篇文章搞懂Android跨程序通訊
前言 只要是面試中高階工程師崗位,Android跨程序通訊就是最受面試官青睞的知識點。Android系統的執行由大量相互獨立的程序相互協助來完成的,所以Android程序間通訊問題,是做好Android開發高階工程師必須要跨過的一道坎。如果您還對這方面的
Android FastJson使用的四種方式
Fast Json是阿里建立的一款api介面,用於對Json的處理,Fast Json的效能是非常的良好的,解析的速度要超過其他的介面然而他的有點遠遠不止這些,我們來列舉一下他的相關優點吧. 1.首先就是速度上.Fast Json的解析速度是非常高效的,速度快
【Android開發】Android跨程序通訊(AIDL)官方文件及官方Demo講解
第一章、 關於Android跨程序的思考 先來回顧一下作業系統中的一些概念。 同一個程序中可以有多個執行緒,執行緒間通訊可以直接取得地址。因為Java程式的記憶體分配在連續的地址空間。 預設一個Java程式會開啟一個程序,執行在JVM中。但
Android跨程序通訊——AIDL使用方法淺析
我花了一週時間,查閱了許多的資料,在眾多AIDL介紹的文章中來來回回,反反覆覆地梳理線索,將一些概念反覆推敲,最終得出了AIDL使用的初步教程。之所以說是AIDL使用方法的初步教程,是因為IPC實在是一個很有學問的技術,我學識有限,在看羅昇陽老師有關AIDL的一系列部落格後,我認為,我最多隻能做一個使用方法的
Android中跨程序通訊的四種方式
由於android系統中應用程式之間不能共享記憶體。因此,在不同應用程式之間互動資料(跨程序通訊)就稍微麻煩一些。在android SDK中提供了4種用於跨程序通訊的方式。這4種方式正好對應於android系統中4種應用程式元件:Activity、Content Provider、Broadcast和Serv
android中跨程序通訊的4種方式
由於android系統中應用程式之間不能共享記憶體。因此,在不同應用程式之間互動資料(跨程序通訊)就稍微麻煩一些。在android SDK中提供了4種用於跨程序通訊的方式。這4種方式正好對應於android系統中4種應用程式元件:Activity、Content Prov
Android程序間通訊 - 幾種方式的對比總結
什麼是RPC RPC(Remote Procedure Call)即遠端過程呼叫,它是一種通過網路從遠端計算機程式上請求服務,在不需要了解底層網路技術的協議下,即可獲取計算機程序中的資料。RPC使得開發包括網路分散式多程式在內的應用程式更加容易。 RPC在OSI網路通訊7層模型中