首页 > 其他分享 >复习之IPC

复习之IPC

时间:2023-01-05 19:44:14浏览次数:46  
标签:IPC 复习 Service void aidl AIDL import android

一.IPC概念

IPC(interprocess communication):
是指进程间通信,不同操作系统都有自己的一套IPC机制。
Android中通过Binder和socket来进程间的通信。
如在Linux操作系统可以通过管道、信号量、消息队列、内存共享、套接字等进行进程间通信。
若在一个应用,可给四大组件在AndroidMenifest中指定android:process属性来实现不同的组件在不同进程中运行。

AIDL简介:
  Android Interface Definition Language的缩写,AIDL是一种IDL接口定义语言,用于生成可在Android设备上两个进程之间进行IPC的代码。
如在一个进程中(如Activity)要调用另一个进程中(如Service)对象的操作,就可用AIDL生成可序列化的参数。
AIDL IPC机制是面向接口的,像COM或Corba一样,但是更加轻量级。它是使用代理类在客户端和实现端传递数据。

AIDL语法规则:
默认情况下AIDL支持以下数据类型:
• 所有Java的基本数据类型(如 int, long,double, char, boolean等)
• String和CharSequence
• List:AIDL实际接收到的是ArrayList,并且List里面所有元素都必须被AIDL支持
• Map: AIDL实际接收到的是HashMap,并且Map里面所有元素都必须被AIDL支持
如果不是上面所述类型,我们必须要显示import进来,即使他们在同一个包中。
当使用自定义的对象时必须实现Parcelable接口,Parcelable为对象序列化接口,效率比实现Serializable接口高。并且新建一个与该类同名的AIDL文件,声明他为Parcelable类型。
定义AIDL接口的注意点:
• 方法可以有多个或没有参数,可以有返回值也可以为void
• 在参数中,除了基本类型以外,我们必须为参数标上方向in, out, 或者 inout
• 在AIDL文件中只支持方法,不支持静态常量

二. AIDL用法:
 1. 生成AIDL文件

    首先创建一个AIDL文件,在AndroidStudio中当创建一个AIDL文件时会自动为创件一个AILD文件夹,用于存放AIDL文件。创建完之后重新rebuild会自动生成aidl实现类。
在下面例子中,将Service单独作为一个应用在系统中运行,在另一个用于访问Service的client也单独作为一个应用运行在系统中。这样保证两个程序分别运行在两个进程中。

 

AIDL简单用法:
  在Service中我们对客户端传来的两个整数做了一次加法运算并返回到客户端中。

  按钮: Bind Service

  按钮: UnBind Service

  按钮: 2+4 

AIDL代码
// ICalculate.aidl
package com.ljd.aidl;
// Declare any non-default types here with import statements
interface ICalculate {
  /**
  * Demonstrates some basic types that you can use as parameters
  * and return values in AIDL.
  */
  int add(int first, int second);
}

 

服务端代码:
package com.ljd.aidl.service;
import android.app.Service;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import com.ljd.aidl.ICalculate;
public class CalculateService extends Service {
    public CalculateService() {
    }
    private Binder mBinder = new ICalculate.Stub(){
        @Override
        public int add(int first, int second) throws RemoteException {
            return first + second;
        }
    };
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
}
客户端代码 package com.ljd.aidl.activity; import android.content.ComponentName; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import com.ljd.aidl.ICalculate; import com.ljd.aidl.client.R; public class Demo1Activity extends AppCompatActivity { private final String TAG = "DEMO1"; private boolean mIsBindService; private ICalculate mCalculate; private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.d(TAG,"bind success"); Toast.makeText(Demo1Activity.this,"bind service success",Toast.LENGTH_SHORT).show(); mCalculate = ICalculate.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { //重新绑定Service防止系统将服务进程杀死而产生的调用错误。 bindService(); } }; @Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_demo1); mIsBindService = false; } @Override protected void onDestroy() { unbindService(); ButterKnife.unbind(this); super.onDestroy(); } @OnClick({ R.id.bind_demo1_btn,R.id.unbind_demo1_btn,R.id.calculate_btn}) public void onClickButton(View v) { switch (v.getId()){ case R.id.bind_demo1_btn: bindService(); break; case R.id.unbind_demo1_btn: unbindService(); break; case R.id.calculate_btn: if (mIsBindService && mCalculate != null ){ try { int result = mCalculate.add(2,4); Log.d(TAG,String.valueOf(result)); } } else { Toast.makeText(this,"not bind service",Toast.LENGTH_SHORT).show(); } break; } } private void bindService(){ Intent intent = new Intent(); intent.setAction("com.ljd.aidl.action.CALCULATE_SERVICE"); bindService(intent,mConnection, Context.BIND_AUTO_CREATE); mIsBindService = true; } private void unbindService(){ if(mIsBindService){ mIsBindService = false; unbindService(mConnection); } } }


 

标签:IPC,复习,Service,void,aidl,AIDL,import,android
From: https://www.cnblogs.com/awkflf11/p/17028678.html

相关文章

  • DS 复习
    莫队做法:将序列分块,对询问排序,对于左端点块相同,按右端点排序。(奇偶优化)证明:设块大小为\(B\),同一块内,右端点变化是\(O(n)\),遂\(O(n^2/B)\),左端点一共\(q\)个,每次变......
  • JavaSE复习
    面向对象面向对象编程(Object-OrientedProgramming/OOP)面向对象编程的本质:以类的方式组织代码,以对象的方式封装数据三大特性:封装、继承、多态从认识论角度考虑......
  • Java 复习篇2---jdk
    jdk文件:bin该路径下存放了各种工具命令,其中重要的有javac和Javaconf:改路径下存放了相关配置文件include:该路径下存放了一些平台特定的头文件jmods;该路径下存放......
  • Java复习篇3---基础概念
    关键字关键字:被Java赋予了特定含义的英文单词关键字的字母全是小写常用的代码编辑器,针对关键字会有特殊的颜色标记,非常直观例如:class:用于(创建\定义)一个类,后面紧......
  • 框架课学习笔记--复习篇
    现在springboot框架课完成前端游戏界面,后端登录注册页面。现在复习vue,巩固学到的知识,反复的看git的两个作用,一可以看到历史版本代码。存档的功能。二同步代码同步不......
  • 1.2复习了一下MySQL的索引
    今天又复习了一下索引,做一个总结吧主要就是复习了索引分类概念,索引使用,SQL优化等三个方面1.主键索引,唯一索引,常规索引;对于唯一索引,同一个表中可以创建多个,用作创建唯一......
  • (数学分析复习)含参量积分总结
    文章目录写在前面总结一下含参量正常积分、含参量反常积分、Euler积分,这部分内容主要为曲线积分曲面积分以及多重积分做铺垫。主要参考《数学分析(第四版)下册》(华东师范大......
  • Java编程技术期末复习总结
    Java编程技术期末复习总结一、Java编程基础下列软件包中,不需要使用import指令就可直接使用的是____。A.java.langB.java.textC.java.sqlD.java.utilA在java......
  • 一文带你复习好Mysql的核心知识点
    SQL优化调优是体现程序员分析归纳能力的有效手段,虽然我们不是DBA,但是编码开发时也会涉及许多对数据库的CRUD需求。因此,通过理解Mysql数据库的底层原理,对我们的笔试面试,还有......
  • 数据挖掘原理与应用期末考试复习
    1绪论数据挖掘定义数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的数据中提取隐含在其中的、人们事先不知道的、但又是潜在有用的信息和知识的过程。数据挖掘......