废品回收网站怎么做网站优化logo标志设计
- 作者: 五速梦信息网
- 时间: 2026年03月21日 11:18
当前位置: 首页 > news >正文
废品回收网站怎么做网站优化,logo标志设计,网站建设免费域名,配音秀做素材网站Android 滴滴面经 文章目录 Android 滴滴面经一面二面三面 一面
Activity的启动的四种模式#xff0c;四种启动模式的应用场景#xff0c;单例模式的启动场景#xff0c;我回答的是闹钟#xff0c;反问#xff1a;在单例模式下闹钟运行时点击back键#xff0c;是回退到闹…Android 滴滴面经 文章目录 Android 滴滴面经一面二面三面 一面
Activity的启动的四种模式四种启动模式的应用场景单例模式的启动场景我回答的是闹钟反问在单例模式下闹钟运行时点击back键是回退到闹钟的主页面还是整个桌面
LauchModeInstancestandard默认场景不需设置singleTopApp接受到多条推送消息点开不同消息均由同一实例展示singleTaskApp的主页无论那种业务场景下次回到此页面都不应该保留之上的ActivitysingleInstance如App经常调用拨打电话号码系统通讯录不同App调用此类Activity时首次创建实例之后其他的App只能复用此实例回到主页面
Dialog怎么添加到Activity中Toast怎么添加到Activity中答直接attach到Activity中反问那么当Toast的显示时间没到时Activity退出时Toast会怎么样
:::info
Window是一个抽象类具体的实现类是PhoneWindowandroid系统里面每个界面是对应一个windowwindow也是一个抽象的概念他是以view的形式存在在使用中无法直接访问window只能通过windowmanager才能访问window每个window都是对应一个View和一个ViewRootImplViewRootImpl是连接window和 WMS的桥梁WMS的消息是通过ViewRootImpl转发给View的WindowManager继承自ViewManager间接证明Window其实对应的是View常用的只有三个方法addView updateView 和 removeViewwindowmanager对应的实例是windowManagerImpl各种window的不同主要是token以及type的不同app中控制window是通过WindowManager.LayoutParams去控制eg通过xygravity去控制Activity的window添加过程 每个 Activity 内部都持有一个 window 对象其实现为 PhoneWindow在 Activity#attachContext 时创建PhoneWindow 的根布局为 DecorView其包括 TitleView 和 ContentViewActivity setContentView 就是把布局添加到 ContentView当 Activity 第一次回调 onResume 后开始将 Activity 的窗口添加到 WMS首先调用了 WindowManagerImplWindowManagerImpl 进一步调用进程单例的 WindowManagerGlobalWindowManagerGlobal 中创建了与 DecorView 对应的 ViewRootImpl并将 DecorView 和 ViewRootImpl 记录下来在 ViewRootImpl 中与 WMS 发生交互应用端通过 WindowSession 调用 WMSWMS 通过 IWindow 调用应用端WMS 中会对窗口进行权限、类型等检查最终将应用窗口信息记录下来**推荐阅读 Activity Window 创建及添加过程 Android Activity 创建 Window 及添加 View 流程分析 **Activity和dialog的窗口添加源码分析 dialog窗口添加过程 首先获取windowManager实例创建PhoneWindow对象设置回调对PhoneWindow设置windowManager实例调用setContentView方法把视图添加到PhoneWindow的DecorView中去Dialog#show中调用WindowManger#addView(DecorView,LayoutParams)方法去显示
:::
Service两种启动方式和区别以及运行线程应用场景反问既然Service默认在主线程执行耗时操作我们为什么不直接在Activity中直接新建一个线程去执行耗时操作还要搞一个Service里面在新建子线程去执行计算耗时操作这两者有什么区别多个Activity可以同时绑定一个Service吗顺便讲讲IntentService
:::info
多个Activity可以同时绑定一个Service 假设TestService已经处于运行状态和ActivityA通过bindService已经绑定好了那么ActivityB调用bindService时不会重新创建TestService的实例所以也不会执行TestService的OnCreate方法由于在ActivityA执行bindService的时候就已经执行了TestService的onBind回调方法而获取IBinder实例并且该IBinder实例在所有的client之间是共享的所以当ActivityB执行bindService的时候不会执行其onBind回调方法而是直接获取上次已经获取到的IBinder实例。并将其作为参数传入ActivityB的ServiceConnection的onServiceConnected方法中标志着ActivityB与TestService建立了绑定连接ActivityB销毁并Service并不会执行onUnbind方法进行销毁只有在ActivityA销毁之后ActivityA与Service解除了绑定此时再没有client与Service处于连接绑定状态这样Service就会执行onUnbind回调方法表示没有client和我玩了最后执行onDestroy回调方法。推荐阅读Android 多个Activity bindService的使用及Service生命周期 HandlerThread HandlerThread继承自Thread是一个线程HandlerThread中维护了一个Looper对象在线程执行体内启动Loop.loop开启循环 IntentService 是一个继承自Service的类他通过在Service服务中开启HandlerThread的消息队列使用HandlerThread的Looper来生成一个Handler对象在onStart()方法中发送消息然后执行onHandleIntent()方法onHandleIntent在子线程中执行我们可以将耗时任务放在这个方法中实现。 推荐阅读唠唠 HandlerThread 和 IntentService
:::
Activity与Fragment的通信方式有哪些?setArgument()通信方式和接口回调通信方式有什么区别扩展Fragment与Fragment通信方式
:::info
Activity传递数据给Fragment 在Activity中创建Bundle数据包调用Fragment实例的setArguments(bundle)从而将Bundle数据包传递给fragment若Activity中包含自己管理的Fragment的引用每个Fragment都有一个唯一的TAG或者ID,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例 可以直接通过引用访问所有的Fragment的public方法 Fragment传递数据给Activity 在Fragment中定义一个内部回调接口再让包含Fragment的Activity实现该回调接口Fragment的创建方法中把Activity的引用传递过来Fragment就可以通过回调方法来传输数据了 Fragment与Fragment通信 在Fragment A中调用Fragment B时通过newInstance函数获取实例并传递参数在newInstance函数中封装成bundle传递给FragmentB直接在一个Fragment中调用另外一个Fragment中的方法(ContentFragment) getActivity() .getFragmentManager().findFragmentById( R.id.content_fg);用广播实现两个Fragment之间的通信广播算是这里最灵活的通信方式了LocalBroadcastManager
推荐阅读fragment的使用(静态使用和动态使用)
:::
Fragment的添加方式有哪些静态加载和动态加载的区别静态加载的fragment可以被动态替换吗两个fragmentA 和 fragmentB 分别使用add 和 replace 加载其生命周期有什么区别
:::info
静态加载 定义fagment的xml布局文件自定义Fragment类继承Fragment类或者子类同时实现onCreateView()方法在方法中通过LayoutInflater.inflate加载布局直接返回view在需要加载Fragment的Activity对应布局文件中的name属性设为全限定类名 动态加载 通过getSupportFragmentManager()获得FragmentManager对象 通过fm.beginTransaction()获得FragmentTransaction调用add()方法或者replace()方法加载Fragment最后通过commit方法提交事务
fragment的onCreateView方法返回Fragment的UI布局 须要注意的是inflate()的第三个参数是false 在Fragment内部实现中会把布局添加到container 中如果设置为true那么会做两次重复添加会抛出The specified child already has a parent异常静态加载的fragment不可以被动态替换当fragment不可见时如果你要保留fragment中的数据以及view显示的状态那么可以使用add操作后续中针对不同的状态隐藏显示不同的fragment 优点快只是Fragment中的view的显示和隐藏缺点内存的保留太多的数据容易导致OOM的风险 当fragment不可见时不需要保留fragment中的数据以及view显示状态那么可以使用replace。 优点节省内存不需要的数据能立即释放掉。缺点频繁创建fragment会有很大的性能开销 如果当前Activity同一个id存在Fragment,replace传递的Fragment实例和已存在的Fragment实例不一样replace操作会转换为 remove和add操作即删除旧的Fragment,添加新的Fragment 旧的Fragment执行 onPause-onStop-onDestoryView-onDestory-onDetach新的Fragment执行 onAttach-onCreate-onCreateView-onActivityCreated-onStart-onResume
:::
Android本地保存的几种方案sp的commit和apply的提交区别
:::info
sharedpreferences内部存储数据存储到手机内置存储器外部存储外部SD卡中存储数据SqlLite本地数据库存储ContentProvider
:::
线程池的有几种实现讲一下阻塞队列核心线程和非核心线程池和最大线程池数的区别拒绝策略的作用我们怎么确定一个线程池的线程数的多少
字节飞书
:::info
AbortPolicy被拒绝了就抛出异常CallerRunsPolicy使用调用者所在的线程执行就是哪里来回哪里去DiscardOldestPolicy尝试去竞争第一个失败了也不抛异常DiscardPolicy默默丢弃不抛异常
:::
三个线程ABC怎么让线程A先执行在让线程B执行在线程C执行jionsynchronized反问join的底层实现是什么
:::info
Join()方法使调用此方法的线程wait() ,直到调用此方法的线程对象所在的线程在例子中是子线程执行完毕后被唤醒。其实是JVM的Thread执行完毕会自动执行一次notifyAll。推荐阅读多案例理解Object的wait,notify,notifyAll与Thread的sleep,yield,join等方法 Java Thread的join() 之刨根问底
:::
lock和synchronized的区别和选择sleep和wait的区别线程安全的hashmap的实现原理类加载过程的每一步骤都具体干了什么
:::info 一个Java文件从编码完成到最终执行一般主要包括两个过程
编译运行
编译即把我们写好的java文件通过javac命令编译成字节码也就是我们常说的.class文件。
运行则是把编译生成的.class文件交给Java虚拟机(JVM)执行。
而我们所说的类加载过程即是指JVM虚拟机把.class文件中类信息加载进内存并进行解析生成对应的class对象的过程。
举个通俗点的例子来说JVM在执行某段代码时遇到了class A 然而此时内存中并没有class A的相关信息于是JVM就会到相应的class文件中去寻找class A的类信息并加载进内存中这就是我们所说的类加载过程。
由此可见JVM不是一开始就把所有的类都加载进内存中而是只有第一次遇到某个需要运行的类时才会加载且只加载一次。
类加载
类加载的过程主要分为三个部分
加载链接初始化
而链接又可以细分为三个小部分
验证准备解析 加载
简单来说加载指的是把class字节码文件从各个来源通过类加载器装载入内存中。
这里有两个重点
字节码来源。一般的加载来源包括从本地路径下编译生成的.class文件从jar包中的.class文件从远程网络以及动态代理实时编译类加载器。一般包括启动类加载器扩展类加载器应用类加载器以及用户的自定义类加载器。
注为什么会有自定义类加载器
一方面是由于java代码很容易被反编译如果需要对自己的代码加密的话可以对编译后的代码进行加密然后再通过实现自己的自定义类加载器进行解密最后再加载。另一方面也有可能从非标准的来源加载代码比如从网络来源那就需要自己实现一个类加载器从指定源进行加载。
验证
主要是为了保证加载进来的字节流符合虚拟机规范不会造成安全错误。
包括对于文件格式的验证比如常量中是否有不被支持的常量文件中是否有不规范的或者附加的其他信息
对于元数据的验证比如该类是否继承了被final修饰的类类中的字段方法是否与父类冲突是否出现了不合理的重载
对于字节码的验证保证程序语义的合理性比如要保证类型转换的合理性。
对于符号引用的验证比如校验符号引用中通过全限定名是否能够找到对应的类校验符号引用中的访问性privatepublic等是否可被当前类访问
准备
主要是为类变量注意不是实例变量分配内存并且赋予初值。
特别需要注意初值不是代码中具体写的初始化的值而是Java虚拟机根据不同变量类型的默认初始值。
比如8种基本类型的初值默认为0引用类型的初值则为null常量的初值即为代码中设置的值final static tmp 456 那么该阶段tmp的初值就是456
解析
将常量池内的符号引用替换为直接引用的过程。
两个重点
符号引用。即一个字符串但是这个字符串给出了一些能够唯一性识别一个方法一个变量一个类的相关信息。直接引用。可以理解为一个内存地址或者一个偏移量。比如类方法类变量的直接引用是指向方法区的指针而实例方法实例变量的直接引用则是从实例的头指针开始算起到这个实例变量位置的偏移量
举个例子来说现在调用方法hello()这个方法的地址是1234567那么hello就是符号引用1234567就是直接引用。
在解析阶段虚拟机会把所有的类名方法名字段名这些符号引用替换为具体的内存地址或偏移量也就是直接引用。
初始化
这个阶段主要是对类变量初始化是执行类构造器的过程。
换句话说只对static修饰的变量或语句进行初始化。
如果初始化一个类的时候其父类尚未初始化则优先初始化其父类。
如果同时包含多个静态变量和静态代码块则按照自上而下的顺序依次执行。
:::
二面
注解保留时期 源文件保留 编译期保留默认值运行期保留在性能开销上有什么区别
:::info
源码期保留只是保留在源码时期编译器不对他做处理只是一个标志编译期保留主要是APT(Annotation Processing Tool即注解处理器是一种处理注解的工具他用来在编译器扫描和处理注解注解处理器以Java代码作为输入生成.java文件作为输出运行期保留在代码中通过注解进行标记运行时通过反射寻找标记进行某种处理运行期主要是通过反射实现的性能低反射性能低的原因 Java反射性能不行实际上是慢在getDeclaredMethod上也就是根据Class对象到方法区里面查找类的方法定义过程Method#invoke方法会对参数做封装和解封装的操作需要检查方法的可见性以及校验参数JIT无法优化请求JVM去查找方法区中的方法定义需使用JNI开销相对较大 推荐阅读大家都说 Java 反射效率低你知道原因在哪里么
:::
动态代理实现原理
:::info
动态代理需要实现InvocationHandler接口用来生成动态代理对象代理对象需要实现newProxyInstance() : 根据指定的类装载器、一组接口 调用处理器 生成动态代理类实例并最终返回和 invoke():动态代理对象调用目标对象的任何方法前都会调用调用处理器类的invoke动态代理对象的生成是依托于Proxy.newProxyInstance(ProxyObject.getClass().getClassLoader(), ProxyObject.getClass().getInterfaces(),this);在Proxy#newProxyInstance方法种主要是通过Class c1 getProxyClass(load,interfaces)为Proxy 指定类加载器对象 一组interface从而创建动态代理类 getProxyClass() 将目标类的实现的接口加载到内存中根据传入的接口代理对象创建动态的代理类的字节码 Constructor cons cl.getConstructor(constructorParams); 通过反射机制获取动态代理类的构造函数其参数类型是调用处理器接口类 return (Object) cons.newInstance(new Object[] { h }); 通过动态代理类的构造函数 创建 代理类实例传入调用处理器对象动态代理类\(Proxy0 extends Proxy implements Subject 在使用动态代理类对象时才可以调用目标对象的同名方法原因是调用了Proxy的h参数的invoke 其中h参数 在创建动态代理实例中newProxyInstance(ClassLoader loader, Class?[]interfaces,InvocationHandler h)传入的第3个参数InvocationHandler对象。推荐阅读Carson带你学设计模式动态代理模式Proxy Pattern
:::
注解的实现原理
:::info 注解interface 是一个实现了Annotation接口的 接口 然后在调用getDeclaredAnnotations()方法的时候返回一个代理\)Proxy对象这个是使用jdk动态代理创建使用Proxy的newProxyInstance方法时候传入接口 和InvocationHandler的一个实例(也就是 AnotationInvocationHandler ) 最后返回一个代理实例。 期间在创建代理对象之前解析注解时候 从该注解类的常量池中取出注解的信息包括之前写到注解中的参数然后将这些信息在创建 AnnotationInvocationHandler时候 传入进去 作为构造函数的参数。 当调用该代理实例的获取值的方法时就会调用执行AnotationInvocationHandler里面的逻辑将之前存入的注解信息 取出来。 推荐阅读java注解的本质以及注解的底层实现原理
:::
插桩有什么用卡顿检测用插桩去确定每个方法执行的时间
:::info 插桩就是将一段代码通过某种策略插入到另外一段代码或者替换另一段代码这里的代码可以分为源码和字节码而我们所说的一般是字节码插桩就是在.class文件转为.dex文件之前修改.class文件从而达到修改或者替换代码的目的。
应用场景
- 代码插入通过插桩我们扫描每一个class文件并针对特定规则进行字节码修改从而达到监控每个方法耗时的目的。
- font stylecolor:rgb(51, 51, 51);无痕埋点性能监控/font插桩的主要实现步骤
- ASM是生成和转换已编译的Java类工具就是我们插桩需要使用的工具。ASM提供了两种API来生成和转换已编译类一个是核心API以基于事件形式来表示类另一个是树API以基于对象形式来表示类。
- Transform API 这是android在将class转换为dex之前给我们预留的一个接口在改接口中通过插件的方式来修改class文件::: 类对象唯一的判定标准 :::info 在 JVM 中类路径和类加载器唯一确定一个 Java 类方法名、形参类型、形参个数、返回参数类型唯一确定一个 Java 类中的方法。 ::: 三面 Activity之间的通信 :::info 在Intent跳转时携带数据借助类的静态变量可以实现使用SharedPreference实现Activity之间的通信使用SQLite来实现数据共享的通信SQLite是Android提供的一种数据持久化操作的一种方式直接使用文件File的读写的方式 ::: SQLite数据库的升级扩展Room数据库 :::info 继承一个SQLiteOpenHelper类重写里面的两个方法 font stylecolor:rgb(153, 0, 0);onCreate/fontfont stylecolor:rgb(51, 51, 51);(SQLiteDatabase database) /fontfont stylecolor:rgb(153, 0, 0);onUpgrade/fontfont stylecolor:rgb(51, 51, 51);(SQLiteDatabase database, /fontfont stylecolor:rgb(68, 85, 136);int/fontfont stylecolor:rgb(51, 51, 51); oldVersion, /fontfont stylecolor:rgb(68, 85, 136);int/fontfont stylecolor:rgb(51, 51, 51); newVersion) /font自己封装一些操作的Daofont stylecolor:rgb(51, 51, 51);background-color:rgb(248, 248, 248); dbHelper /fontfont stylecolor:rgb(51, 51, 51);new/fontfont stylecolor:rgb(153, 0, 0);DBHelper/fontfont stylecolor:rgb(51, 51, 51);background-color:rgb(248, 248, 248);(MyApplication.getContext()); /fontfont stylecolor:rgb(68, 85, 136);SQLiteDatabase/fontfont stylecolor:teal;db/fontfont stylecolor:rgb(51, 51, 51);/fontfont stylecolor:rgb(51, 51, 51);background-color:rgb(248, 248, 248); dbHelper.getWritableDatabase(); /font 执行数据库操作 ::: :::warning Room优势 是对SQLite的一层抽象可以最大限度减少重复和容易出错的样板代码的注解简化了数据库的迁移路径针对编译期SQL语法检查API设计友好更容易上手理解 Room的三个主要模块 Entity:Entity用来表示数据库中的一个表。需要使用Entity(tableName “XXX”)注解其中的参数为表名。Dao: 数据库访问对象用于访问和管理数据增删改查。在使用时需要DAO注解Database: 它作为数据库持有者用Database注解和Room Database扩展的类 Room的使用 创建Entity实体类用来表示数据库中的一张表table创建数据访问对象Dao处理增删改查创建Room database ::: Database(entities [UserEntity::class], version 1) abstract class UserDatabase : RoomDatabase() {abstract fun userDao(): UserDao } //通过Room.databaseBuilder()或者 Room.inMemoryDatabaseBuilder()获取Database实例 Database(entities [UserEntity::class], version 1) abstract class UserDatabase : RoomDatabase() {abstract fun getUserDao(): UserDao companion object {Volatileprivate var INSTANCE: UserDatabase? null JvmStaticfun getInstance(context: Context): UserDatabase {val tmpInstance INSTANCEif (tmpInstance ! null) {return tmpInstance}//锁synchronized(this) {val instance Room.databaseBuilder(context, UserDatabase::class.java, userDb).build()INSTANCE instancereturn instance}}} }
- 上一篇: 废料回收网站建设电脑 手机 微信网站开发
- 下一篇: 分成型网站建设python做项目的网站
相关文章
-
废料回收网站建设电脑 手机 微信网站开发
废料回收网站建设电脑 手机 微信网站开发
- 技术栈
- 2026年03月21日
-
废旧电脑做网站服务器网站开发项目人员安排
废旧电脑做网站服务器网站开发项目人员安排
- 技术栈
- 2026年03月21日
-
废旧电脑做网站服务器漯河做网站优化
废旧电脑做网站服务器漯河做网站优化
- 技术栈
- 2026年03月21日
-
分成型网站建设python做项目的网站
分成型网站建设python做项目的网站
- 技术栈
- 2026年03月21日
-
分分彩做号网站免费找客源软件
分分彩做号网站免费找客源软件
- 技术栈
- 2026年03月21日
-
分局网站建设个人站长和企业网站
分局网站建设个人站长和企业网站
- 技术栈
- 2026年03月21日






