因爲Android系統不能共享內存,因此不一樣應用程序進程間通訊會有點麻煩。Android提供了4中方式,分別是Activity、Content Provider、Broadcast、AIDL。java
Activity 提供其餘應用程序訪問Activity的方式android
Content Provider 提供其餘應用程序訪問數據的接口方式,包括增、刪、改、查。架構
Broadcast 能夠向Android系統中全部應用程序發送廣播,應用程序監聽廣播便可。app
Service 主要經過AIDL方式提供訪問ide
方式1、Activityspa
Activity的調用分爲顯示Intent和隱式Intent兩種插件
顯示Intent:經過指定Intent組件名稱來實現的,它通常用在知道目標組件名稱的前提下,通常是在相同的應用程序內部實現的。code
隱式Intent:經過Intent Filter來實現的,它通常用在沒有明確指出目標組件名稱的前提下,通常是用於在不一樣應用程序之間。xml
<!-- 從新配置Main --> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="com.test.outman.TestAction" /> <data android:scheme="MyScheme://test" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
public void onClick(View view) { // 須要使用Intent類的第2個參數指定Uri Intent intent = new Intent("com.test.outman.TestAction", Uri .parse("MyScheme://test")); // 設置value屬性值 intent.putExtra("value", "調用成功"); startActivity(intent); }
使用Activity的好處是,經過startActivityForResult方式,能夠接受返回的數據。對象
方式2、Content Provider
Android應用程序可使用文件或者SqlLite存儲數據。Content Provider提供了在多個應用程序間共享數據的方式。對於訪問Content Provider的程序,須要使用ContentResolver對象。
具體使用,就不詳細描述,網上都有。
方式3、Broadcast
主要經過監聽廣播的方式實現,能夠經過AndroidManifest靜態註冊,也能夠經過代碼動態註冊。
Broadcast能夠實現跨進程監聽,接受響應。若是應用程序內部,可使用LocalBroadcast。
方式4、AIDL(Android Interface Definition Language)
其實是一種接口定義語言,核心是Service,相似C、S的客戶端和服務端結構。
1. 建立.aidl文件,自動生成.java文件
2. 建立Service的子類,並實現由aidl生成的java的接口
3. 在AndroidManifest中註冊該Service,添加IntentFilter,<action>標籤的android:name屬性值就是客戶端要引用該服務的ID,也就是Intent類構造方法的參數值。
package com.test.outman.mobile.aidlservice; interface ITestService { String getValue(); // 爲AIDL服務的接口方法,調用AIDL服務的程序須要調用該方法 }
public class TestService extends Service { // ITestService.Stub類是根據IMyService.aidl文件生成的類,該類中包含了接口方法(getValue) public class TestServiceImpl extends ITestService.Stub { @Override public String getValue() throws RemoteException { return "從AIDL服務得到的值."; } } @Override public IBinder onBind(Intent intent) { // 該方法必須返回TestServiceImpl類的對象實例 return new TestServiceImpl(); } }
<!-- 註冊服務 --> <service android:name=".TestService"> <intent-filter> <!-- 指定調用AIDL服務的ID --> <action android:name="com.test.outman.mobile.aidlservice.ITestService" /> </intent-filter> </service>
以上服務端的代碼就完成了,下面看下調用端,即客戶端代碼
1. 將aidl生成的java文件拷貝
2. 建立ServiceConnection對象
3. 經過bindService方式完成調用
public class MainActivity extends Activity implements OnClickListener { private ITestService testService = null; // 建立ServiceConnection對象 private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { // 得到AIDL服務對象 testService = ITestService.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { } }; @Override public void onClick(View view) { // 綁定AIDL服務 bindService(new Intent("com.test.outman.mobile.aidlservice.ITestService"), serviceConnection, Context.BIND_AUTO_CREATE); } }
Activity能夠跨進程調用其餘應用程序的Activity;ContentProvider能夠訪問其餘應用程序返回的 Cursor對象;Broadcast採用的是被動接收的方法,也就是說,客戶端只能接收廣播數據,而不能向發送廣播的程序發送信息。AIDL Service能夠將程序中的某個接口公開,這樣在其餘的應用程序中就能夠象訪問本地對象同樣訪問AIDL服務對象了。
1. 能夠根據須要選擇Activity或者Broadcast。
2. 定義統一的Scheme格式,同時知足Android和IOS、Native和Native、Native和H5間跳轉格式。
3. 若是使用Activity方式,要考慮分發的Activity出現異常的狀況,好比Activity要設置成透明,點擊主動關閉本身等等。
4. 根據APP架構考慮分發Activity的位置,以及跳轉到二級界面的狀況。
好比如今好多APP使用了插件方式,就須要考慮,要跳轉的界面的插件是否安裝的狀況;有的二級界面,須要先跳轉到一級界面等等。
5. 剩下的就是根據Scheme格式,編寫跳轉界面代碼了。