当前位置: 首页 > news >正文

客户端Android八股

大部分人觉得客户端开发没有前景

主要原因:开发需求小,薪资平均没服务端高,容易被裁

目前大厂的客户端方向,主要是三个方向:iOS端、安卓端和PC端

  1. iOS:原生方向是由Object-C和swift语言,OC苹果官方已经停止更新了,所以主流的原生方向,都是swift
  2. 安卓:java和kotlin
  3. PC端:也可以说是桌面端,技术栈C++ qt、cef等。

现在最流行的是跨端技术:即一套代码在
android、ios、桌面都能运行,使用flutter、react native、字节的lynx等

客户端日常工作

1. 重点集中在移动端界面的绘制,及端内逻辑的书写:文件、资源下载及缓存,与系统api的交互,与后端服务的网络请求。
2.在大量使用大前端技术的公司(美团,饿了么,支付宝),很多ui细节是交给前端开发去完成,客户端这边只需要搭建容器,也就是H5页面,比如我们常见的小红书推荐流、APP的各种弹窗,这部分ui的绘制都是前端完成,客户端开发只需要把容器搭建好。
3.还有部分客户端岗位做的是底层架构相关的,音视频sdk开发、网络sdk开发,客户端性能优化等。

安卓四大组件

  1. Activity 活动:应用程序的UI层,通常用于显示用户界面,响应用户操作。
  2. Service 后台服务:后台用于长期执行的任务,如:播放音乐、下载文件
  3. Content Provider 内容供应组件:管理应用程序的数据,允许应用程序之间共享数据。提供了一个标准的接口,允许其他应用程序访问数据。
  4. Broadcast Receiver 广播接受组件:接受并响应系统或应用程序发送的广播事件

Android 之 Activity 详解_android activity-CSDN博客

activity的生命周期 7次

  1. onCreate()
      这个方法在每一个Activity类都会有,当我们新建一个Activity类时,一定会重写父类的onCreate方法,onCreate方法会在Activity第一次被创建时调用。我们应该在这个方法中完成Activity的初始化操作,比如说加载布局,初始化布局控件,绑定按钮事件等。
  2. onStart()
      这个方法在Activity由不可见变为可见时调用。
  3. onResume()
      这个方法在Activity准备好喝用户交互的时候调用。此时的Activity一定位于返回栈的栈顶,并且处于运行状态。
  4. onPause()
      这个方法在系统准备去启动或者恢复另一个Activity的时候调用。
  5. onStop()
      这个方法在Activity完全不可见的时候调用。它和onPause()方法的主要区别在于,如果启动的新Activity是一个对话框式的activity,那么,onPause()方法会得到执行,而onStop()方法并不会执行。
  6. onDestory()
      这个方法在Activity被销毁之前调用,之后Activity的状态将变为销毁状态。
  7. onRestart()
      这个方法在Activity由停止状态变为运行状态之前调用,也就是Activity被重新启动了。

Activity的四种状态

每个Activity在其生命周期中最多可能会有四种状态。

  1. 运行状态
      当一个Activity位于返回栈(关于返回栈的概念下面再介绍)的栈顶时,这时Activity就处于运行状态,系统会将处于栈顶的Activity显示给用户。
  2. 暂停状态
      当一个Activity不再处于栈顶位置,但仍然可见,这时Activity就进入了暂停状态。初学者可能会有这样的疑问,既然Activity都已经不在栈顶了,怎么会还可见呢,这是因为并不是每一个Activity都会占满整个屏幕的,比如对话框形式的Activity只会占用屏幕中间的部分区域。
  3. 停止状态
      当一个Activity不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。
  4. 销毁状态
      当一个Activity从返回栈中移除后就变成了销毁状态。

activity的启动模式 4次

Activity的启动模式是决定生成新的activity实例是否重用已存在的Activity实例,是否和其他Activity实例公用一个task。总共提供了四种启动模式:

  1. standard:默认启动模式,每次激活activity时,都创建activity实例,并放入任务栈。
  2. singleTop: 如果某个Activity自己激活自己,即任务栈栈顶是该Activity,则不需要创建,其余情况都要创建Activity。
  3. singleTask:如果要激活的activity在任务栈中,则不需要创建,只需要把这个Activity放入栈顶,并把该Activity以上的Activity实例都出栈。
  4. singleInstance:只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。
     

