请选择 进入手机版 | 继续访问电脑版

12360技术网 - 专业IT技术发表平台

 立即注册  找回密码
查看: 9441|回复: 3

Android开发中的跨进程通信方式总结

[复制链接]

10

主题

20

帖子

250

积分

中级会员

Rank: 3Rank: 3

积分
250
发表于 2020-1-26 13:05:17 | 显示全部楼层 |阅读模式
Android开发中的跨进程通信方式

总的来说的Android跨进程通信的方式常用的有以下几种

  • Activity可以跨进程调用其他应用程序
  • Content Provider可以跨进程访问其他应用程序中的数据
  • Broadcast可以向android系统中所有应用程序发送广播
  • Service通信,这种可以跨进程通讯的服务叫AIDL服务
1.Activity通信方式

activity通信可以是当前应用程序的中的两个Activity进行数据交换,也可以跨进程,去和其他应用程序中的Activity进行通信。也是最常用的通信方式之一。下面描述的是App间通信的大致流程。
通信流程大致如下:
App_AActivity_AApp_BActivity_BonCreate()startActivityForResult()onCreate()setResult() / finish()onActivityResult()App_AActivity_AApp_BActivity_B代码如下:
Activity_A中启动方法Activity_B
  1.     /**     * Activity_A开始通信     */    public void startActivity_B() {        Intent intent = new Intent();        int requestCode = 1;        //设置启动的包名+类名(全路径)        intent.setClassName("com.appb.activity","com.appb.activity.Activity_B");        //设定将要传输的数据        intent.putExtra("requestKey", "testData");        super.startActivityForResult(intent, requestCode);    }
复制代码
Activity_BIntent中数据的获取
  1.     @Override    protected void onCreate(final Bundle savedInstanceState) {        Intent intent = getIntent();        //数据取得        mRequestData = intent.getStringExtra("requestKey");    }
复制代码
Activity_B中向Activity_B返回数据
  1.     public void closeActivity_B() {        Intent data= new Intent();        //返回数据定义        data.putExtra("responseKey", "responseData");        //返回数据设置        setResult(Activity.RESULT_OK, data);        //关闭当前Activity,返回启动Acivity        super.finish();    }
复制代码
Activity_A中接收Intent 中返回的数据
  1.     @Override    public void onActivityResult(int requestCode, int resultCode, Intent data) {        if(requestCode == 1 && resultCode == Activity.RESULT_OK){          //接收返回的数据          String responseData = data.getStringExtra("responseKey");        } else {         //TODO.        }    }
复制代码
2. Content Provider 通信

//TODO
3. Broadcast 通信

//TODO
4.Service通信方式

service通信其实就是安卓独有的AIDL服务,AIDLAndroid Interface definition language),接口描述语言(语法和java类似),android特有的一种IPC机制。
关联类图:

Binder的流程图:

具体实现步骤


  • 在客户端和服务端定义相同的aidl接口文件
aidi文件  TestAppService .aidl
  1. interface TestAppService {    int checkService(int requestId, TestAppServiceCallbacks callback);}
复制代码
aidi文件  TestAppServiceCallbacks .aidl
用于通信的回调
  1. interface TestAppServiceCallbacks {   void onCompleteCheckService(int requestId, int result);}
复制代码

  • 服务端代码实现
需要实现aidl编译后生成的 TestAppService.Stub 接口
  1. public class TestAppServiceBinder extends TestAppService.Stub {  @Override    public int checkService(int requestId, TestAppServiceCallbacks callback){        //TODO 其他逻辑处理        int result = 0;        callback.onCompleteCheckService( requestId, result );        return 0;    }}
复制代码
同时需要定义提供给外部App绑定的Service
  1. public TestAppAidlService extends Service {    private TestAppServiceBinder mBinder = null;    @Override    public void onCreate() {        super.onCreate();        mBinder = new TestAppServiceBinder(this);    }    @Nullable    @Override    public IBinder onBind(Intent intent) {        return mBinder;    }}
复制代码

  • 客户端代码实现
客户端定义连接对象
  1.     //客户端用来请求的service    private  TestAppService  testAppService;    //service的连接对象    private ServiceConnection serviceConnection = new  ServiceConnection () {        @Override        public void onServiceConnected(ComponentName name, IBinder service) {          // 我们这里拿到的对象其实就是其Stub的内部类Proxy对象           testAppService = TestAppService.Stub.asInterface(service);         }         @Override         public void onServiceDisconnected(ComponentName name) {         //TODO service断开连接        }    }
复制代码
客户端定义绑定服务
  1.   private boolean bindAppService() {        Intent intent = new Intent();        intent.setClassName("com.app.service", "com.app.service.TestAppService");        try {            if (getApplicationContext().bindService(intent, serviceConnection ,                 Context.BIND_AUTO_CREATE)) {                return true;            }        } catch (SecurityException ex) {        //TODO        }        return false;    }
复制代码
客户端开始调用Service
  1.     @Override    protected void onResume() {     //绑定service成功    if (bindAppService()){        int result = testAppService.checkService();       } else {      //TODO 绑定失败      }    }
复制代码
客户端Service回调处理
  1. private TestAppServiceCallbacks.Stub  testAppServiceCallbacks =      new TestAppServiceCallbacks.Stub(){      @Override      void onCompleteCheckService (int requestId, int result ){       //TODO 回调处理,接收服务端返回的数据      }  }
复制代码
                                                                                                                                       
                                                    
  • 点赞                        1                        
  • 收藏                        
  • 分享                                                                                                                        
  •                                                         
                                      
    • 文章举报                           
                                                
                                                                        
                                            
                                                        雨developer                                                                发布了3 篇原创文章 · 获赞 3 · 访问量 402                                                                                            私信                                                            关注
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x




上一篇:Codeforces Round #614 (Div. 2)A. ConneR and the A.R.C. Markland-N
下一篇:[Android] 旧版AS项目迁移到新版:support库版本冲突+RxVolley不支持中文ur
回复

使用道具 举报

0

主题

21

帖子

451

积分

中级会员

Rank: 3Rank: 3

积分
451
发表于 2020-1-28 16:38:05 | 显示全部楼层
这个帖子不回对不起自己![www.12360.co]
回复

使用道具 举报

0

主题

16

帖子

346

积分

中级会员

Rank: 3Rank: 3

积分
346
发表于 2020-2-3 00:36:18 | 显示全部楼层
楼主,大恩不言谢了![www.12360.co]
回复

使用道具 举报

0

主题

20

帖子

430

积分

中级会员

Rank: 3Rank: 3

积分
430
发表于 2020-2-3 11:31:54 | 显示全部楼层
其实我一直觉得楼主的品味不错!呵呵![www.12360.co]
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

12360技术网

GMT+8, 2020-2-18 06:52 , Processed in 0.081034 second(s), 25 queries .

本网站内容收集于互联网,Www.12360.Co不承担任何由于内容的合法性及健康性所引起的争议和法律责任。 欢迎大家对网站内容侵犯版权等不合法和不健康行为进行监督和举报。

© 2019-2020 Www.12360.Co

快速回复 返回顶部 返回列表