2024年最全Android跨进程通信(2),2024年最新音视频测试面试会问啥

最后

在这里小编整理了一份Android大厂常见面试题,和一些Android架构视频解析,都已整理成文档,全部都已打包好了,希望能够对大家有所帮助,在面试中能顺利通过。

image

image

喜欢本文的话,不妨顺手给我点个小赞、评论区留言或者转发支持一下呗

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

public class ClientActivity extends Activity {
private TextView mNameTxt;

/**

  • 客户端Messenger对象,用来接收服务端数据
    */
    private Messenger mClientMessenger = new Messenger(new Handler() {
    @Override
    public void handleMessage(Message msg) {
    super.handleMessage(msg);
    switch (msg.what) {
    case 1000:
    // 接收服务端数据
    Bundle bundle = (Bundle) msg.obj;
    mNameTxt.setText(bundle.getString(“name”));
    break;
    }
    }
    });

/**

  • 服务端Messenger对象,建立连接时获取,用来给服务端发消息
    */
    private Messenger mServerMessenger;
    private ServiceConnection mConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
    // 获取服务端Messenger对象
    mServerMessenger = new Messenger(service);
    }

@Override
public void onServiceDisconnected(ComponentName name) {
mServerMessenger = null;
}
};

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_common);

mNameTxt = (TextView) findViewById(R.id.name);

// 绑定远端服务
Intent intent = new Intent(this, MsgerService.class);
bindService(intent, mConnection, BIND_AUTO_CREATE);

findViewById(R.id.bind).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

int number = (int) (Math.random() * 100);
Message msg = Message.obtain();
msg.what = 1000;
msg.arg1 = number;
msg.replyTo = mClientMessenger;

// 给服务端发送消息
if (mServerMessenger != null) {
try {
mServerMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
}
}

AIDL

AIDL(Android Interface Definition Language)指的就是接口定义语言,通过它可以让客户端与服务端在进程间使用共同认可的编程接口来进行通信AIDL使用的步骤相对较多,主要总结为三个基本步骤:

  • 创建AIDL接口

  • 根据AIDL创建远程Service服务

  • 绑定远程Service服务

(1)创建AIDL接口
定义aidl接口文件
在Android Studio中已经集成好了这个文件的创建方式,直接右击工程,点击New -> AIDL -> AIDL File,然后输入接口的名称就好,将会在src/main目录下创建一个与java目录平级,且里面的包名与java目录里的包名一致,后缀为.aidl的文件

// Declare any non-default types here with import statements

interface IMyAidlTest {
/**

  • Demonstrates some basic types that you can use as parameters
  • and return values in AIDL.
    */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
    double aDouble, String aString);
    }

上面这个文件是Android Studio自动创建的模版文件,里面的basicTypes方法不需要使用到可以删掉。
AIDL对数据类型的支持包括Java中的所有基本数据类型,还有String、CharSequence、List、Map。

自定义AIDL的数据类型

在AIDL提供的默认数据类型无法满足需求的情况下,就需要自定义数据类型了,比如我们有个Product类,需要用来传递数据,那么这个类必须要实现Parcelable接口,并在AIDL中新建一个相同类名的aidl文件进行声明,并且这个aidl文件所在的路径必须要和java文件里的实体类路径保持一致,如以下文件Product.aidl

package demo.csdn.zhuwentao.bean;

parcelable Product;

然后在IMyAidlTest.aidl中使用import导入进来,除了AIDL默认支持的数据类型外,其它自定义的类型都需要通过此方法导入进来,包名路径需要精确到类名。

interface IMyAidlTest {
void addProduct(in Product person);
List getProductList();
}

这里的方法只作为接口声明的作用,以上定义的接口最终会在Service服务里实现具体的操作逻辑。

根据aidl文件生成java接口文件

这个步骤Android Studio已经帮我们集成好了,只需要点击 Build -> Make Project,或者点击AS上的那个小锤子图标就可以,构建完后将会自动根据我们定义的IMyAidlTest.aidl文件生成IMyAidlTest.java接口类,可以在build/generated/source/aidl/debug/路径下找到这个类。

(2)根据AIDL创建远程Service服务

上一步中创建好的IMyAidlTest.java接口文件,需要使用Service来进行绑定,这里就需要我们新建一个Service服务。

/**

  • 根据AIDL创建远程Service服务端
    */
    public class MyAidlService extends Service {

private List mProducts;
public MyAidlService() {
}

private IBinder mIBinder = new IMyAidlTest.Stub() {

@Override
public void addProduct(Product product) throws RemoteException {
mProducts.add(product);
}

@Override
public List getProductList() throws RemoteException {
return mProducts;
}
};

@Nullable
@Override
public IBinder onBind(Intent intent) {
mProducts = new ArrayList<>();
return mIBinder;
}
}

mIBinder对象实例化了IMyAidlTest.Stub,并在回调接口中实现了最终的处理逻辑
当与客户端绑定时,会触发onBind()方法,并返回一个Binder对象给客户端使用,客户端就可以通过这个类调用服务里实现好的接口方法
记得要在配置文件中加入声明,并使用android:process属性指定其运行在新的进程中。

配置好以上步骤后,跨进程通信的服务端就配置好了

(3)绑定远程Service服务

跨进程通信服务端实现好了后,就可以在客户端中开始调用它了,首先在Activity中先创建好服务连接对象

private IMyAidlTest mAidlTest;

private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mAidlTest = IMyAidlTest.Stub.asInterface(service);
}

@Override
public void onServiceDisconnected(ComponentName name) {
mAidlTest = null;
}
};

再通过Intent的bindService来绑定Service服务,建立起连接

Intent intent = new Intent(getApplicationContext(), MyAidlService.class);
bindService(intent, mServiceConnection, BIND_AUTO_CREATE);

最后

总而言之,成功是留给准备好的人的。无论是参加什么面试,都要做好充足的准备,注意好面试的礼仪和穿着,向面试官表现出自己的热忱与真诚就好。即使最后没有过关,也要做好经验的总结,为下一次面试做好充足准备。

这里我为大家准备了一些我在面试后整理的面试专题资料,除了面试题,还总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料分享给大家,希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

毕竟不管遇到什么样的面试官,去面试首先最主要的就是自己的实力,只要实力够硬,技术够强,就不怕面试拿不到offer!

为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值