Android之进程间和线程间通信方式_android线程通信和进程通信-CSDN博客

Android线程间通信全面解析_android线程间通信的几种方法-CSDN博客

Android安卓--线程间通信方式(handler)6次

1.AsyncTask机制
  AsyncTask,异步任务,也就是说在UI线程运行的时候,可以在后台的执行一些异步的操作;AsyncTask可以很容易且正确地使用UI线程,AsyncTask允许进行后台操作,并在不显示使用工作线程或Handler机制的情况下,将结果反馈给UI线程。但是AsyncTask只能用于短时间的操作(最多几秒就应该结束的操作),如果需要长时间运行在后台,就不适合使用AsyncTask了,只能去使用Java提供的其他API来实现。

    private void OneTest(){new MyAsyncTask().execute("通过AsyncTask方法");}private class MyAsyncTask extends AsyncTask{@Overrideprotected Object doInBackground(Object[] objects) {for (int i=0;i<3;i++){try {sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}return objects[0].toString();}@Overrideprotected void onPostExecute(Object o) {super.onPostExecute(o);tv.setText(o.toString());}}

2.Handler机制
  Handler,继承自Object类,用来发送和处理Message对象或Runnable对象;Handler在创建时会与当前所在的线程的Looper对象相关联(如果当前线程的Looper为空或不存在,则会抛出异常,此时需要在线程中主动调用Looper.prepare()来创建一个Looper对象)。使用Handler的主要作用就是在后面的过程中发送和处理Message对象和让其他的线程完成某一个动作(如在工作线程中通过Handler对象发送一个Message对象,让UI线程进行UI的更新,然后UI线程就会在MessageQueue中得到这个Message对象(取出Message对象是由其相关联的Looper对象完成的),并作出相应的响应)。

private void TwoTest() {handler=new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what){case 123:tv.setText(""+msg.obj);break;}}};new Thread(){@Overridepublic void run() {super.run();for (int i=0;i<3;i++){try {sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}Message message=new Message();message.what=123;message.obj="通过Handler机制";handler.sendMessage(message);}}.run();}

主线程中定义Handler,子线程发消息,通知Handler完成UI更新,Handler对象必须定义在主线程中,如果是多个类直接互相调用,就不是很方便,需要传递content对象或通过接口调用。另外Handler机制与Activity生命周期不一致的原因,容易导致内存泄漏。

3.runOnUiThread方法

