Android跨進程通訊方式和Scheme跳轉處理

1、應用程序間通訊

因爲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服務對象了。

2、Scheme實現應用程序間跳轉步驟

1. 能夠根據須要選擇Activity或者Broadcast。

2. 定義統一的Scheme格式,同時知足Android和IOS、Native和Native、Native和H5間跳轉格式。

3. 若是使用Activity方式,要考慮分發的Activity出現異常的狀況,好比Activity要設置成透明,點擊主動關閉本身等等。

4. 根據APP架構考慮分發Activity的位置,以及跳轉到二級界面的狀況。

好比如今好多APP使用了插件方式,就須要考慮,要跳轉的界面的插件是否安裝的狀況;有的二級界面,須要先跳轉到一級界面等等。

5. 剩下的就是根據Scheme格式,編寫跳轉界面代碼了。

相關文章
相關標籤/搜索