精华内容
下载资源
问答
  • iOS移动端开发面试题

    2021-02-08 14:59:16
    iOS移动端开发面试题
  • 由于移动互联网的飞速发展,现在基本没有哪个前端说自己只开发 PC 端,移动端什么的我不管。 甚至好多前端主要的工作内容就是开发移动端,因为移动端的内容五花八门:微信小程序、支付宝小程序、京东小程序、快应用...

    前言

    由于移动互联网的飞速发展,现在基本没有哪个前端说自己只开发 PC 端,移动端什么的我不管。

    甚至好多前端主要的工作内容就是开发移动端,因为移动端的内容五花八门:微信小程序、支付宝小程序、京东小程序、快应用、微信公众平台、微信小游戏、混合App、H5等…

    打开招聘软件,可以看到目前的岗位对前端的要求是越来越高了,上天入地无所不能,屏幕前的你也可以打开软件看一眼要求,是不是至少都有类似这么几条中的一两个:熟练掌握移动端前端技术、有微信小程序开发经验优先、有混合App开发经验优先,即使不是那种专门做移动端网站的公司,有不少也都写着会移动端优先…

    所以移动端的布局就至关重要了,因为无论一个网站的页面背后有着多么复杂的交互逻辑、多庞大的用户量、多么海量的数据、多么高的并发…
    它终究还是得有个页面吧!不能让用户一访问网站就直接给人家看数据库吧!

    有人的地方就有江湖 有页面的地方就有布局

    布局可不仅仅只是把数据整齐的罗列在页面上这么简单,一个合适的布局可以令用户的操作非常顺畅。同时在不同的场景下也应选择不同的布局,如果选错布局的话很可能会导致用户对页面的操作不那么的丝滑,哪怕最初呈现出来的数据都是一样的。

    由于移动端的屏幕并不像电脑屏幕那么大,而且长宽比也有很大的区别,所以造就了移动端布局与 PC 端布局有着很大的不同,那么接下来我们就来看一下各式各样的常见布局。

    居中布局

    其实居中布局大家在日常生活中基本都见过,只是当时没怎么留意罢了。

    没给用户留下深刻印象的布局反而是好布局,因为用户的注意力都在内容上了,证明此时的布局令用户操作顺畅。

    而给用户留下印象的布局一般就不太好了(一些与众不同的炫酷布局除外):

    这个按钮怎么放这了,我都误碰好几次了;关闭按钮在哪呢?怎么关啊这个;这个商品的简介在哪呢?应该点哪购买啊?这个布局怎么这么乱看的我都晕了,哎算了算了,以后不来这个网站了……

    不同的布局用来对应不同的场景,用对场景的话会令用户的操作比较舒服顺畅,但用错场景的话用户可能会有些懵,不利于引导用户按自己想要的方式去操作。

    这种布局是主内容处于页面的正中央位置,常见于登录、注册、提示用户、或点击头像查看大图等场景,通常会添加一层灰色的透明遮罩:

    这么做的目的除了突出主题之外,还有一个比较重要的点就是可以令用户感觉到自己并没有离开当前页面,只不过是在当前页面中出现了一个小框而已,这样可以有效减少用户的陌生感。

    不仅如此,居中布局还能够有效引导用户进行自己希望用户所进行的操作,用强烈的对比感去引导用户:

    利用CSS库实现

    借助市面上已有的 CSS 库,我们可以很轻易的做到居中布局,尤其是可以用到中文关键字,这非常有利于我们的记忆,它就是 chinese-layout

    然后我们再用一个中文渐变色的 CSS 库来美化我们的界面:chinese-gradient

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <!-- 在这里用link标签引入中文布局 -->
      <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/chinese-layout">
    
      <!-- 在这里用link标签引入中文渐变色 -->
      <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/chinese-gradient">
      <style>
        /* 清除默认样式 */
        * { padding: 0; margin: 0; }
    
        /* 令html和body全屏显示 */
        html, body { height: 100%; }
    
        body {
          /* 先在父元素上设置grid布局 */
          display: grid;
          grid: var(--居中);
    
          /* 给个好看的渐变色 */
          background: var(--霾灰);
        } 
    
        .center {
          /* 指定子元素在中心位置 */
          grid-area:;
    
          /* 给子元素设置宽高,不然宽高为0导致什么也看不见 */
          width: 150px;
          height: 150px;
    
          /* 给一个好看的背景色 */
          background: var(--胭脂粉);
        }
      </style>
    </head>
    <body>
      <div class="center"></div>
    </body>
    </html>
    

    运行结果:

    绝对定位实现

    居中布局通常分为两种,一种是固定宽高,另一种是非固定宽高。

    固定宽高很好理解,顾名思义就是宽高都写死。
    而非固定宽高通常都是靠里面的内容来撑起盒子的高度,内容时多时少。

    这两种方式也造就了不一样的技术实现,绝对定位法适合固定宽高:

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <style>
        /* 清除默认样式 */
        * { padding: 0; margin: 0; }
    
        /* 令html和body全屏显示, 并有一个灰色背景 */
        html, body { height: 100%; background: gray; }
    
        /* 先在父元素上设置相对定位 */
        body { position: relative } 
    
        .center {
          /* 绝对定位 */
          position: absolute;
    
          /* 上下左右全部为0 */
          top: 0;
          right: 0;
          bottom: 0;
          left: 0;
    
          /* 给定宽高 */
          width: 70%;
          height: 25%;
    
          /* 令外边距自动填充 */
          margin: auto;
    
          /* 白色背景 */
          background: white;
        }
      </style>
    </head>
    <body>
      <div class="center"></div>
    </body>
    </html>
    

    运行结果:

    • 如果不给定宽高,盒子将会和父元素一样大,因为绝对定位上下左右都是 0,意为紧贴着父元素的边。
    • 给了固定宽高,但没写 margin 的话盒子会固定在左上角,因为 top 和 left 的优先级更高。
    • 给了 margin: auto; 的话,浏览器会自动填充边距,令其居中。
    • 此种实现方式优点是兼容性很好,几乎没用到任何 CSS 的新特性,全部都是经典属性。

    绝对定位 + 负边距

    此种方法也是适用于固定宽高:

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <style>
        /* 清除默认样式 */
        * { padding: 0; margin: 0; }
    
        /* 令html和body全屏显示, 并有一个灰色背景 */
        html, body { height: 100%; background: gray; }
    
        /* 先在父元素上设置相对定位 */
        body { position: relative }
    
        .center {
          /* 绝对定位 */
          position: absolute;
    
          /* 上方和左方为50% */
          top: 50%;
          left: 50%;
    
          /* 给定宽高 */
          width: 300px;
          height: 200px;
    
          /* 上外边距为负的给定高度的一半 */
          margin-top: -100px;
    
          /* 左外边距为负的给定宽度的一半 */
          margin-left: -150px;
    
          /* 白色背景 */
          background: white;
        }
      </style>
    </head>
    <body>
      <div class="center"></div>
    </body>
    </html>
    

    运行结果:

    ⚠️ 注意,"绝对定位+负边距"这种方法不适合那种宽百分之多少、高百分之多少这种相对单位,取而代之的是具体的数值。

    因为边距的百分比和宽高的百分比相对的不是同一参考物,它是相对于父元素的宽来计算的,这点要注意。

    绝对定位 + 平移

    有时中间盒子的内容是要靠后台传过来的数据决定的,如果写死的话,当数据较多时就会发生溢出,数据较少时又会空出一大片,所以我们需要一种更加智能的方式来实现居中布局。

    绝对定位 + 平移绝对定位 + 负边距的改进版,那么具体都改进了哪些方面呢?
    负边距的百分比并不是相对于自身,而是相对于父元素,所以只能写具体的像素值,显得不够智能。

    而平移相对于自身,只需要无脑写 -50% 就可以了:

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <style>
        /* 清除默认样式 */
        * { padding: 0; margin: 0; }
    
        /* 令html和body全屏显示, 并有一个灰色背景 */
        html, body { height: 100%; background: gray; }
    
        /* 先在父元素上设置相对定位 */
        body { position: relative }
    
        .center {
          /* 绝对定位 */
          position: absolute;
    
          /* 上方和左方为50% */
          top: 50%;
          left: 50%;
    
          /* 不用给宽高,但是可以给个内边距防止内容与盒子过于贴合 */
          padding: 10px;
    
          /* 这个50%是相对于自身宽高而言的 */
          transform: translate(-50%, -50%);
    
          /* 白色背景 */
          background: white;
        }
      </style>
    </head>
    <body>
      <div class="center">
        用内容撑开盒子
      </div>
    </body>
    </html>
    

    运行结果:

    • margin 的百分比是相对于父元素的宽;
    • translate 函数的百分比是相对于自身;
    • 不仅适用于未知宽高,也同样适用于固定宽高的居中布局。

    网格 Grid 实现

    大家可能或多或少听过一些 Grid 的大名,深入了解过的人会觉得它很强大,但没深入了解过的人对它的印象可能就是:兼容性不好

    但随着时间的推移,在移动端只要不考虑特别低版本的手机的话基本上都可以用了。

    即使你对 Grid 没什么兴趣,觉得在移动端用 Flex 就已经足够了的。把它最简单的用法记住了也不会费太大劲。因为毕竟如果你能给面试官写出一个最新的技术,面试官也会对你刮目相看的:

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <style>
        /* 清除默认样式 */
        * { padding: 0; margin: 0; }
    
        /* 令html和body全屏显示, 并有一个灰色背景 */
        html, body { height: 100%; background: gray; }
    
        /* 中央盒子的直接父元素 */
        body {
          /* 令其变成网格布局 */
          display: grid;
    
          /* 令其子元素居中 */
          place-items: center;
        }
    
        .center {
    	  /* 不用给宽高,但是可以给个内边距防止内容与盒子过于贴合 */
          padding: 10px;
          
          /* 白色背景 */
          background: white;
        }
      </style>
    </head>
    <body>
      <div class="center">用内容撑开盒子</div>
    </body>
    </html>
    

    运行结果:

    其实关键代码异常的简单,几乎没什么特别大的学习成本,就这么两行:

    /* 令其变成网格布局 */
    display: grid;
    
    /* 令其子元素居中 */
    place-items: center;
    

    Flex 弹性盒子

    移动端布局王者 Flex :

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <style>
        /* 清除默认样式 */
        * { padding: 0; margin: 0; }
    
        /* 令html和body全屏显示, 并有一个灰色背景 */
        html, body { height: 100%; background: gray; }
    
        /* 找到中央盒子的直接父元素 */
        body {
          /* 令其变成弹性布局 */
          display: flex;
        }
    
        .center {
          /* 自动外边距 */
          margin: auto;
    
          /* 白色背景 */
          background: white;
    
          /* 不用给宽高,但是可以给个内边距防止内容与盒子过于贴合 */
          padding: 10px;
        }
      </style>
    </head>
    <body>
      <div class="center">用内容撑开盒子</div>
    </body>
    </html>
    

    运行结果:

    Flex 几乎没有不会的吧?超级好用,简单实惠又便捷,如果这个都不会的话可以去看看阮一峰老师的博客,里面有着很详细的入门教程:

    另外,张鑫旭的博客写的也很不错:

    表格布局

    在居中布局这种场景下,表格布局也很适用:

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <style>
        /* 清除默认样式 */
        * { padding: 0; margin: 0; }
    
        body {
          /* 令body全屏显示 */
          width: 100vw;
          height: 100vh;
    
          /* 显示为表格的格子 */
          display: table-cell;
    
          /* 水平居中 */
          text-align: center;
    
          /* 垂直居中 */
          vertical-align: middle;
    
          /* 灰色背景 */
          background: gray;
        }
    
        .center {
          /* 显示为行内块元素 */
          display: inline-block;
    
          /* 不用给宽高,但是可以给个内边距防止内容与盒子过于贴合 */
          padding: 10px;
    
          /* 白色背景 */
          background: white;
        }
      </style>
    </head>
    <body>
      <div class="center">用内容撑开盒子</div>
    </body>
    </html>
    

    运行结果:

    此布局的关键点在于:

    • 父元素上 3 个样式设置:

      • display: table-cell;
      • text-align: center;
      • vertical-align: center;
    • 子元素上设置:

      • display: inline-block;

    结语

    看完这些有没有很郁闷,一个小小的居中布局都这么多种实现方式,而且这还不是全部的实现方式,我只挑了几款市面上常见的,可能大家会觉得有这个必要记这么多嘛!

    其实这个问题就显得仁者见仁智者见智了,一方面面试造火箭,工作拧螺丝的现状让大家很苦恼。明明觉得自己技术还不错,至少公司要的都能给实现出来,但面试的时候面对面试官的刁难自己却无能为力。

    也许下一次面试时并不会遇到一个面试官让你以各种方式实现居中布局,但开拓一下眼界总是好的,因为变换一下思路有助于大家在遇见复杂布局的时候可以快速选型。

    该文章首发于前端学不动公众号

    对了,这篇文章是连载形式的,居中布局仅仅只是一个开始,点赞 + 关注 我们下个布局见!

    展开全文
  • 由于移动互联网的飞速发展,现在基本没有哪个前端说自己只开发 PC 端,移动端什么的我不管。 甚至好多前端主要的工作内容就是开发移动端,因为移动端的内容五花八门:微信小程序、支付宝小程序、京东小程序、快应用...

    前言
    由于移动互联网的飞速发展,现在基本没有哪个前端说自己只开发 PC 端,移动端什么的我不管。

    甚至好多前端主要的工作内容就是开发移动端,因为移动端的内容五花八门:微信小程序、支付宝小程序、京东小程序、快应用、微信公众平台、微信小游戏、混合App、H5等…

    打开招聘软件,可以看到目前的岗位对前端的要求是越来越高了,上天入地无所不能,屏幕前的你也可以打开软件看一眼要求,是不是至少都有类似这么几条中的一两个:熟练掌握移动端前端技术、有微信小程序开发经验优先、有混合App开发经验优先,即使不是那种专门做移动端网站的公司,有不少也都写着会移动端优先…

    所以移动端的布局就至关重要了,因为无论一个网站的页面背后有着多么复杂的交互逻辑、多庞大的用户量、多么海量的数据、多么高的并发… 它终究还是得有个页面吧!不能让用户一访问网站就直接给人家看数据库吧!

    有人的地方就有江湖 有页面的地方就有布局

    布局可不仅仅只是把数据整齐的罗列在页面上这么简单,一个合适的布局可以令用户的操作非常顺畅。同时在不同的场景下也应选择不同的布局,如果选错布局的话很可能会导致用户对页面的操作不那么的丝滑,哪怕最初呈现出来的数据都是一样的。

    由于移动端的屏幕并不像电脑屏幕那么大,而且长宽比也有很大的区别,所以造就了移动端布局与 PC 端布局有着很大的不同,那么接下来我们就来看一下各式各样的常见布局。

    居中布局
    其实居中布局大家在日常生活中基本都见过,只是当时没怎么留意罢了。

    没给用户留下深刻印象的布局反而是好布局,因为用户的注意力都在内容上了,证明此时的布局令用户操作顺畅。

    而给用户留下印象的布局一般就不太好了(一些与众不同的炫酷布局除外):

    这个按钮怎么放这了,我都误碰好几次了;关闭按钮在哪呢?怎么关啊这个;这个商品的简介在哪呢?应该点哪购买啊?这个布局怎么这么乱看的我都晕了,哎算了算了,以后不来这个网站了……

    不同的布局用来对应不同的场景,用对场景的话会令用户的操作比较舒服顺畅,但用错场景的话用户可能会有些懵,不利于引导用户按自己想要的方式去操作。

    这种布局是主内容处于页面的正中央位置,常见于登录、注册、提示用户、或点击头像查看大图等场景,通常会添加一层灰色的透明遮罩:

    这么做的目的除了突出主题之外,还有一个比较重要的点就是可以令用户感觉到自己并没有离开当前页面,只不过是在当前页面中出现了一个小框而已,这样可以有效减少用户的陌生感。

    不仅如此,居中布局还能够有效引导用户进行自己希望用户所进行的操作,用强烈的对比感去引导用户:

    利用CSS库实现
    借助市面上已有的 CSS 库,我们可以很轻易的做到居中布局,尤其是可以用到中文关键字,这非常有利于我们的记忆,它就是 chinese-layout。

    然后我们再用一个中文渐变色的 CSS 库来美化我们的界面:chinese-gradient。

    Document
    复制代码 运行结果:

    绝对定位实现
    居中布局通常分为两种,一种是固定宽高,另一种是非固定宽高。

    固定宽高很好理解,顾名思义就是宽高都写死。而非固定宽高通常都是靠里面的内容来撑起盒子的高度,内容时多时少。

    这两种方式也造就了不一样的技术实现,绝对定位法适合固定宽高:

    Document
    复制代码 运行结果:

    如果不给定宽高,盒子将会和父元素一样大,因为绝对定位上下左右都是 0,意为紧贴着父元素的边。
    给了固定宽高,但没写 margin 的话盒子会固定在左上角,因为 top 和 left 的优先级更高。
    给了 margin: auto; 的话,浏览器会自动填充边距,令其居中。
    此种实现方式优点是兼容性很好,几乎没用到任何 CSS 的新特性,全部都是经典属性。
    绝对定位 + 负边距
    此种方法也是适用于固定宽高:

    Document
    复制代码 运行结果:

    ⚠️ 注意,"绝对定位+负边距"这种方法不适合那种宽百分之多少、高百分之多少这种相对单位,取而代之的是具体的数值。

    因为边距的百分比和宽高的百分比相对的不是同一参考物,它是相对于父元素的宽来计算的,这点要注意。

    绝对定位 + 平移
    有时中间盒子的内容是要靠后台传过来的数据决定的,如果写死的话,当数据较多时就会发生溢出,数据较少时又会空出一大片,所以我们需要一种更加智能的方式来实现居中布局。

    绝对定位 + 平移 是 绝对定位 + 负边距的改进版,那么具体都改进了哪些方面呢?负边距的百分比并不是相对于自身,而是相对于父元素,所以只能写具体的像素值,显得不够智能。

    而平移相对于自身,只需要无脑写 -50% 就可以了:

    Document
    用内容撑开盒子
    复制代码 运行结果:

    margin 的百分比是相对于父元素的宽;
    而 translate 函数的百分比是相对于自身;
    不仅适用于未知宽高,也同样适用于固定宽高的居中布局。
    网格 Grid 实现
    大家可能或多或少听过一些 Grid 的大名,深入了解过的人会觉得它很强大,但没深入了解过的人对它的印象可能就是:兼容性不好

    但随着时间的推移,在移动端只要不考虑特别低版本的手机的话基本上都可以用了。

    即使你对 Grid 没什么兴趣,觉得在移动端用 Flex 就已经足够了的。把它最简单的用法记住了也不会费太大劲。因为毕竟如果你能给面试官写出一个最新的技术,面试官也会对你刮目相看的:

    Document
    用内容撑开盒子
    复制代码 运行结果: 其实关键代码异常的简单,几乎没什么特别大的学习成本,就这么两行:

    /* 令其变成网格布局 */
    display: grid;

    /* 令其子元素居中 */
    place-items: center;
    复制代码
    Flex 弹性盒子
    移动端布局王者 Flex :

    Document
    用内容撑开盒子
    复制代码 运行结果: Flex 几乎没有不会的吧?超级好用,简单实惠又便捷,如果这个都不会的话可以去看看阮一峰老师的博客,里面有着很详细的入门教程:

    阮一峰博客:www.ruanyifeng.com/blog/2015/0…
    另外,张鑫旭的博客写的也很不错:

    张鑫旭博客:www.zhangxinxu.com/wordpress/2…
    表格布局
    在居中布局这种场景下,表格布局也很适用:

    Document
    用内容撑开盒子
    复制代码 运行结果: 此布局的关键点在于:

    父元素上 3 个样式设置:

    display: table-cell;
    text-align: center;
    vertical-align: center;
    子元素上设置:

    display: inline-block;
    结语
    看完这些有没有很郁闷,一个小小的居中布局都这么多种实现方式,而且这还不是全部的实现方式,我只挑了几款市面上常见的,可能大家会觉得有这个必要记这么多嘛!

    其实这个问题就显得仁者见仁智者见智了,一方面面试造火箭,工作拧螺丝的现状让大家很苦恼。明明觉得自己技术还不错,至少公司要的都能给实现出来,但面试的时候面对面试官的刁难自己却无能为力。

    也许下一次面试时并不会遇到一个面试官让你以各种方式实现居中布局,但开拓一下眼界总是好的,因为变换一下思路有助于大家在遇见复杂布局的时候可以快速选型。

    该文章首发于前端学不动公众号

    对了,这篇文章是连载形式的,居中布局仅仅只是一个开始,点赞 + 关注 我们下个布局见!

    展开全文
  • 三、高级开发技术面试题 一、图片 1、图片库对比 2、LRUCache原理 3、图片加载原理 4、自己去实现图片库,怎么做? 5、Glide源码解析 6、Glide使用什么缓存? 7、Glide内存缓存如何控制大小? 二、网络和安全机制 1...

    一些感悟

    穷人的一次失败,为了还债可能一辈子都翻不了身,为还债一辈子送外卖。你将不再会有精力去思考和投机。穷人的失败可能断送了他所有暴富的机遇和时间,让不确定的人生瞬间确定下来,让充满无限可能的人生可能性逐渐缩小。这是赤裸裸的现实。

    只有当你有足够多的资本时,允许你失误的次数才会逐渐增加。拥有足够多的资本,哪怕尝试个三番五次失败了,也不会伤你元气。所以从这个角度讲,人的机遇是随着财富的增加而增加的。这时代表面上人人机会平等,但是给穷人的机会非常有限。王思聪失败一次不过是兴趣爱好的失败,而你失败一次则是生存生活的失败。穷人,更应该不断学习和思考,因为你没有钱,知识就是你最大的财富。穷人,更应该保守,因为生活不允许你失败。

    在今天记录一下我的生活。作为一个32岁的程序员,我很焦虑,我在一个不大不小的公司(讯飞),干活,日子重复无聊一晃眼7年过去了,想辞职一想到现在的年纪,房贷,车贷,孩子,家庭真的挺无奈。现在上级还时不时“透漏”公司要优化人的消息,其实还蛮焦虑的。马上35岁了要是被优化了,生活真的不知道该怎么办!

    一、Android面试题

    Android面试题包括Android基础,还有一些源码级别的、原理这些等。所以想去美团面试,一定要多看看源码和实现方式,常用框架可以试试自己能不能手写实现一下,锻炼一下自己。 (一)Android基础知识点

    • 四大组件是什么

    • 四大组件的生命周期和简单用法

    • Activity之间的通信方式

    • Activity各种情况下的生命周期

    • 横竖屏切换的时候,Activity 各种情况下的生命周期

    • Activity与Fragment之间生命周期比较

    • Activity上有Dialog的时候按Home键时的生命周期

    • 两个Activity 之间跳转时必然会执行的是哪几个方法?

    • 前台切换到后台,然后再回到前台,Activity生命周期回调方法。弹出Dialog,生命值周期回调方法。

    • Activity的四种启动模式对比

    • Activity状态保存于恢复

    • fragment各种情况下的生命周期

    • Fragment状态保存startActivityForResult是哪个类的方法,在什么情况下使用?

    • 如何实现Fragment的滑动?

    • fragment之间传递数据的方式?

    • Activity 怎么和Service 绑定?

    • 怎么在Activity 中启动自己对应的Service?

    • service和activity怎么进行数据交互?

    • Service的开启方式

    • 请描述一下Service 的生命周期

    • 谈谈你对ContentProvider的理解

    • 说说ContentProvider、ContentResolver、ContentObserver 之间的关系

    • 请描述一下广播BroadcastReceiver的理解

    • 广播的分类

    • 广播使用的方式和场景

    • 在manifest 和代码中如何注册和使用BroadcastReceiver?

    • 本地广播和全局广播有什么差别?

    • BroadcastReceiver,LocalBroadcastReceiver 区别

    • AlertDialog,popupWindow,Activity区别

    • Application 和 Activity 的 Context 对象的区别

    • Android属性动画特性

    • 如何导入外部数据库?

    • LinearLayout、RelativeLayout、FrameLayout的特性及对比,并介绍使用场景。

    • 谈谈对接口与回调的理解

    • 回调的原理

    • 写一个回调demo

    • 介绍下SurfView

    • RecycleView的使用

    • 序列化的作用,以及Android两种序列化的区别

    • 差值器

    • 估值器

    • Android中数据存储方式

      image

    (二)Android源码相关分析

    • Android动画框架实现原理

    • Android各个版本API的区别

    • Requestlayout,onlayout,onDraw,DrawChild区别与联系

    • invalidate和postInvalidate的区别及使用

    • Activity-Window-View三者的差别

    • 谈谈对Volley的理解

    • 如何优化自定义View

    • 低版本SDK如何实现高版本api?

    • 描述一次网络请求的流程

    • HttpUrlConnection 和 okhttp关系

    • Bitmap对象的理解

    • looper架构

    • ActivityThread,AMS,WMS的工作原理

    • 自定义View如何考虑机型适配

    • 自定义View的事件

    • AstncTask+HttpClient 与 AsyncHttpClient有什么区别?

    • LaunchMode应用场景

    • AsyncTask 如何使用?

    • SpareArray原理

    • 请介绍下ContentProvider 是如何实现数据共享的?

    • AndroidService与Activity之间通信的几种方式

    • IntentService原理及作用是什么?

    • 说说Activity、Intent、Service 是什么关系

    • ApplicationContext和ActivityContext的区别

    • SP是进程同步的吗?有什么方法做到同步?

    • 谈谈多线程在Android中的使用

    • 进程和 Application 的生命周期

    • 封装View的时候怎么知道view的大小

    • RecycleView原理

    • AndroidManifest的作用与理解

      image

      (三)常见的一些原理性问题

    • Handler机制和底层实现

    • Handler、Thread和HandlerThread的差别

    • handler发消息给子线程,looper怎么启动?

    • 关于Handler,在任何地方new Handler 都是什么线程下?

    • ThreadLocal原理,实现及如何保证Local属性?

    • 请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系

    • 请描述一下View事件传递分发机制

    • Touch事件传递流程

    • 事件分发中的onTouch 和onTouchEvent 有什么区别,又该如何使用?

    • View和ViewGroup分别有哪些事件分发相关的回调方法

    • View刷新机制

    • View绘制流程

    • 自定义控件原理

    • 自定义View如何提供获取View属性的接口?

    • Android代码中实现WAP方式联网

    • AsyncTask机制

    • AsyncTask原理及不足

    • 如何取消AsyncTask?

    • 为什么不能在子线程更新UI?

    • ANR产生的原因是什么?

    • ANR定位和修正

    • oom是什么?

    • 什么情况导致oom?

    • 有什么解决方法可以避免OOM?

    • Oom 是否可以try catch?为什么?

    • 内存泄漏是什么?

    • 什么情况导致内存泄漏?

    • 如何防止线程的内存泄漏?

    • 内存泄露场的解决方法

    • 内存泄漏和内存溢出区别?

    • LruCache默认缓存大小

    • ContentProvider的权限管理(解答:读写分离,权限控制-精确到表级,URL控制)

    • 如何通过广播拦截和abort一条短信?

    • 广播是否可以请求网络?

    • 广播引起anr的时间限制是多少?

    • 计算一个view的嵌套层级

    • Activity栈

    • Android线程有没有上限?

    • 线程池有没有上限?

    • Android为什么引入Parcelable?

    • 有没有尝试简化Parcelable的使用?

      image

    二、Java面试题

    熟练掌握java是很关键的,大公司不仅仅要求你会使用几个api,更多的是要你熟悉源码实现原理,甚至要你知道有哪些不足,怎么改进,还有一些java有关的一些算法,设计模式等等。 (一、)Java

    • HashMap 和 HashTable 以及 CurrentHashMap 的区别。

    • synchronized 和 volatile 、ReentrantLock 、CAS 的区别。

    • JVM 类加载机制、垃圾回收算法对比、Java 虚拟机结构等。

    • Java 的四大引用

    • Java 的泛型,<? super T> 和 <? extends T> 的区别。

    • Java 线程有哪些状态,有哪些锁,各种锁的区别。

    • final 、finally、finalize 区别。

    • 接口和抽象类的区别。

    • sleep 、wait、yield 的区别,wait 的线程如何唤醒它?

      image

    三、高级开发技术面试题

    一、图片

    1、图片库对比
    2、LRUCache原理
    3、图片加载原理
    4、自己去实现图片库,怎么做?
    5、Glide源码解析
    6、Glide使用什么缓存?
    7、Glide内存缓存如何控制大小?

    image

    二、网络和安全机制

    1.网络框架对比和源码分析
    2.自己去设计网络请求框架,怎么做?
    3.网络请求缓存处理,okhttp如何处理网络缓存的
    4.从网络加载一个10M的图片,说下注意事项
    5.TCP的3次握手和四次挥手
    6.TCP与UDP的区别
    7.TCP与UDP的应用
    8.HTTP协议
    9.HTTP1.0与2.0的区别
    10.HTTP报文结构
    11.HTTP与HTTPS的区别以及如何实现安全性
    12.如何验证证书的合法性?
    13.https中哪里用了对称加密,哪里用了非对称加密,对加密算法(如RSA)等是否有了解?
    14.client如何确定自己发送的消息被server收到?
    15.谈谈你对WebSocket的理解
    16.WebSocket与socket的区别
    17.谈谈你对安卓签名的理解。
    18.请解释安卓为啥要加签名机制?
    19.视频加密传输
    20.App 是如何沙箱化,为什么要这么做?
    21.权限管理系统(底层的权限是如何进行 grant 的)?

    image

    三、数据库

    1.Sqlite升级,增加字段的语句
    2.数据库框架对比和源码分析
    3.数据库的优化
    4.数据库数据迁移问题

    image

    四、插件化、模块化、组件化、热修复、增量更新、Gradle

    1.对热修复和插件化的理解
    2.插件化原理分析
    3.模块化实现(好处,原因)
    4.热修复、插件化
    5.项目组件化的理解
    6.描述清点击 Android Studio 的 build 按钮后发生了什么

    image

    五、架构设计和设计模式

    1.谈谈你对Android设计模式的理解
    2.MVC MVP MVVM原理和区别
    3.你所知道的设计模式有哪些?
    4.项目中常用的设计模式
    5.手写生产者/消费者模式
    6.写出观察者模式的代码
    7.适配器模式,装饰者模式,外观模式的异同?
    8.用到的一些开源框架,介绍一个看过源码的,内部实现过程。
    9.谈谈对RxJava的理解
    10.Rxjava发送事件步骤
    11.RxJava的作用,与平时使用的异步操作来比的优缺点
    12.说说EventBus作用,实现方式,代替EventBus的方式
    13.从0设计一款App整体架构,如何去做?
    14.说一款你认为当前比较火的应用并设计(比如:直播APP,P2P金融,小视频等)
    15.谈谈对java状态机理解
    16.Fragment如果在Adapter中使用应该如何解耦?
    17.Binder机制及底层实现
    18.对于应用更新这块是如何做的?(解答:灰度,强制更新,分区域更新)?
    19.实现一个Json解析器(可以通过正则提高速度)
    20.统计启动时长,标准

    image

    六、性能优化

    1.启动 app 黑白屏优化
    2.稳定——内存优化
    3.流畅——卡顿优化
    4.节省——耗电优化
    5.安装包——APK 瘦身
    6.冷启动与热启动
    7.内存泄漏的场景和解决办法
    8. Bitmap 优化
    9.LRU 的原理
    10.webview 优化
    11.如何避免 OOM?
    ...

    image

    七、Android Framework

    1.Android 系统架构
    2.View 的事件分发机制?滑动冲突怎么解决?
    3.View 的绘制流程?
    4.跨进程通信
    5.Android 系统启动流程是什么?
    6.启动一个程序,可以主界面点击图标进入,也可 以从一个程序中 跳转过去,二者有什么区别?
    7.AMS 家族重要术语解释
    8.用到的一些开源框架,介绍一个看过源码的,内部实现过程。
    ...

    image

    八、Android优秀三方库源码

    1.网络底层框架:OkHttp 实现原理
    2.网络封装框架:Retrofifit 实现原理
    3.响应式编程框架:RxJava 实现原理
    4.图片加载框架:Glide 实现原理
    5.事件总线框架:EventBus 实现原理
    6.内存泄漏检测框架:LeakCanary 实现原理
    7.依赖注入框架:ButterKnife 实现原理
    8.依赖全局管理框架:Dagger2 实现原理 
    9.数据库框架:GreenDao 实现原理

    image

    如何成为Android高级架构师!

    架构师必须具备抽象思维和分析的能力,这是你进行系统分析和系统分解的基本素质。只有具备这样的能力,架构师才能看清系统的整体,掌控全局,这也是架构师大局观的形成基础。 你如何具备这种能力呢?一是来自于经验,二是来自于学习。

    架构师不仅要具备在问题领域上的经验,也需要具备在软件工程领域内的经验。也就是说,架构师必须能够准确得理解需求,然后用软件工程的思想,把需求转化和分解成可用计算机语言实现的程度。经验的积累是需要一个时间过程的,这个过程谁也帮不了你,是需要你去经历的。

    但是,如果你有意识地去培养,不断吸取前人的经验的话,还是可以缩短这个周期的。这也是我整理架构师进阶此系列的始动力之一。


    成为Android架构师必备知识技能

    对应导图的学习笔记(由阿里P8大牛手写,我负责整理成PDF笔记)

    部分内容展示

    《设计思想解读开源框架》

    • 目录
    • 热修复设计
    • 插件化框架设计

      《360°全方面性能优化》
    • 设计思想与代码质量优化
    • 程序性能优化

    8大牛手写,我负责整理成PDF笔记)

    [外链图片转存中…(img-iQuYm2lY-1618483299526)]

    部分内容展示

    《设计思想解读开源框架》

    • 目录
      [外链图片转存中…(img-eNuj287H-1618483299527)]
    • 热修复设计
      [外链图片转存中…(img-TPnvLuHs-1618483299528)]
    • 插件化框架设计
      [外链图片转存中…(img-6YY8fP3C-1618483299529)]
      《360°全方面性能优化》
      [外链图片转存中…(img-k1zLMytk-1618483299529)]
    • 设计思想与代码质量优化
      [外链图片转存中…(img-JNZtq6aq-1618483299530)]
    • 程序性能优化
      [外链图片转存中…(img-nbb6k5bK-1618483299531)]

    本文在开源项目:【腾讯文档 】中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

    展开全文
  • 结果简历发出去,面试邀请寥寥无几,只恨自己怀才不遇。 1.要做一个尽可能流畅的ListView,你平时在工作中如何进行优化的? ①Item布局,层级越少越好,使用hierarchyview工具查看优化。 ②复用convertView ③使用...

    开头

    金九银十就快到了,很多有求职、跳槽打算的人最近都在完善更新自己的简历,打算趁此机会换到心仪的环境。

    程序员相较其它工作岗位略有不同,最注重的就是技术。所以很多程序员会产生一个误区,觉得自己技术强,自然能找到好工作,不太重视自己的简历。

    结果简历发出去,面试邀请寥寥无几,只恨自己怀才不遇。

    1.要做一个尽可能流畅的ListView,你平时在工作中如何进行优化的?

    ①Item布局,层级越少越好,使用hierarchyview工具查看优化。
    ②复用convertView
    ③使用ViewHolder
    ④item中有图片时,异步加载
    ⑤快速滑动时,不加载图片
    ⑥item中有图片时,应对图片进行适当压缩
    ⑦实现数据的分页加载

    2.对于Android 的安全问题,你知道多少

    ①错误导出组件
    ② 参数校验不严
    ③WebView引入各种安全问题,webview中的js注入
    ④不混淆、不防二次打包
    ⑤明文存储关键信息
    ⑦ 错误使用HTTPS
    ⑧山寨加密方法
    ⑨滥用权限、内存泄露、使用debug签名

    3. 如何缩减APK包大小?

    代码

    保持良好的编程习惯,不要重复或者不用的代码,谨慎添加libs,移除使用不到的libs。

    使用proguard混淆代码,它会对不用的代码做优化,并且混淆后也能够减少安装包的大小。

    native code的部分,大多数情况下只需要支持armabi与x86的架构即可。如果非必须,可以考虑拿掉x86的部分。

    资源

    使用Lint工具查找没有使用到的资源。去除不使用的图片,String,XML等等。 assets目录下的资源请确保没有用不上的文件。

    生成APK的时候,aapt工具本身会对png做优化,但是在此之前还可以使用其他工具如tinypng对图片进行进一步的压缩预处理。

    jpeg还是png,根据需要做选择,在某些时候jpeg可以减少图片的体积。 对于9.png的图片,可拉伸区域尽量切小,另外可以通过使用9.png拉伸达到大图效果的时候尽量不要使用整张大图。

    策略

    有选择性的提供hdpi,xhdpi,xxhdpi的图片资源。建议优先提供xhdpi的图片,对于mdpi,ldpi与xxxhdpi根据需要提供有差异的部分即可。

    尽可能的重用已有的图片资源。例如对称的图片,只需要提供一张,另外一张图片可以通过代码旋转的方式实现。

    能用代码绘制实现的功能,尽量不要使用大量的图片。例如减少使用多张图片组成animate-list的AnimationDrawable,这种方式提供了多张图片很占空间。

    4.Android与服务器交互的方式中的对称加密和非对称加密是什么?

    对称加密,就是加密和解密数据都是使用同一个key,这方面的算法有DES。

    非对称加密,加密和解密是使用不同的key。发送数据之前要先和服务端约定生成公钥和私钥,使用公钥加密的数据可以用私钥解密,反之。这方面的算法有RSA。ssh 和 ssl都是典型的非对称加密。

    5.设备横竖屏切换的时候,接下来会发生什么?

    1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

    2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

    3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

    6.Android启动Service的两种方式是什么? 它们的适用情况是什么?

    如果后台服务开始后基本可以独立运行的话,可以用startService。音乐播放器就可以这样用。它们会一直运行直到你调用 stopSelf或者stopService。你可以通过发送Intent或者接收Intent来与正在运行的后台服务通信,但大部分时间,你只是启动服务并让它独立运行。如果你需要与后台服务通过一个持续的连接来比较频繁地通信,建议使用bind()。比如你需要定位服务不停地把更新后的地理位置传给UI。Binder比Intent开发起来复杂一些,但如果真的需要,你也只能使用它。

    **startService:**生命周期与调用者不同。启动后若调用者未调用stopService而直接退出,Service仍会运行
    **bindService:**生命周期与调用者绑定,调用者一旦退出,Service就会调用unBind->onDestroy

    7.谈谈你对Android中Context的理解?

    **Context:**包含上下文信息(外部值) 的一个参数. Android 中的 Context 分三种,Application Context ,Activity Context ,Service Context.

    它描述的是一个应用程序环境的信息,通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent信息等

    8.Service的onCreate回调在UI线程中吗?

    Service生命周期的各个回调和其他的应用组件一样,是跑在主线程中,会影响到你的UI操作或者阻塞主线程中的其他事情

    结尾

    我还总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料,免费分享给大家。
    (包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发,音视频技术,人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

    领取方式:关注+点赞+点击我的GitHub 免费获取

    %BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)!**

    image

    展开全文
  • 不得不说,前两年的移动开发确实很火,可以说随便能鼓捣出来点东西都很容易找到工作。而现在明显降温了,对人才的要求也越来越苛刻,所以跟前两年比需求确实少了很多。但是安卓不仅仅局限于手机,智能家居车载系统...
  • 本篇文章会总结笔者在最近面试中遇到的关于移动端的知识点和面试点。 移动端兼容:主要概括了 H5 中经常遇到的样式问题、系统兼容问题、原生 App 混合开发的问题 小程序的兼容和优化:第二部分主要是针对微信小程序...
  • 腾讯移动端开发暑期实习面经 一面(电话面 4.1) 1、自我介绍 2、项目(主要谈了一个安卓app的开发,但其实我只会点皮毛,问得我有点尴尬) 3、安卓的四大组件、activity的生命周期 4、进程和线程 5、进程同步、...
  • 移动端

    千次阅读 2020-12-29 22:10:09
    移动端开发包含一些概念和专有名词,面试题以及以后的工作沟通经常会用到。 屏幕相关 屏幕大小 ​ 屏幕大小指屏幕的对角线的长度,单位一般是英寸。常见的手机屏幕大小 3.5、4、4.7、5.0、5.5、6.0等。常见手机屏幕...
  • 而当初移动互联网处于风口时,自学、转行以及培训机构出来了大量 Android 开发从业者,导致目前看起来市场供大于求。 那么 Android 开发工程师们应该如何面对当下的局面呢? 其实当下的供需关系不平衡不...
  • 前端开发面试题 上篇

    2015-11-18 21:18:00
    前端开发面试知识点大纲: HTML&CSS: 对Web标准的理解、浏览器内核差异、兼容性、hack、CSS基本功:布局、盒子模型、选择器优先级及使用、HTML5、CSS3、移动端页面开发 JavaScript: 数据类型、面向对象、继承...
  • 前端面试题第八天 一、HTML 部分 1.1 viewport常见设置 定义:视口(viewport)是用户网页的可视区域,也可称之为视区。 默认不设置 viewport 可视区窗口的宽度在移动端的时候是980; meta标签的设置 设置视口...
  • 2018iOS一份高级面试题

    2019-04-01 15:20:44
    最新移动端iOS开发面试题一份
  • 互联网现状 如今的互联网,延续了2018年的态势。虽然前些年,每到年底的时候大环境都不好,然而来年照样春暖花开。...最开始大家以为只是移动端环境不好,到现在才发现,是整个互联网环境都不好了。
  • 最近很多人说,Android越来越不好找工作了,学习NDK开发会不会好点,今天就聊聊这个问题。...移动互联网发展十余年,伴随着 Android、iOS 等智能手机的不断普及,移动端已逐步取代 PC 端,成为兵家必争
  • 【前端面试题】—18道有关混合开发面试题(附答案) 曾几何时“多端适配”简直要颠覆整个互联网行业。前端开发的项目,可以运行在浏览器(PC端和移动端)、服务器、iOS和 Android系统中,但随着项目实战,与原生App...
  • 3.31日早上电话突击面试,当时我还在睡觉,迷糊中接到了电话,一开始以为他只是和我确认时间,没想到问完信息之后直接开始问问题了,我当时没反应...文末附面试题解析以及面试资料。 android基础: activity的生命
  • 坐标广州,web前端中高级开发工程师面试题整理…(css,js,es6,vue,http等等…微信小程序问得比较少就列举了),2020.04月,有空会再更新一下,需要的朋友可以看看哈… 1.css移动端1px问题 ...伪元素 + tranform: scaleY...
  • 曾几何时“多端适配”简直要颠覆整个互联网行业。前端开发的项目,可以运行在浏览器(PC端和移动端)、服务器、iOS和 Android系统中,但随着项目实战,与原生App相比,混合开发技术本身...
  • 曾几何时“多端适配”简直要颠覆整个互联网行业。前端开发的项目,可以运行在浏览器(PC端和移动端)、服务器、iOS和 Android系统中,但随着项目实战,与原生App相比,混合开发技术本身...
  • Web前端开发工程师面试题1.说说css的优先级?2.在移动端中,常常使用tap作为点击事件,好处是?会带来什么问题?3.原生JS的window,onload与Jquery的$(document).ready(function(){})有什么不同4.看下面的代码输出...
  • 开头 程序员面试,除了面试技术外,有的公司经常会问应聘者和...现在都在说互联网寒冬,尤其是移动端开发市场趋于饱和状态,我之前找工作时,也陆陆续续找了一个月,应该是我技术水平不过关。 现在做Android还有前途吗
  • 互联网现状 今年的互联网,延续了去年的态势。虽然前些年,每到年底的时候大环境都不好,然而来年照样春暖花开。但是2020下半年的颓势,在2021年春天并未得到缓解,所以现在的互联网环境是...最开始大家以为只是移动端
  • 前言 想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~。 学算法真的很痛苦,虽然大数据现在很火,但找到...做笔试的时候,三道算法只做出来第一道,之前经历了
  • 很多人聊起移动端适配都是懵逼状态,都想口吐芬芳。难道移动端还要适配,直接px写死,其他自适应不就完了吗?其实不然,要求严格的公司会要求缩放比例完全相同,简单说就是,在每个手机上的每一行的字数都要一样。接...
  • 今天就给大家分享一份来自网易资深开发工程师项望烽的iOS开发面试全攻略。 网易移动端技术专家,拥有丰富的移动开发和 IM 产品开发经验。热爱开源事业,业余有大量开源组件和技术文章输出,对iOS...
  • 越来越多的人在提“移动端的下半场”、“Android 开发的焦虑”之类的,也有人在喊“技术天天在变,学也学不完”,“昨天 Kotlin 今天 Flutter”。其实我却认为,如果你技术达到了一定程度,你无需太过在意这些。 ...
  • 面试题

    2021-01-08 01:17:32
    面试题 SEO优化,如何做?作为前端开发人员,你能做什么? web性能优化? 浏览器兼容性,常见的浏览器内核? h5和css3中新增的内容 position定位,有几种 区别是什么 flex弹性盒 rem和em和vw 盒模型 如何清除浮动 ...
  • 首先Android应用开发前景差是在最近两年出现的,也就是从2018开始,从那时起移动端的程序员已经慢慢出现供大于求的局面,本人作为移动端开发,深知这一点。 然而也必须说明一点,不论是Android开发还是iOS开发,虽然...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 389
精华内容 155
关键字:

移动端开发面试题