private void ThreeTest(){new Thread(){@Overridepublic void run() {super.run();for (int i=0;i<3;i++){try {sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}runOnUiThread(new Runnable() {@Overridepublic void run() {tv.setText("通过runOnUiThread方法");}});}}.run();
}

用Activity对象的runOnUiThread方法更新,在子线程中通过runOnUiThread()方法更新UI。

4.View.post(Runnable r)

private void three(){new Thread(){@Overridepublic void run() {super.run();for (int i=0;i<3;i++){try {sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}tv.post(new Runnable() {@Overridepublic void run() {tv.setText("通过View.post(Runnable r) 方法");}});}}.run();
}

Android安卓--进程间通信方式(binder)5次

1.Bundle
  由于Activity,Service,Receiver都是可以通过Intent来携带Bundle传输数据的,所以我们可以在一个进程中通过Intent将携带数据的Bundle发送到另一个进程的组件。
  缺点:无法传输Bundle不支持的数据类型。

2.ContentProvider
  ContentProvider是Android四大组件之一,以表格的方式来储存数据,提供给外界,即Content Provider可以跨进程访问其他应用程序中的数据。用法是继承ContentProvider,实现onCreate,query,update,insert,delete和getType方法,onCreate是负责创建时做一些初始化的工作,增删查改的方法就是对数据的查询和修改,getType是返回一个String,表示Uri请求的类型。注册完后就可以使用ContentResolver去请求指定的Uri。

3.文件
  两个进程可以到同一个文件去交换数据,我们不仅可以保存文本文件,还可以将对象持久化到文件,从另一个文件恢复。要注意的是,当并发读/写时可能会出现并发的问题。

4.Broadcast
  Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播。

5.AIDL方式
  Service和Content Provider类似,也可以访问其他应用程序中的数据,Content Provider返回的是Cursor对象,而Service返回的是Java对象,这种可以跨进程通讯的服务叫AIDL服务。   AIDL通过定义服务端暴露的接口,以提供给客户端来调用,AIDL使服务器可以并行处理,而Messenger封装了AIDL之后只能串行运行,所以Messenger一般用作消息传递。

6.Messenger
  Messenger是基于AIDL实现的,服务端(被动方)提供一个Service来处理客户端(主动方)连接,维护一个Handler来创建Messenger,在onBind时返回Messenger的binder。
  双方用Messenger来发送数据,用Handler来处理数据。Messenger处理数据依靠Handler,所以是串行的,也就是说,Handler接到多个message时,就要排队依次处理。

7.Socket
  Socket方法是通过网络来进行数据交换,注意的是要在子线程请求,不然会堵塞主线程。客户端和服务端建立连接之后即可不断传输数据,比较适合实时的数据传输

view的绘制流程 4次

View绘制三大流程源码分析_view+的三大流程源码分析-CSDN博客

View的绘制流程-CSDN博客

触摸事件的传递 4次

Android中的触摸事件是如何传递和处理的_安卓触摸事件传递-CSDN博客

Android面试必问之触摸事件传递机制_motionevent 被哪个窗口消费-CSDN博客

Android 触摸事件分发和拦截机制_linearlayout 焦点分发拦截-CSDN博客

下面只问过一次的,很多是从上面的高频问题中引申出来的:

activityA启动后打开activityB,两个activity的状态经历了哪些周期?

可以在子线程里面刷新UI吗?如果我非要在子线程里刷新了UI呢?会怎么样?会抛出什么异常?

ANR是什么?ANR产生的根本原因是什么?多久会出现这个异常?所有的情况都是 5s 吗Service里面也是5s吗?

application的oncreate和activity的oncreate有什么区别?

Ibinder了解吗?

一个点击事件点击结束后是怎么被销毁的?

looper的睡眠机制对应linux的哪个操作?

looper最多能开几个线程?

handler的一个postDelay()方法知道吗?

如果创建了两个handler,如何知道哪个消息对应哪个handler?

上下滑动事件和左右滑动事件的冲突如何处理?

recyclerView了解吗?它是如何复用视图的?

activity和fragment之间是如何进行通信的?

http://www.dtcms.com/a/603614.html

相关文章:

  • Lua学习记录(2) --- Lua中的复杂变量类型_function
  • 外贸网站一站式海外推广家具做网站
  • IT做网站工资怎么样优质ppt模板免费下载
  • 站长工具seo下载岳阳网络推广公司
  • wordpress媒体库显示海口网站seo
  • 河南网站域名备案环保网站可以做哪些内容
  • 网站怎么提高收录自己做的网站怎么发布
  • 最好国内免费网站空间绵阳吉工建设
  • 网站404怎么做关于网站建设方案
  • 做ppt常用的网站有哪些做生存分析的网站有哪些
  • 上海知名建站公司大型网站制作设计
  • 济宁网站开发正规网站做菠菜广告
  • 任县网站建设价格信息免费logo图标在线制作设计
  • 网站建设教程 冰美人视频seo关键词排名优化评价
  • 怎么建设两个大淘客网站.net网站开发后编译
  • 河南省住房城乡和建设厅网站济南网站建设方案案例展示
  • 网站优化垂直化好还是扁平化好做百度手机网站点击软
  • 贵阳网站建设兼职移动课程播放网站建设多少钱
  • sql网站开发在线美图秀秀在线制作
  • 提供网站建设公司网站使用字体
  • 自己开公司 自己做网站吗深圳的网站建设公司
  • c语言编译器vc6.0|探索其历史、特点与使用方法
  • 舞钢市城乡建设局网站圣诞节网站怎么做
  • 小说网站怎么推广哪个网站做阿里首页模板
  • 网站seo知识网站首页排名突然没了
  • 好网站建设因素阿里云服务器怎么安装wordpress
  • 有哪些可以在线做app的网站有哪些问题贵阳做网站好的公司
  • 织梦移动网站南宁企业网站建站模板
  • 南京做企业网站公司网站建设学生选课课程设计报告
  • 推广网站的方法有哪些做商城网站建设哪家好