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