文档章节

Android跨进程通信方式和Scheme跳转处理

_
 _OUTMAN_
发布于 2016/11/07 15:40
字数 1160
阅读 344
收藏 0

一、应用程序间通信

由于Android系统不能共享内存,所以不同应用程序进程间通信会有点麻烦。Android提供了4中方式,分别是Activity、Content Provider、Broadcast、AIDL。

Activity 提供其他应用程序访问Activity的方式

Content Provider 提供其他应用程序访问数据的接口方式,包括增、删、改、查。

Broadcast 可以向Android系统中所有应用程序发送广播,应用程序监听广播即可。

Service 主要通过AIDL方式提供访问

方式一、Activity

Activity的调用分为显示Intent和隐式Intent两种

显示Intent:通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的。

隐式Intent:通过Intent Filter来实现的,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间。

<!--  重新配置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方式,可以接受返回的数据。

方式二、Content Provider

Android应用程序可以使用文件或者SqlLite存储数据。Content Provider提供了在多个应用程序间共享数据的方式。对于访问Content Provider的程序,需要使用ContentResolver对象。

具体使用,就不详细描述,网上都有。

方式三、Broadcast

主要通过监听广播的方式实现,可以通过AndroidManifest静态注册,也可以通过代码动态注册。

Broadcast可以实现跨进程监听,接受响应。如果应用程序内部,可以使用LocalBroadcast。

方式四、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服务对象了。

二、Scheme实现应用程序间跳转步骤

1. 可以根据需要选择Activity或者Broadcast。

2. 定义统一的Scheme格式,同时满足Android和IOS、Native和Native、Native和H5间跳转格式。

3. 如果使用Activity方式,要考虑分发的Activity出现异常的情况,比如Activity要设置成透明,点击主动关闭自己等等。

4. 根据APP架构考虑分发Activity的位置,以及跳转到二级界面的情况。

比如现在好多APP使用了插件方式,就需要考虑,要跳转的界面的插件是否安装的情况;有的二级界面,需要先跳转到一级界面等等。

5. 剩下的就是根据Scheme格式,编写跳转界面代码了。

© 著作权归作者所有

_
粉丝 22
博文 133
码字总数 63959
作品 0
海淀
程序员
私信 提问
Android 平台上轻量级的组件间通信框架 - Andromeda

Andromeda是爱奇艺开源的一个Android平台上轻量级的组件间通信框架,主要特征如下: 不需要开发者进行bindService操作,即可实现不同进程的任意两个组件间的IPC通信; 即使不在同一进程,也可同...

bettar
2018/04/20
1K
0
Android中实现跨进程通信(IPC)的方式(三)之观察者模式

Android中实现跨进程通信(IPC)的方式(三)之观察者模式 前言     在Android中实现跨进程通信(IPC)的几种方式(一)中介绍了什么是多进程,为什么需要多进程,多进程的优缺点等。这篇我们将...

huangandroid
2018/06/03
0
0
Andromeda —— 适用于多进程架构的组件通信框架

Android 的组件化由来已久,已经生产了一些不错的方案,尤其是在页面跳转这方面,阿里的 ARouter、 天猫的统跳协议、 Airbnb 的 DeepLinkDispatch, 借助注解来完成页面的注册,巧妙地实现了...

OSC源创君
2018/07/13
2.2K
1
Android 跨进程通信方法

由于android系统中应用程序之间不能共享内存。因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些。在android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android...

天王盖地虎626
2018/12/24
312
0
Andromeda:首个适用于多进程架构的组件通信框架

其实Android的组件化由来已久,而且已经有了一些不错的方案,特别是在页面跳转这方面,比如阿里的ARouter, 天猫的统跳协议, Airbnb的DeepLinkDispatch, 借助注解来完成页面的注册,从而很巧妙...

bettar
2018/05/29
1
0

没有更多内容

加载失败,请刷新页面

加载更多

elasticsearch 6.x的基本dsl语句

本文使用的谷歌浏览器插件sense,链接如下sense插件(兼容es6.x版本) 查看集群状态 http://106.12.27.130:9200/_cat/health?v 绿色-一切都很好(集群功能齐全) 黄色——所有的数据都是可用...

长恭
35分钟前
10
0
Math对象的一些方法

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> //圆周率 console.log(Math.PI) ......

zhengzhixiang
41分钟前
12
0
移动端的弹窗滚动禁止body滚动

本文转载于:专业的前端网站➼移动端的弹窗滚动禁止body滚动 前言 最近一个需求是弹窗展示列表,显然是需要一个滚动条的,而滚动到底部就会穿透到body滚动,而阻止默认行为是不行的,这样两个...

前端老手
今天
17
0
设计模式 建造者模式和模板方法模式扩展篇

建造者模式和模板方法模式扩展篇 UML 与抽象工厂模式比较 本模式可以看出与抽象工厂非常类似,都是产生不同的产品,怎么区分这两种设计的使用场景呢 - 建造者模式关注的是基本方法的调...

木本本
今天
21
0
CPU 读取cache、内存、磁盘性能

google 工程师Jeff Dean 首先在他关于分布式系统的ppt文档列出来的,到处被引用的很多。 1秒=10^3毫秒=10^6微妙=10^9纳秒=10^12皮秒 读 cache ns 级,读内存100 ns,从内存顺序读1MB 250,000...

SibylY
今天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部