背景:做一个问题总结,希望可以给别人一些参考。
偏前端类的问题:
一.安卓的四大组件
这个网上有很多资料,我也会把链接放大下面,大家可以做些参考,这里面我就说下我理解的。
1.1 activity
作用:activity我理解是一个GUI页面,里面可以放置组件,比如说button,select等。
生命周期:
oncreate->onstart->onresume->running->onpause->onstop->ondestory
activity是存放到栈中,采用先进后出的方式。
1.2 说下intent()
intent两种跳转形式:
功能:intent可以跳转到activity,server和广播。
第一种:显示跳转
距离就是从一个activity跳转到另一个activity
构造函数的形式:
Intent intent=new Intent(second.activity);
方法的形式:
通过setClass/setClassname的形式:
Intent intent=new Intent()
intent.setClass();
第二种:隐示跳转
intent(action,data,类别)交给系统,系统会做出匹配完成跳转。
这个其实就是intent七个属性:action,data,类别,extra,type,flag,组件。
这里面说下flag:
flag正好对应activty的4中启动模式:
standard:这个是默认启动模式,即栈内activity每次oncreat都会创建实例,无论栈内是否已有实例。
single top模式:activity已经位于栈顶,oncreate不会创建实例。------>push场景会用到。
single task模式:非栈顶的activity被oncreate,会放到栈顶,之前栈顶实例会pop出去。------>首页场景会用到。
single instance模式:一个activity一个栈。----->拨号盘场景。
1.3 intent最大能传递多大数据
intent跳转的另一个activity最大传输数据1M,大于1M会出现静默崩溃。
解决这类问题方法:
进程内:缓存磁盘或者文件缓存
进程外:通过contentprovider进行进程内数据共享和传递。
2. server
server我理解用来做一些后台数据交互的组件。
2.1生命周期:
第一种:oncreate->onstartcommend->ondestory--->这种一般直接启动服务做处理
第二种:oncreate->onbind->onunbind->ondestroy---->这个把server和另一个组件做绑定,比如activity。
2.2 服务类型 前台服务和普通服务:
前台服务:比如状态标志展示的服务
普通服务:后台运行服务。
2.3 ANR现象:
服务启动后如果不手动开启进程就会默认运行在主进程中,在主进程中做耗时操作就会出现ANR现象,表现形式就是卡顿无反应。
2.4 intentserver类和server类区别在哪里:
两点:
一方面: intentserver有一个onHandleIntent()函数可以直接创建子进程。server也可以调用函数创建子进程。
最大优势就是在多次调用onHandleIntent()函数的时候可以按照顺序执行。(类似python unittest中case1->case2那种形式)
3. contentProvider
这个组件主要用来做数据存储,有点类似python sqlalcheny这个库,主要通过orm形式做数据库增删改查。
3.1 6个核心方法
oncreate(),query(),insert(),update(),delete(),gettype();
3.2 如何访问内部数据
方式类似uri的形式:存放地址和报名(有点类似mysql中库名和表名)。
4.广播:
角色:发送者和接受者(跟后端MQ类似)。
用户:不同组件通信(同一个app或者不同app之间),多线程通信和安卓系统通信。
核心方法:onrecevice()方法
注册方法:
静态注册:在xml中注册。特点:不跟随任何组件生命周期(有点类似spring初始化即可调通)。缺点:耗电和耗内存。
动态注册:在代码中调用注册方法进行注册。特点:灵活,生命周期跟随被绑定组件。缺点:在app关闭前一定要注销,否则会引发内存泄漏。
参考博客:
https://blog.csdn.net/xchaha/article/details/80398620
https://blog.csdn.net/xiankog/article/details/81702119
二.H5相关
2.1 能说下jsbridge的原理嘛
jsbridge是H5和native之前作为数据交互的通道,主要包含两块:通信调用和句柄解析。
通信调用:
js调用native一共有两种形式:注入api和拦截url scheme
注入api:
native通过某种形式把类或者方法注入js.content(window)中(这个我理解就是会有中间方法把方法封装成js可以调用接口形式)
native注入成功后就js可以直接把data传入。
这种方式最大特点就是native来维护各种版本的桥名,对应测试更好H5测试兼容性一个节点。
缺点:因为注入时机不确定,有可能会出现注入api失败的情况,这样就需要js在调用前确认是否注入成功。
拦截url scheme:
js通过莫种形式比如说iframe.src(src是iframe一个属性),调用内部框架即native对应类的方法。形式类似uri 区别点就是
协议和host可以自定义。这个方式有一种缺陷就是uri是有长度限制(好像是256字节)。为了避免这个缺陷ios会通过ajrax形式把data放入header或者body中。
缺点:js需要维护各种版本桥名,还有就是uri是有长度限制的。
native调用js:
native可以直接调用js的代码块。
句柄解析:
信息通信消息都是单向,所以为了回调会有一个callbackid的存在。这个callbakcid在全局必须是唯一的,client发送消息给server,
server处理完成后吧callbakcid作为key和处理结果发送给client。
比如说js->native流程就是:js发送bridgename,data,callbacikd给natvie,native通过bridgename找到类和方法,把data传入进行运算,再以callbackid作为key和运算结果作为value返回给js。
https://blog.csdn.net/yuzhengfei7/article/details/93468914
2.2 简单说下webview
webview一共两个作用:一.用来展示html页面;二.跟js进行交互。
webview类:
加载页面;
前进/后退;
清除缓存;
获取html的高度和滚动距离
下载文件;
websetting类(配置类):
设置js交互->websetting.setjavascriptenable(true);
缩放操作;
设置字体大小;
设置缓存;
设置编码格式;
webviewclinet类(处理各种通知和请求事件):
拦截url进行重定向;
处理浏览器的按键事件;
处理https事件;
webchromeclient:辅助webview处理js对话框,网站标题等
加载进度展示;
获取网页标题回调;
打开/关闭窗口回调;
网页提示框;
https://www.jianshu.com/p/3e0136c9e748
2.3 能简单说下小程序的mini框架嘛?
框架结构:
index ----------->对应小程序的首页
log
log.js ------------>log的js逻辑
log.wxml ------------>log的html页面模板
log.wxss ------------>log的页面样式
log.json ------------>log的配置页面
utils
utils.js
app.js ------------>小程序加载逻辑
app.json ------------->应用全局配置,如背景颜色
app.wxss ------------->全局样式
wxml:构建页面内容-->html
wxss:页面样式----->颜色配置
wxs:wxml的增加版本,脚本语言,快速构建页面。
js:交互逻辑,数据通信。
wxml的4个特性:
特性1 绑定数据:
id;
class;---->对应css的类名
style;------>对应样式模板
hidde;------>是否隐藏
特性2 列表展示:
特性3 条件展示:
特性4 模板展示:
<temple>
<view> 收件人:{{name}}</view>
</temple>
2.4 小程序的启动机制:
分成两种启动:冷启动和热启动。
冷启动:首次打开或者微信死掉,走小程序的全部生命周期(这个是我理解的)
热启动:一段时间内再次进入小程序,不请求接口更新直接进入首页
小程序生命周期:onlunch ->onshow->onhide->onerror
页面生命周期:onload->onshow->onready->onhide->onerror
ps:我觉得了解生命周期可以帮助我们在遇到问题的时候快速定位哪里修改,我记得之前遇到因为热启动,前端没有调用启动接口更新数据,我们可以在提bug的时候可以提出自己想法,虽然fe可能不接受,但是也是自我学习过程嘛。
页面路由 小程序页面路由全部由框架管理:
初始化,加载----->进栈
返回 ------>出栈
切换tab ------>之前tab页面全部出栈,新tab页面出栈
https://www.jianshu.com/p/64170244e64c
2.5 简单介绍下html
html是标签语言主要用来构建页面内容,主要模块如下:
布局标签:
字体标签:
表单标签:
<form>:
<button>:
三.java基础
3.1 final关键字可以修饰什么?
final可以修饰class,方法和变量。
final修饰class后这个类不可以被继承。
final修饰方法是防止其他类继承后修改方法和提高效率。
final修饰变量后,变量的值不可被修改。
3.2 final和static的区别是什么?
static用来修饰方法和变量,类初始化的时候会优先加载static修饰方法和变量。
static修饰方法的时候,同一个类中其他方法可以通过 类名.方法 的访问。
static修饰方法或者变量,在类初始化的时候会被优先执行。
final 就只是变量值不可变。
https://blog.csdn.net/kuangay/article/details/81485324
https://www.jb51.net/article/157603.htm