1. 程式人生 > >Android跨程序通訊的四種方式

Android跨程序通訊的四種方式

 由於android系統中應用程式之間不能共享記憶體。因此,在不同應用程式之間互動資料(跨程序通訊)就稍微麻煩一些。在android SDK中提供了4種用於跨程序通訊的方式。這4種方式正好對應於android系統中4種應用程式元件:Activity、Content Provider、Broadcast和Service。其中Activity可以跨程序呼叫其他應用程式的Activity;Content Provider可以跨程序訪問其他應用程式中的資料(以Cursor物件形式返回),當然,也可以對其他應用程式的資料進行增、刪、改操 作;Broadcast可以向android系統中所有應用程式傳送廣播,而需要跨程序通訊的應用程式可以監聽這些廣播;Service和Content Provider類似,也可以訪問其他應用程式中的資料,但不同的是,Content Provider返回的是Cursor物件,而Service返回的是Java物件,這種可以跨程序通訊的服務叫AIDL服務。
完整示例請參閱本文提供的原始碼。

方式一:訪問其他應用程式的Activity
Activity既可以在程序內(同一個應用程式)訪問,也可以跨程序訪問。如果想在同一個應用程式中訪問Activity,需要指定Context物件和Activity的Class物件,程式碼如下:

  1. Intent intent = new  Intent(this , Test.class );  
  2. startActivity(intent);  
  1. Intent intent = new Intent(this, Test.class);  
  2. startActivity(intent);  

      Activity的跨程序訪問與程序內訪問略有不同。雖然它們都需要Intent物件,但跨程序訪問並不需要指定Context物件和Activity的 Class物件,而需要指定的是要訪問的Activity所對應的Action(一個字串)。有些Activity還需要指定一個Uri(通過 Intent構造方法的第2個引數指定)。


         在android系統中有很多應用程式提供了可以跨程序訪問的Activity,例如,下面的程式碼可以直接呼叫撥打電話的Activity。

  1. Intent callIntent = new  Intent(Intent.ACTION_CALL, Uri.parse("tel:12345678"
     );  
  2. startActivity(callIntent);  
  1. Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:12345678");  
  2. startActivity(callIntent);  

       執行上面的程式碼後,系統會自動撥號,介面如圖1所示。

        在呼叫撥號程式的程式碼中使用了一個Intent.ACTION_CALL常量,該常量的定義如下:

  1. public  static  final  String ACTION_CALL = "android.intent.action.CALL"
     ;  
  1. 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檔案的內容如下:

  1. <!--  重新配置Main  -->  
  2. < activity android:name=".Main"  android:label="@string/app_name" >  
  3.     <intent-filter>      
  4.         <action android:name="net.blogjava.mobile.MYACTION"  />  
  5.         <data android:scheme="info"  />              
  6.         <category android:name="android.intent.category.DEFAULT"  />  
  7.     </intent-filter>  
  8. < /activity>  
  1. <!--  重新配置Main  -->  
  2. <activity android:name=".Main" android:label="@string/app_name">  
  3.     <intent-filter>      
  4.         <action android:name="net.blogjava.mobile.MYACTION" />  
  5.         <data android:scheme="info" />              
  6.         <category android:name="android.intent.category.DEFAULT" />  
  7.     </intent-filter>  
  8. </activity>  

       在配置AndroidManifest.xml時要注意,不能在同一個<activity>中配置多個動作,否則會覆蓋MAIN動作以使該程式無法正常啟動(雖然其他應用程式呼叫Main是正常的)。

         從上面的程式碼可以看出,<action>標籤的android:name屬性值是 net.blogjava.mobile.MYACTION,這就是Main自定義的動作。<data>標籤指定了Url的協議。如果指定 了<data>標籤的android:scheme屬性值(info),則在呼叫Main時需要使用如下的URL:

  1. info://任意字串   
  1. info://任意字串

         一般<category>標籤的android:name屬性值可以設成android.intent.category.DEFAULT。

         下面來看看如何在Main類的onCreate方法中獲得其他應用程式傳遞過來的資料。

  1. package  net.blogjava.mobile.actionactivity;  
  2. ... ...  
  3. public  class  Main extends  Activity implements  OnClickListener  
  4. {  
  5.     private  EditText editText;  
  6.     @Override   
  7.     public  void  onClick(View view)  
  8.     {  
  9.         //  單擊按鈕,會顯示文字框中的內容(以Toast資訊框形式顯示)   
  10.         Toast.makeText(this , editText.getText().toString(), Toast.LENGTH_LONG)  
  11.                 .show();  
  12.     }  
  13.     @Override   
  14.     public  void  onCreate(Bundle savedInstanceState)  
  15.     {  
  16.         super .onCreate(savedInstanceState);  
  17.         setContentView(R.layout.main);  
  18.         Button button = (Button) findViewById(R.id.button);  
  19.         button.setOnClickListener(this );  
  20.         editText = (EditText) findViewById(R.id.edittext);  
  21.         //  獲得其他應用程式傳遞過來的資料   
  22.         if  (getIntent().getData() != null )  
  23.         {  
  24.             //  獲得Host,也就是info://後面的內容   
  25.             String host = getIntent().getData().getHost();  
  26.             Bundle bundle = getIntent().getExtras();  
  27.             //  其他的應用程式會傳遞過來一個value值,在該應用程式中需要獲得這個值   
  28.             String value = bundle.getString("value" );  
  29.             //  將Host和Value組合在一下顯示在EditText元件中   
  30.             editText.setText(host + ":"  + value);  
  31.             //  呼叫了按鈕的單擊事件,顯示Toast資訊提示框   
  32.             onClick(button);  
  33.         }  
  34.     }  
  35. }  
  1. package net.blogjava.mobile.actionactivity;  
  2. ... ...  
  3. publicclass Main extends Activity implements OnClickListener  
  4. {  
  5.     private EditText editText;  
  6.     @Override
  7.     publicvoid onClick(View view)  
  8.     {  
  9.         //  單擊按鈕,會顯示文字框中的內容(以Toast資訊框形式顯示)
  10.         Toast.makeText(this, editText.getText().toString(), Toast.LENGTH_LONG)  
  11.                 .show();  
  12.     }  
  13.     @Override
  14.     publicvoid onCreate(Bundle savedInstanceState)  
  15.     {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.main);  
  18.         Button button = (Button) findViewById(R.id.button);  
  19.         button.setOnClickListener(this);  
  20.         editText = (EditText) findViewById(R.id.edittext);  
  21.         //  獲得其他應用程式傳遞過來的資料
  22.         if (getIntent().getData() != null)  
  23.         {  
  24.             //  獲得Host,也就是info://後面的內容
  25.             String host = getIntent().getData().getHost();  
  26.             Bundle bundle = getIntent().getExtras();  
  27.             //  其他的應用程式會傳遞過來一個value值,在該應用程式中需要獲得這個值
  28.             String value = bundle.getString("value");  
  29.             //  將Host和Value組合在一下顯示在EditText元件中
  30.             editText.setText(host + ":" + value);  
  31.             //  呼叫了按鈕的單擊事件,顯示Toast資訊提示框
  32.             onClick(button);  
  33.         }  
  34.     }  
  35. }  

        從上面的程式可以看出,首先通過getIntent().getData()來判斷其他的應用程式是否傳遞了Uri(getData方法返回了一個Uri 物件)。如果執行該程式,Uri為null,因此,不會執行if語句裡面的程式碼。當其他的應用程式傳遞了Uri物件後,系統會執行if語句裡面的程式碼。當 執行ActionActivity後,在文字框中輸入“Running”,單擊“顯示文字框的內容”按鈕,會顯示如圖2所示的Toast提示資訊框。

           下面來看一下其他的應用程式是如何呼叫ActionActivity中的Main。新建一個android工程(InvokeActivity),並新增一個按鈕,按鈕的單擊事件方法程式碼如下:

  1. public  void  onClick(View view)  
  2. 相關推薦

    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層模型中