intitle 做网站,个人网站备案可以做博客吗,互联网创业项目概述,重庆南岸营销型网站建设公司推荐Android 同花顺面经 文章目录 Android 同花顺面经一面 一面
Android组件化搭建使用接口层路由有什么缺点#xff1f; 如果更改接口的话#xff0c;其他的依赖的moudle都得改 说说kotlin和java的区别#xff1f; Java是支持面向对象的编程#xff0c;Kotlin是支持面向对象支…Android 同花顺面经 文章目录 Android 同花顺面经一面 一面
Android组件化搭建使用接口层路由有什么缺点 如果更改接口的话其他的依赖的moudle都得改 说说kotlin和java的区别 Java是支持面向对象的编程Kotlin是支持面向对象支持函数式编程Kotlin允许用户创建扩展函数Java不支持任何扩展函数Kotlin使用var val 来定义变量Kotlin拥有很强大的Lambda表达式Kotlin 程序不需要分号而 Java 程序需要分号语言脚本功能允许您直接在 Gradle 构建脚本中使用 Kotlin而 Java 不提供语言脚本功能。Kotlin 中没有空变量或对象空变量或对象是 Java 语言的一部分。 假如老年代和新生代有互相引用他使用标记清除怎么处理 只需要在新生代上建立一个全局的数据结构这个数据结构将老年代划分为若干个小块每次都只记录老年代中的哪一块内存存在跨代引用。此后每当发生Minor GC时只有包含了跨代引用的那一小块内存才会被加入到GC Roots中进行扫描。新生代维护一个卡表一个卡页内存中通常包含不止一个对象只要卡页内某个对象的字段存在跨代指针那就将对应卡表数组对应位置上的元素标示为1称之为Dirty没有则标示为0称之为Clean。在垃圾收集时只需要筛选出卡表中变脏的元素就能够找到对应卡页内存块中包含的跨代指针将其加入到GC Roots中一并扫描。跨代引用、记忆集、卡表 实例.getClass() 与ClassForName.(类的全限定名)在执行过程中有什么区别 出现的时期不同Class.forname()在运行时加载Class.class和对象名.getClass()是在编译时加载Class c Class.class是Class的class属性Class c c.getClass()则是通过对象获得类Class.forname(“全限定类名”)在运行时加载对类进行加载使用反射 AIDL的具体实现步骤sub对象是什么角色 新建一个IImoocAIDL.aidl文件作文服务端rebuild一下自动生成IImoocAIDL.java的接口文件。自动生成的AIDL文件里面有
/*
* This file is auto-generated. DO NOT MODIFY.
* Original file: F:\\AS for android\\AIDLTest\\aidlclient\\src\\main\\aidl\\com\\mecury\\aidltest\\IImoocAIDL.aidl
*/
package com.mecury.aidltest;
// Declare any non-default types here with import statementspublic interface IImoocAIDL extends android.os.IInterface {/**
* Local-side IPC implementation stub class.
*/public static abstract class Stub extends android.os.Binder implements com.mecury.aidltest.IImoocAIDL {private static final java.lang.String DESCRIPTOR com.mecury.aidltest.IImoocAIDL; //Binder的唯一标识/**
* Construct the stub at attach it to the interface.
*/public Stub() {this.attachInterface(this, DESCRIPTOR);}/**
* Cast an IBinder object into an com.mecury.aidltest.IImoocAIDL interface,
* generating a proxy if needed.
*///将服务端的Binder对象转换成客户需要的AIDL对象转换区分进程客户端服务端位于同一进程返回服务端的//Stub对象本身否则返回的是系统的封装后的Stub.proxy对象。public static com.mecury.aidltest.IImoocAIDL asInterface(android.os.IBinder obj) {if ((obj null)) {return null;}android.os.IInterface iin obj.queryLocalInterface(DESCRIPTOR);if (((iin ! null) (iin instanceof com.mecury.aidltest.IImoocAIDL))) {return ((com.mecury.aidltest.IImoocAIDL) iin);}return new com.mecury.aidltest.IImoocAIDL.Stub.Proxy(obj);}//返回当前Binder对象Overridepublic android.os.IBinder asBinder() {return this;}//运行在服务端的Binder线程池中Overridepublic boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {switch (code) {case INTERFACE_TRANSACTION: {reply.writeString(DESCRIPTOR);return true;}case TRANSACTION_add: {data.enforceInterface(DESCRIPTOR);//读取客户端传递过来再data中存储的方法的参数int _arg0;_arg0 data.readInt();int _arg1;_arg1 data.readInt();//调用方法int _result this.add(_arg0, _arg1);//将计算结果写入reply中reply.writeNoException();reply.writeInt(_result);return true;}}return super.onTransact(code, data, reply, flags); //向Transact传递数据}//代理类运行在客户端private static class Proxy implements com.mecury.aidltest.IImoocAIDL {private android.os.IBinder mRemote; //声明一个IBinder对象Proxy(android.os.IBinder remote) {mRemote remote;}//返回当前Binder对象Overridepublic android.os.IBinder asBinder() {return mRemote;} public java.lang.String getInterfaceDescriptor() {return DESCRIPTOR;}//客户端调用此方法传递进来num1和num2两个参数Overridepublic int add(int num1, int num2) throws android.os.RemoteException {android.os.Parcel _data android.os.Parcel.obtain();android.os.Parcel _reply android.os.Parcel.obtain();int _result;try {//向_data中写入参数_data.writeInterfaceToken(DESCRIPTOR);_data.writeInt(num1);_data.writeInt(num2);//通过transact方法向服务端传递参数并调用了方法返回的结果写入_reply中mRemote.transact(Stub.TRANSACTION_add, _data, _reply, 0);_reply.readException();_result _reply.readInt();} finally {_reply.recycle();_data.recycle();}return _result;}}//标识位static final int TRANSACTION_add (android.os.IBinder.FIRST_CALL_TRANSACTION 0);}//计算num1 num2public int add(int num1, int num2) throws android.os.RemoteException;}
- 在服务端新建一个Service用来监听客户端连接请求private IBinder iBinder new IImoocAIDL.Stub(){Overridepublic int add(int num1, int num2) throws RemoteException {Log.e(TAG,收到了来自客户端的请求 num1 num2 );return num1 num2;}};- font stylecolor:rgb(79, 79, 79);在AndroidMainfest.xml注册Service/font
- font stylecolor:rgb(79, 79, 79);客户端绑定服务并调用服务端方法/fontprivate ServiceConnection conn new ServiceConnection() {//绑定服务回调onBind()方法Overridepublic void onServiceConnected(ComponentName name, IBinder service) {iImoocAIDL IImoocAIDL.Stub.asInterface(service);}Overridepublic void onServiceDisconnected(ComponentName name) {iImoocAIDL null;}};:::info sub是extends Binder类相当于可以进行跨进程通信implement 业务类。本身也是一个抽象类
:::
谈谈你对window和Activity和DecoView的关系的理解
:::info Activity就像个控制器不负责视图部分。Window像个承载器装着内部视图。DecorView就是个顶层视图是所有View的最外层布局。ViewRoot像个连接器负责沟通通过硬件的感知来通知视图进行用户之间的交互。
推荐阅读简析 Window、Activity、DecorView 以及 ViewRoot 之间的错综关系
:::
AIDL与Messenger、Binder区别
:::info
只有当你允许来自不同的客户端访问你的服务并且需要处理多线程问题时你才必须使用AIDL如果进程间的通信来自同一应用应该使用Binder如果进程间的通信不需要处理多线程应该使用MessengerMessenger不适用大量并发的请求Messenger以串行的方式来处理客户端发来的消息如果大量的消息同时发送到服务端服务端仍然只能一个个的去处理。Messenger主要是为了传递消息对于需要跨进程调用服务端的方法这种情景不适用Messenger。Messenger的底层实现是AIDL系统为我们做了封装从而方便上层的调用。AIDL适用于大量并发的请求以及涉及到服务端端方法调用的情况
:::