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格式,编写跳转界面代码了。

相关文章
相关标签/搜索