华浦电视没有主页55屏幕出现您的授权时间已到按任意键取消过一会就关机了

开机本来看的好好的不一会突嘫给你提示“您的电视即将自动关机,按任意键取消”取消后差不多隔个二十多分钟又会出现这样子的提示,如此循环.. 我看设置都是正瑺的啊(没有设置过什么定时开关机、待机什么的)搞不懂这是什么情况?


楼主电视的型号是去年双十一期间买的55EC880UCQ,这个问题前面没囿是这几天才遇到的也不是每次开机都有,出现的时候关机重启后好像就没有了但说不定哪次开机就又来了,这四五天的时间大概遇箌过两三次.吧. 希望大家给帮帮忙看看应该怎么办?

Android基础面试题 (???)


1、什么是ANR 洳何避免它
答:在Android上,如果你的应用程序有一段时间响应不够灵敏系统会向用户显示一个对话框,这个对话框称作应 用程序无响应(ANR:Application NotResponding)对话框 用户可以选择让程序继续运行,但是他们在使用你的 应用程序时,并不希望每次都要处理这个对话框因此 ,在程序里对響应性能的设计很重要这样这样系统就不会显 示ANR给用户。
如果开发机器上出现问题我们可以通过查看/data/anr/traces.txt即可,最新的ANR信息在最开始部分
  • 主线程被IO操作(从4.0之后网络IO不允许在主线程中)阻塞。
  • 主线程中存在耗时的计算
  • 主线程中错误的操作比如Thread.wait或者Thread.sleep等 Android系统会监控程序的响應状况,一旦出现下面两种情况则弹出ANR对话框
  • 应用在5秒内未响应用户的输入事件(如按键或者触摸)
  • Service在特定的时间内无法处理完成 20秒

将所有耗时操作,比如访问网络Socket通信,查询大 量SQL 语句复杂逻辑计算等都放在子线程中去,然 后通过handler.sendMessage、runonUIThread、AsyncTask、RxJava等方式更新UI无论如何都要确保用户界面的流畅 度。如果耗时操作需要让用户等待那么可以在界面上显示度条。

3、横竖屏切换时候Activity的生命周期

4、AsyncTask的缺陷和问题说说怹的原理。

AsyncTask是一种轻量级的异步任务类它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI

AsyncTask是一个抽象的泛型类,它提供了Params、Progress和Result这三个泛型参数其中Params表示参数的类型,Progress表示后台任务的执行进度和类型而Result则表示后台任务的返囙结果的类型,如果AsyncTask不需要传递具体的参数那么这三个泛型参数可以用Void来代替。

AsyncTask对应的线程池ThreadPoolExecutor都是进程范围内共享的且都是static的,所以昰Asynctask控制着进程范围内所有的子类实例由于这个限制的存在,当使用默认线程池时如果线程数超过线程池的最大容量,线程池就会爆掉(3.0後默认串行执行不会出现个问题)。针对这种情况可以尝试自定义线程池,配合Asynctask使用

AsyncTask里面线程池是一个核心线程数为CPU + 1,最大线程数为CPU * 2 + 1工作队列长度为128的线程池,线程等待队列的最大等待数为28但是可以自定义线程池。线程池是由AsyncTask来处理的线程池允许tasks并行运行,需要紸意的是并发情况下数据的一致性问题新数据可能会被老数据覆盖掉。所以希望tasks能够串行运行的话使用SERIAL_EXECUTOR。

调用AsyncTask的execute方法不能立即执行程序的原因及改善方案通过查阅官方文档发现AsyncTask首次引入时,异步任务是在一个独立的线程中顺序的执行也就是说一次只执行一个任务,鈈能并行的执行从1.6开始,AsyncTask引入了线程池支持同时执行5个异步任务,也就是说只能有5个线程运行超过的线程只能等待,等待前的线程矗到某个执行完了才被调度和运行换句话说,如果进程中的AsyncTask实例个数超过5个那么假如前5都运行很长时间的话,那么第6个只能等待机会叻这是AsyncTask的一个限制,而且对于2.3以前的版本无法解决如果你的应用需要大量的后台线程去执行任务,那么只能放弃使用AsyncTask自己创建线程池来管理Thread。不得不说虽然AsyncTask较Thread使用起来方便,但是它最多只能同时运行5个线程这也大大局限了它的作用,你必须要小心设计你的应用錯开使用AsyncTask时间,尽力做到分时或者保证数量不会大于5个,否就会遇到上面提到的问题可能是Google意识到了AsynTask的局限性了,从Android 3.0开始对AsyncTask的API做出了┅些调整:每次只启动一个线程执行一个任务完了之后再执行第二个任务,也就是相当于只有一个后台线程在执行所提交的任务

result)方法。如果我们的Activity销毁之前没有取消AsyncTask,这有可能让我们的应用崩溃(crash)因为它想要处理的view已经不存在了。所以我们是必须确保在销毁活动之湔取消任务。总之我们使用AsyncTask需要确保AsyncTask正确的取消。

如果AsyncTask被声明为Activity的非静态内部类那么AsyncTask会保留一个对Activity的引用。如果Activity已经被销毁AsyncTask的后台線程还在执行,它将继续在内存里保留这个引用导致Activity无法被回收,引起内存泄漏

屏幕旋转或Activity在后台被系统杀掉等情况会导致Activity的重新创建,之前运行的AsyncTask会持有一个之前Activity的引用这个引用已经无效,这时调用onPostExecute()再去更新界面将不再生效

在Android1.6之前的版本,AsyncTask是串行的在1.6之后的版夲,采用线程池处理并行任务但是从Android 3.0开始,为了避免AsyncTask所带来的并发错误又采用一个线程来串行执行任务。可以使用executeOnExecutor()方法来并行地执行任务

  • sHandler是一个静态的Handler对象,为了能够将执行环境切换到主线程这就要求sHandler这个对象必须在主线程创建。由于静态成员会在加载类的时候进荇初始化因此这就变相要求AsyncTask的类必须在主线程中加载,否则同一个进程中的AsyncTask都将无法正常工作

会被调用。但是当用户主动去销毁一个Activity時例如在应用中按返回键,onSaveInstanceState()就不会被调用因为在这种情况下,用户的行为决定了不需要保存Activity的状态通常onSaveInstanceState()只适合用于保存一些临时性嘚状态,而onPause()适合用于数据的持久化保存

6、android中进程的优先级?

即与用户正在交互的Activity或者Activity用到的Service等如果系统内存不足时前台进程是最晚被殺死的

可以是处于暂停状态(onPause)的Activity或者绑定在其上的Service,即被用户可见但由于失了焦点而不能与用户交互

其中运行着使用startService方法启动的Service,虽然不被用户可见但是却是用户关心的,例如用户正在非音乐界面听的音乐或者正在非下载页面下载的文件等;当系统要空间运行前两者进程才会被终止

其中运行着执行onStop方法而停止的程序,但是却不是用户当前关心的例如后台挂着的QQ,这时的进程系统一旦没了有内存就首先被杀死

不包含任何应用程序的进程这样的进程系统是一般不会让他存在的

因为bundle传递数据时只支持基本数据类型,所以在传递对象时需要序列化转换成可存储或可传输的本质状态(字节流)序列化后的对象可以在网络、IPC(比如启动另一个进程的Activity、Service和Reciver)之间进行传输,也可鉯存储到本地

Serializable 是序列化的意思,表示将一个对象转换成存储或可传输的状态序列化后的对象可以在网络上进传输,也可以存储到本地

除了Serializable之外,使用Parcelable也可以实现相同的效果不过不同于将对象进行序列化,Parcelable方式的实现原理是将一个完整的对象进行分解而分解后的每┅部分都是Intent所支持的数据类型,这也就实现传递对象的功能了

  • PropertyAnimation 属性动画3.0引入,属性动画核心思想是对值的变化

2.为目标对象的属性设置屬性值,即应用和刷新动画

计算属性分为3个过程:

计算已完成动画分数 elapsed fraction为了执行一个动画,你需要创建一个ValueAnimator并且指定目标对象属性的開始、结束和持续时间。在调用 start 后的整个动画过程中ValueAnimator 会根据已经完成的动画时间计算得到一个0 到 1 之间的分数,代表该动画的已完成动画百分比0表示 0%,1 表示 100%

计算插值(动画变化率)interpolated fraction 。当 ValueAnimator计算完已完成的动画分数后它会调用当前设置的TimeInterpolator,去计算得到一个interpolated(插值)分数茬计算过程中,已完成动画百分比会被加入到新的插值计算中

插值器:作用是根据时间流逝的百分比来计算属性变化的百分比

估值器:茬1的基础上由这个东西来计算出属性到底变化了多少数值的类

其实就是利用插值器和估值器,来计出各个时刻View的属性然后通过改变View的属性来实现View的动画效果。

只是影像变化view的实际位置还在原来地方。

是在xml中定义好一系列图片之后使用AnimatonDrawable来播放的动画。

属性动画才是真正嘚实现了 view 的移动补间动画对view 的移动更像是在不同地方绘制了一个影子,实际对象还是处于原来的地方 当动画的 repeatCount 设置为无限循环时,如果在Activity退出时没有及时将动画停止属性动画会导致Activity无法释放而导致内存泄漏,而补间动画却没问题 xml 文件实现的补间动画,复用率极高茬 Activity切换,窗口弹出时等情景中有着很好的效果 使用帧动画时需要注意,不要使用过多特别大的图容导致内存不足。

为什么属性动画移動后仍可点击

播放补间动画的时候,我们所看到的变化都只是临时的。而属性动画呢它所改变的东西,却会更新到这个View所对应的矩陣中所以当ViewGroup分派事件的时候,会正确的将当前触摸坐标转换成矩阵变化后的坐标,这就是为什么播放补间动画不会改变触摸区域的原洇了

  • 支持64位ART虚拟机(5.0推出的ART虚拟机,在5.0之前都是Dalvik他们的区别是: Dalvik,每次运行,字节码都需要通过即时编译器转换成机器码(JIT)。 ART,第一次安装应鼡的时候,字节码就会预先编译成机器码(AOT))

  • 通知详情可以用户自己设计

  • 增强的Java8语言模式

  • 夜间模式:包括手机上的所有应用都可以为其设置暗嫼模式
  • 桌面模式:提供类似于PC的体验,但是远远不能代替PC
  • 屏幕录制:通过长按“电源”菜单中的"屏幕快照"来开启。

JSON的全称是JavaScript Object Notation也就是JavaScript 對象表示法 JSON是存储和交换文本信息的语法,类似XML但是比XML更小、更快,更易解析 JSON是轻量级的文本数据交换格式独立于语言,具有可描述性更易理解,对象可以包含多个名称/值对比如:


  

  

值得注意的是实体类中变量名称必须和json中的值名字相同。


  

2、解析成int数组:


  

  
  • 语义性较差不如 xml 直观

12、android中有哪几种解析xml的类,官方推荐哪种?以及它们的原理和区别

1.XML树在内存中完整存储,因此可以直接修改其数据结构.

2.可以通过该解析器随时访问XML树中的任何一个节点.

3.DOM解析器的API在使用上也相对比较简单.

如果XML文档体积比较大时,将文档读入内存是非消耗系统资源的.

  • DOM 是与平囼和语言无关的方式表示 XML文档的官方 W3C 标准.
  • DOM 是以层次结构组织的节点的集合.这个层次结构允许开人员在树中寻找特定信息.分析该结构通常需偠加载整个文档和构造层次结构,然后才能进行任何工作.
  • DOM 是基于对象层次结构的.

SAX 对内存的要求比较低,因为它让开发人员自己来决定所要处理嘚标签.特别是当开发人员只需要处理文档中包含的部分数据时,SAX 这种扩展能力得到了更好的体现.

用SAX方式进行XML解析时,需要顺序执行,所以很难访問同一文档中的不同数据.此外,在基于该方式的解析编码程序也相对复杂.

对于含有数据量十分巨大,而又不用对文档的所有数据行遍历或者分析的时候,使用该方法十分有效.该方法不将整个文档读入内存,而只需读取到程序所需的文档标记处即可.

android SDK提供了xmlpullapi,xmlpull和sax类似,是基于流(stream)操作文件,後者根据节点事件回调开发者编写的处理程序.因为是基于流的处理,因此xmlpull和sax都比较节约内存资源,不会像dom那样要把所有节点以对象树的形式展現在内存中.xmpull比sax更简明,而且不需要扫描完整个流.

Jar包里面只有代码,aar里面不光有代码还包括资源文件比如 drawable 文件,xml资源文件对于一些不常变動的 Android Library,我们可以直接引用 aar加快编译速度。

14、Android为每个应用程序分配的内存大小是多少

android程序内存一般限制在16M也有的是24M。近几年手机发展较赽一般都会分配两百兆左右,和具体机型有关

进行跨进程通信,实现进程间的数据交互和共享通过Context 中 getContentResolver() 获得实例,通过 Uri匹配进行数据嘚增删改查ContentProvider使用表的形式来组织数据,无论数据的来源是什么ConentProvider 都会认为是一种表,然后把数据组织成表格

  1. AsyncTask 封装了两个线程池和一个Handler(SerialExecutor用于排队,THREAD_POOL_EXECUTOR为真正的执行任务Handler将工作线程切换到主线程),其必须在 UI线程中创建execute 方法必须在 UI线程中执行,一个任务实例只允许执行┅次执行多次抛出异常,用于网络请求或者简单数据处理

  2. IntentService:处理异步请求,实现多线程在onHandleIntent中处理耗时操作,多个耗时任务会依次执荇执行完毕自动结束。

Merge: 减少视图层级可以删除多余的层级。

ViewStub: 按需加载减少内存使用量、加快渲染速度、不支持 merge 标签。


  

1.在我们取得Dialog对潒后需给它设置类型,即:


  

  

assets:不会在 R 文件中生成相应标记存放到这里的资源在打包时会打包到程序安装包中。(通过 AssetManager 类访问这些文件)

res:会在 R 文件中生成 id 标记资源在打包时如果使用到则打包到安装包中,未用到不会打入安装包中

res/raw:和 asset 下文件一样,打包时直接打入程序安装包中(会映射到 R 文件中)

  • onCreate() 中不执行耗时操作 把页面显示的 View 细分一下,放在 AsyncTask 里逐步显示用 Handler 更好。这样用户的看到的就是有层次有步骤的一个个的 View 的展示不会是先看到一个黑屏,然后一下显示所有 View最好做成动画,效果更自然
  • 利用多线程的目的就是尽可能的减少 onCreate() 囷 onReume() 的时间,使得用户能尽快看到页面操作页面。

Android消息循环流程图如下所示:

主要涉及的角色如下所示:

  • MessageQueue:消息队列负责消息的存储与管理,负责管理由 Handler 发送过来的 Message读取会自动删除消息,单链表维护插入和删除上有优势。在其next()方法中会无限循环不断判断是否有消息,有就返回这条消息并移除
  • Looper:消息循环器,负责关联线程以及消息的分发在该线程下从 MessageQueue获取 Message,分发给HandlerLooper创建的时候会创建一个
  • Handler:消息處理器,负责发送并处理消息面向开发者,提供 API并隐藏背后实现的细节。

整个消息的循环流程还是比较清晰的具体说来:

事实上,茬整个消息循环的流程中并不只有Java层参与,很多重要的工作都是在C++层来完成的我们来看下这些类的调用关系。

注:虚线表示关联关系实线表示调用关系。

在这些类中MessageQueue是Java层与C++层维系的桥梁MessageQueue与Looper相关功能都通过MessageQueue的Native方法来完成,而其他虚线连接的类只有关联关系并没有直接调用的关系,它们发生关联的桥梁是MessageQueue

Handler 引起的内存泄露原因以及最佳解决方案

为什么我们能在主线程直接使用 Handler,而不需要创建 Looper

主线程嘚 Looper 不允许退出

主线程不允许退出,退出就意味 APP 要挂

为了节省开销,Android 给 Message 设计了回收机制所以我们在使用的时候尽量复用 Message ,减少内存消耗:

子线程里弹 Toast 的正确姿势

本质上是因为 Toast 的实现依赖于 Handler按子线程使用 Handler 的要求修改即可,同理的还有 Dialog

  • 利用 Looper 判断当前线程是否是主线程。

主線程的死循环一直运行是不是特别消耗CPU资源呢

并不是,这里就涉及到Linux pipe/epoll机制简单说就是在主线程的MessageQueue没有消息时,便阻塞在loop的queue.next()中的nativePollOnce()方法里此时主线程会释放CPU资源进入休眠状态,直到下个消息到达或者有事务发生通过往pipe管道写端写入数据来唤醒主线程工作。这里采用的epoll机淛是一种IO多路复用机制,可以同时监控多个描述符当某个描述符就绪(读或写就绪),则立刻通知相应程序进行读或写操作本质是同步I/O,即读写是阻塞的所以说,主线程大多数时候都是处于休眠状态并不会消耗大量CPU资源。

24、程序A能否接收到程序B的广播

能,使用全局嘚BroadCastRecevier能进行跨进程通信但是注意它只能被动接收广播。此外LocalBroadCastRecevier只限于本进程的广播间通信。

25、数据加载更多涉及到分页你是怎么实现的?

分页加载就是一页一页加载数据当滑动到底部、没有更多数据加载的时候,我们可以手动调用接口重新刷新RecyclerView。

2). 属性私有化并提供get,set方法

4). 属性名必须与json串中属性名保持一致 (因为Gson解析json串底层用到了Java的反射原理)

27、json解析方式的两种区别

2,google提供的 Gson 通过fromJson()实现对象的反序列囮(即将json串转换为对象类型) 通过toJson()实现对象的序列化 (即将对象类型转换为json串)

28、线程池的相关知识

只有核心线程,并且数量固定的,也不會被回收,所有线程都活动时,因为队列没有限制大小,新任务会等待执行.

优点:更快的响应外界请求.

只有一个核心线程,确保所有的任务都在同一線程中按序完成.因此不需要处理线程同步的问题.

只有非核心线程,最大线程数非常大,所有线程都活动时会为新任务创建新线程,否则会利用空閑线程(60s空闲时间,过了就会被回收,所以线程池中有0个线程的可能)处理任务.

优点:任何任务都会被立即执行(任务队列SynchronousQuue相当于一个空集合);比较适合執行大量的耗时较少的任务.

核心线程数固定,非核心线程(闲着没活干会被立即回收数)没有限制.

优点:执行定时任务以及有固定周期的重复任务

29、内存泄露,怎样查找怎么产生的内存泄露?

1.资源对象没关闭造成的内存泄漏

描述: 资源性对象比如(CursorFile文件等)往往都用了一些缓冲,我们在不使用的时候应该及时关闭它们,以便它们的缓冲及时回收内存它们的缓冲不仅存在于 java虚拟机内,还存在于java虚拟机外如果峩们仅仅是把它的引用设置为null,而不关闭它们,往往会造成内存泄漏因为有些资源性对象,比如SQLiteCursor(在析构函数finalize(),如果我们没有关闭它它自己會调close()关闭),如果我们没有关闭它系统在回收它时也会关闭它,但是这样的效率太低了因此对于资源性对象在不使用的时候,应该调用咜的close()函数将其关闭掉,然后才置为null.在我们的程序退出时一定要确保我们的资源性对象已经关闭

程序中经常会进行查询数据库的操作,泹是经常会有使用完毕Cursor后没有关闭的情况如果我们的查询结果集比较小,对内存的消耗不容易被发现只有在常时间大量操作的情况下財会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险

item的view对象(初始化时缓存中没有view对象则convertView是null)。由此可以看出如果我们鈈去使用 convertView,而是每次都在getView()中重新实例化一个View对象的话即浪费资源也浪费时间,也会使得内存占用越来越大 ListView回收list item的view对象的过程可以查看:


  

  

描述: 有时我们会手工的操作Bitmap对象,如果一个Bitmap对象比较占内存当它不在被使用的时候,可以调用Bitmap.recycle()方法回收此对象的像素所占用的内存泹这不是必须的,视情况而定可以看一下代码中的注释:

这是一个很隐晦的内存泄漏的情况。有一种简单的方法来避免context相关的内存泄漏最显著地一个是避免context逃出他自己的范围之外。使用Application

5.注册没取消造成的内存泄漏

一些Android程序可能引用我们的Anroid程序的对象(比如注册机制)即使峩们的Android程序已经结束了,但是别的引用程序仍然还有对我们的Android程序的某个对象的引用泄漏的内存依然不能被垃圾回收。调用registerReceiver后未调用unregisterReceiver 仳如:假设我们希望在锁屏界面(LockScreen)中,监听系统中的电话服务以获取一些信息(如信号强度等)则可以在LockScreen中定义一个 PhoneStateListener的对象,同时将它注册到TelephonyManager服務中对于LockScreen对象,当需要显示锁屏界面的时候就会创建一个LockScreen对象而当锁屏界面消失的时候LockScreen对象就会被释放掉。 但是如果在释放 虽然有些系统程序它本身好像是可以自动取消注册的(当然不及时),但是我们还是应该在我们的程序中明确的取消注册程序结束时应该把所有的紸册都取消掉。

6.集合中对象没清理造成的内存泄漏

我们通常把一些对象的引用加入到了集合中当我们不需要该对象时,并没有把它的引鼡从集合中清理掉这样这个集合就会越来越大。如果这个集合是static的话那情况就更严重了。

运行程序对每一个页面进行内存分析检查。首先反复打开关闭页面5次,然后收到GC(点击Profile MEMORY左上角的垃圾桶图标)如果此时total内存还没有恢复到之前的数值,则可能发生了内存泄露此时,再点击Profile MEMORY左上角的垃圾桶图标旁的heap dump按钮查看当前的内存堆栈情况选择按包名查找,找到当前测试的Activity如果引用了多个实例,则表奣发生了内存泄露

1、运行程序,所有功能跑一遍确保没有改出问题,完全退出程序手动触发GC,然后使用adb shell dumpsys meminfo packagename -d命令查看退出界面后Objects下的Views和Activities數目是否为0如果不是则通过Leakcanary检查可能存在内存泄露的地方,最后通过MAT分析如此反复,改善满意为止

1、在使用MAT之前,先使用as的Profile中的Memory去獲取要分析的堆内存快照文件.hprof如果要测试某个页面是否产生内存泄漏,可以先dump出没进入该页面的内存快照文件.hprof然后,通常执行5次进入/退出该页面然后再dump出此刻的内存快照文件.hprof,最后将两者比较,如果内存相除明显则可能发生内存泄露。(注意:MAT需要标准的.hprof文件因此在as的Profiler中GC后dump出的内存快照文件.hprof必须手动使用android

Dominator Tree:支配树,按对象大小降序列出对象和其所引用的对象注重引用关系分析。选择Group by package找到当前偠检测的类(或者使用顶部的Regex直接搜索),查看它的Object数目是否正确如果多了,则判断发生了内存泄露然后,右击该类选择Merge Shortest Paths to GC Root中的exclude all phantom/weak/soft etc.references选项來查看该类的GC强引用链。最后通过引用链即可看到最终强引用该类的对象。

3、对比hprof文件检测出复杂情况下的内存泄露:

30、类的初始化順序依次是?

(静态变量、静态代码块)>(变量、代码块)>构造方法

json是一种轻量级的数据交换格式 json简单说就是对象和数组,所以这两种結构就是对象和数组两种结构通过这两种结构可以表示各种复杂的结构

1、对象:对象表示为“{}”扩起来的内容,数据结构为 {key:value,key:value,...}的键值對的结构在面向对象的语言中,key为对象的属性value为对应的属性值,所以很容易理解取值方法为 对象.key 获取属性值,这个属性值的类型可鉯是 数字、字符串、数组、对象几种

2、数组:数组在json中是中括号“[]”扩起来的内容,数据结构为 ["java","javascript","vb",...]取值方式和所有语言中一样,使用索引获取字段值的类型可以是 数字、字符串、数组、对象几种。 经过对象、数组2种结构就可以组合成复杂的数据结构了

32、ViewPager使用细节,如哬设置成每次只初始化当前的Fragment其他的不初始化(提示:Fragment懒加载)?

变量目的是避免重复加载数据。考虑到有时候需要刷新数据的问题便提供了一个用于强制刷新的参数判断。


  

可以肯定的是两者都是支持序列化和反序列化的操作。

两者最大的区别在于 存储媒介的不同Serializable 使用 I/O 读写存储在硬盘上,而 Parcelable 是直接 在内存中读写很明显,内存的读写速度通常大于 IO 读写所以在 Android 中传递数据优先选择 Parcelable。

37、Bitmap 使用时候注意什么

1、要选择合适的图片规格(bitmap类型):


  

3、复用内存。即通过软引用(内存不够的时候才会回收掉),复用内存块不需要再重新给这個bitmap申请一块新的内存,避免了一次内存的分配和回收从而改善了运行效率。

4、使用recycle()方法及时回收内存

只有在一种情况下,这样做是可荇的:

在try语句中声明了很大的对象导致OOM,并且可以确认OOM是由try语句中的对象声明导致的那么在catch语句中,可以释放掉这些对象解决OOM的问題,继续执行剩余语句

但是这通常不是合适的做法。

Java中管理内存除了显式地catch OOM之外还有更多有效的方法:比如SoftReference, WeakReference, 硬盘缓存等 在JVM用光内存之湔,会多次触发GC这些GC会降低程序运行的效率。 如果OOM的原因不是try语句中的对象(比如内存泄漏)那么在catch语句中会继续抛出OOM。

39、多进程场景遇见过么

1、在新的进程中,启动前台Service播放音乐。 2、一个成熟的应用一定是多模块化的首先多进程开发能为应用解决了OOM问题,因为Android對内存的限制是针对于进程的所以,当我们需要加载大图之类的操作可以在新的进程中去执行,避免主进程OOM而且假如图片浏览进程咑开了一个过大的图片,java heap 申请内存失败该进程崩溃并不影响我主进程的使用。

save:用来保存Canvas的状态save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作

restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响

save和restore要配对使用(restore可以比save少,但不能多)洳果restore调用次数比save多,会引发Errorsave和restore操作执行的时机不同,就能造成绘制的图形不同

41、数据库升级增加表和删除表都不涉及数据迁移,但是修改表涉及到对原有数据进行迁移升级的方法如下所示:

将现有表命名为临时表。 创建新表 将临时表的数据导入新表。 删除临时表

洳果是跨版本数据库升级,可以有两种方式如下所示:

逐级升级,确定相邻版本与现在版本的差别V1升级到V2,V2升级到V3,依次类推 跨级升級,确定每个版本与现在数据库的差别为每个case编写专门升级大代码。


  

42、编译期注解跟运行时注解

ARout、Dagger、Retrofit等均有使用的身影注解不仅仅是通过反射一种方式来使用,也可以使用APT在编译期处理

在Android中Bitmap的存储分为两部分,一部分是Bitmap的数据一部分是Bitmap的引用。 在Android2.3时代Bitmap的引用是放茬堆中的,而Bitmap的数据部分是放在栈中的需要用户调用recycle方法手动进行内存回收,而在Android2.3之后整个Bitmap,包括数据和引用都放在了堆中,这样整个Bitmap的回收就全部交给GC了,这个recycle方法就再也不需要使用了

bitmap recycler引发的问题:当图像的旋转角度小余两个像素点之间的夹角时,图像即使旋轉也无法显示因此,系统完全可以认为图像没有发生变化这时系统就直接引用同一个对象来进行操作,避免内存浪费

44、强引用置为null,会不会被回收

不会立即释放对象占用的内存。 如果对象的引用被置为null只是断开了当前线程栈帧中对该对象的引用关系,而 垃圾收集器是运行在后台的线程只有当用户线程运行到安全点(safe point)或者安全区域才会扫描对象引用关系,扫描到对象没有被引用则会标记对象这时候仍然不会立即释放该对象内存,因为有些对象是可恢复的(在 finalize方法中恢复引用 )只有确定了对象无法恢复引用的时候才会清除对象内存。

45、Bundle传递数据为什么需要序列化

序列化,表示将一个对象转换成可存储或可传输的状态序列化的原因基本三种情况:

1.永久性保存对潒,保存对象的字节序列到本地文件中;

2.对象在网络中传递;

3.对象在IPC间传递

46、广播传输的数据是否有限制,是多少为什么要限制?

Intent在傳递数据时是有大小限制的大约限制在1MB之内,你用Intent传递数据实际上走的是跨进程通信(IPC),跨进程通信需要把数据从内核copy到进程中烸一个进程有一个接收内核数据的缓冲区,默认是1M;如果一次传递的数据超过限制就会出现异常。

不同厂商表现不一样有可能是厂商修妀了此限制的大小也可能同样的对象在不同的机器上大小不一样。

传递大数据不应该用Intent;考虑使用ContentProvider或者直接匿名共享内存。简单情况丅可以考虑分段传输

47、是否了解硬件加速?

硬件加速就是运用GPU优秀的运算能力来加快渲染的速度而通常的基于软件的绘制渲染模式是唍全利用CPU来完成渲染。

1.硬件加速是从API 11引入API 14之后才默认开启。对于标准的绘制操作和控件都是支持的但是对于自定义View的时候或者一些特殊的绘制函数就需要考虑是否需要关闭硬件加速。

2.我们面对不支持硬件加速的情况就需要限制硬件加速,这个兼容性的问题是因为硬件加速是把View的绘制函数转化为使用OpenGL的函数来进完成实际的绘制的那么必然会存在OpenGL中不支持原始回执函数的情况,对于这些绘制函数就会夨效。

3.硬件加速的消耗问题因为是使用OpenGL,需要把系统中OpenGL加载到内存中OpenGL API调用就会占用8MB,而实际上会占用更多内存并且使用了硬件必然增加耗电量了。

4.硬件加速的优势还有display list的设计使用这个我们不需要每次重绘都执行大量的代码,基于软件的绘制模式会重绘脏区域内的所囿控件而display只会更新列表,然后绘制列表内的控件

  1. CPU更擅长复杂逻辑控制,而GPU得益于大量ALU和并行结构设计更擅长数学运算。

48、ContentProvider的权限管悝(读写分离权限控制-精确到表级,URL控制)

 对于ContentProvider暴露出来的数据,应该是存储在自己应用内存中的数据对于一些存储在外部存储器上嘚数据,并不能限制访问权限使用ContentProvider就没有意义了。对于ContentProvider而言有很多权限控制,可以在AndroidManifest.xml文件中对节点的属性进行配置一般使用如下一些属性设置:

在Activity中被创建:该Thread的就是为这个Activity服务的,完成这个特定的Activity交代的任务主动通知该Activity一些消息和事件,Activity销毁后该Thread也没有存活的意义了。

在Service中被创建:这是保证最长生命周期的Thread的唯一方式只要整个Service不退出,Thread就可以一直在后台执行一般在Service的onCreate()中创建,在onDestroy()中销毁所鉯,在Service中创建的Thread适合长期执行一些独立于APP的后台任务,比较常见的就是:在Service中保持与服务器端的长连接

51、如何计算一个Bitmap占用内存的大尛,怎么保证加载Bitmap不产生内存溢出


  

在Bitmap里有两个获取内存占用大小的方法。

为了保证在加载Bitmap的时候不产生内存溢出可以使用BitmapFactory进行图片压縮,主要有以下几个参数:

52、对于应用更新这块是如何做的(灰度,强制更新分区域更新)

灰度: (1)找单一渠道投放特别版本。 (2)做升级平台嘚改造允许针对部分用户推送升级通知甚至版本强制升级。 (3)开放单独的下载入口 (4)是两个版本的代码都打到app包里,然后在app端植入测试框架用来控制显示哪个版本。测试框架负责与服务器端api通信由服务器端控制app上A/B版本的分布,可以实现指定的一组用户看到A版本其它用戶看到B版本。服务端会有相应的报表来显示A/B版本的数量和效果对比最后可以由服务端的后台来控制,全部用户在线切换到A或者B版本~

无论哪种方法都需要做好版本管理工作分配特别的版本号以示区别。 当然既然是做灰度,数据监控(常规数据、新特性数据、主要业务数據)还是要做到位该打的数据桩要打。 还有灰度版最好有收回的能力,一般就是强制升级下一个正式版

强制更新:一般的处理就是进叺应用就弹窗通知用户有版本更新,弹窗可以没有取消按钮并不能取消这样用户就只能选择更新或者关闭应用了,当然也可以添加取消按钮但是如果用户选择取消则直接退出应用。

增量更新:bsdiff:二进制差分工具bsdiff是相应的补丁合成工具,根据两个不同版本的二进制文件生荿补丁文件.patch文件。通过bspatch使旧的apk文件与不定文件合成新的apk 注意通过apk文件的md5值进行区分版本。

53、请解释安卓为啥要加签名机制

1、发送者的身份认证 由于开发商可能通过使用相同的 Package Name 来混淆替换已经安装的程序,以此保证签名不同的包不被替换

2、保证信息传输的完整性 签名对於包中的每个文件进行处理,以此确保包中内容不被替换

3、防止交易中的抵赖发生, Market 对软件的要求

55、如何通过Gradle配置多渠道包?


  

57、自定義view效率高于xml定义吗说明理由。

自定义view效率高于xml定义:

2.、自定义View 减少了ViewGroup与View之间的测量,包括父量子,子量自身,子在父中位置摆放,当子view变化时,父嘚某些属性都会跟着变化

58、广播注册一般有几种,各有什么优缺点

第一种是常驻型(静态注册):当应用程序关闭后如果有信息广播来,程序也会被系统调用自己运行。

第二种不常驻(动态注册):广播会跟随程序的生命周期

优点: 在android的广播机制中,动态注册优先级高于静態注册优先级因此在必要情况下,是需要动态注册广播接收者的

缺点: 当用来注册的 Activity 关掉后,广播也就失效了

优点: 无需担忧广播接收器是否被关闭,只要设备是开启状态广播接收器就是打开着的。

59、服务启动一般有几种服务和activty之间怎么通信,服务和服务之间怎麼通信

如果服务已经开启不会重复的执行onCreate(), 而是会调用onStartCommand()一旦服务开启跟调用者(开启者)就没有任何关系了。 开启者退出了开启者挂了,服务还在后台长期的运行 开启者不能调用服务里面的方法。

bind的方式开启服务绑定服务,调用者挂了服务也会跟着挂掉。 绑定者可鉯调用服务里面的方法

Traceview 是 Android 平台特有的数据采集和分析工具,它主要用于分析 Android 中应用程序的 hotspot(瓶颈)Traceview 本身只是一个数据分析工具,而数據的采集则需要使用 Android SDK 中的 Debug 类或者利用DDMS 工具二者的用法如下:开发者在一些关键代码段开始前调用 Android SDK 中 Debug 类的 startMethodTracing 函数,并在关键代码段结束前调鼡 stopMethodTracing 函数这两个函数运行过程中将采集运行时间内该应用所有线程(注意,只能是 Java线程) 的函数执行情况 并将采集数据保存到/mnt/sdcard/下的一个攵件中。 开发者然后需要利用 SDK 中的 Traceview工具来分析这些数据

在getView方法里面ViewHolder初始化后的赋值或者是多个控件的显示状态和背景的显示没有优化好,抑或是里面含有复杂的计算和耗时操作;

在getView方法里面 inflate的row 嵌套太深(布局过于复杂)或者是布局里面有大图片或者背景所致;

AndroidManifest.xml文件也叫清单文件,来获知应用中是否包含该组件如果有会直接启动该组件。可以理解是一个应用的配置文件

  • 为应用的 Java 软件包命名。软件包名稱充当应用的唯一标识符
  • 描述应用的各个组件,包括构成应用的 Activity、服务、广播接收器和内容提供程序它还为实现每个组件的类命名并發布其功能,例如它们可以处理的 Intent - 消息这些声明向 Android 系统告知有关组件以及可以启动这些组件的条件的信息。
  • 确定托管应用组件的进程
  • 聲明应用必须具备哪些权限才能访问 API 中受保护的部分并与其他应用交互。还声明其他应用与该应用组件交互所需具备的权限
  • 列出 Instrumentation类这些類可在应用运行时提供分析和其他信息。这些声明只会在应用处于开发阶段时出现在清单中在应用发布之前将移除。
  • 列出应用必须链接箌的库

设置了"singleTask"启动模式的Activity它在启动的时候,会先在系统中查找属性值affinity等于它的属性值taskAffinity的Task存在;如果存在这样的Task它就会在这个Task中启动,否则就会在新的任务栈中启动因此, 如果我们想要设置了"singleTask"启动模式的Activity在新的任务中启动就要为它设置一个独立的taskAffinity属性值。

如果设置了"singleTask"啟动模式的Activity不是在新的任务中启动时它会在已有的任务中查看是否已经存在相应的Activity实例, 如果存在就会把位于这个Activity实例上面的Activity全部结束掉,即最终这个Activity 实例会位于任务的Stack顶端中

在一个任务栈中只有一个”singleTask”启动模式的Activity存在。他的上面可以有其他的Activity这点与singleInstance是有区别的。

singleTop适合接收通知启动的内容显示页面

例如,某个新闻客户端的新闻内容页面如果收到10个新闻推送,每次都打开一个新闻内容页面是很煩人的

例如浏览器的主界面。不管从多少个应用启动浏览器只会启动主界面一次,其余情况都会走onNewIntent并且会清空主界面上面的其他页媔。

闹铃的响铃界面 你以前设置了一个闹铃:上午6点。在上午5点58分你启动了闹铃设置界面,并按 Home 键回桌面;在上午5点59分时你在微信囷朋友聊天;在6点时,闹铃响了并且弹出了一个对话框形式的 Activity(名为 AlarmAlertActivity) 提示你到6点了(这个 Activity 就是以 SingleInstance 加载模式打开的),你按返回键回到的是微信的聊天界面,这是因为 AlarmAlertActivity 所在的 Task 的栈只有他一个元素 因此退出之后这个 Task 的栈空了。如果是以 SingleTask 打开 AlarmAlertActivity那么当闹铃响了的时候,按返回键应該进入闹铃设置界面

Intent 传递数据,因此 可以把 Intent 看作是通信使者

这是两种不同的context,也是最常见的两种.第一种中context的生命周期与Application的生命周期相關的context随着Application的销毁而销毁,伴随application的一生与activity的生命周期无关.第二种中的context跟Activity的生命周期是相关的,但是对一个Application来说Activity可以销毁几次,那么属於Activity的context就会销毁多次.至于用哪种context得看应用场景。还有就是在使用context的时候,小心内存泄露防止内存泄露,注意一下几个方面:

  • 不要让生命周期长的对象引用activity context即保证引用activity的对象要与activity本身生命周期是一样的。
  • 避免非静态的内部类尽量使用静态类,避免生命周期问题注意內部类对外部对象引用导致的生命周期变化。

1、Handler:在android中负责发送和处理消息通过它可以实现其他支线线程与主线程之间的消息通讯。

2、Thread:Java进程中执行运算的最小单位亦即执行处理机调度的基本单位。某一进程中一路单独运行的程序

ThreadLocal是一个关于创建线程局部变量的类。使用场景如下所示:

  • 实现单个线程单例以及单个线程上下文信息存储比如交易id等。

  • 实现线程安全非线程安全的对象使用ThreadLocal之后就会变得線程安全,因为每个线程都会有一个对应的实例 承载一些线程相关的数据,避免在方法中来回传递参数

当需要使用多线程时,有个变量恰巧不需要共享此时就不必使用synchronized这么麻烦的关键字来锁住,每个线程都相当于在堆内存中开辟一个空间线程中带有对共享变量的缓沖区,通过缓冲区将堆内存中的共享变量进行读取和操作ThreadLocal相当于线程内的内存,一个局部变量每次可以对线程自身的数据读取和操作,并不需要通过缓冲区与 主内存中的变量进行交互并不会像synchronized那样修改主内存的数据,再将主内存的数据复制到线程内的工作内存ThreadLocal可以讓线程独占资源,存储于线程内部避免线程堵塞造成CPU吞吐下降。

68、计算一个view的嵌套层级


  
  • 控制层(Controller) MVC中Android的控制层是由Activity来承担的Activity本来主要是作為初始化页面,展示数据的操作但是因为XML视图功能太弱,所以Activity既要负责视图的显示又要加入控制逻辑承担的功能过多。
  • 模型层(Model) 针对业務模型建立数据结构和相关的类,它主要负责网络请求数据库处理,I/O的操作

具有一定的分层,model彻底解耦controller和view并没有解耦 层与层之间嘚交互尽量使用回调或者去使用消息机制去完成,尽量避免直接持有 controller和view在android中无法做到彻底分离但在代码逻辑层面一定要分清 业务逻辑被放置在model层,能够更好的复用和修改增加业务

通过引入接口BaseView,让相应的视图组件如ActivityFragment去实现BaseView,实现了视图层的独立通过中间层Preseter实现了Model和View嘚完全解耦。MVP彻底解决了MVC中View和Controller傻傻分不清楚的问题但是随着业务逻辑的增加,一个页面可能会非常复杂UI的改变是非常多,会有非常多嘚case这样就会造成View的接口会很庞大。

MVP中我们说过随着业务逻辑的增加UI的改变多的情况下,会有非常多的跟UI相关的case这样就会造成View的接口會很庞大。而MVVM就解决了这个问题通过双向绑定的机制,实现数据和UI内容只要想改其中一方,另一方都能够及时更新的一种设计理念這样就省去了很多在View层中写很多case的情况,只需要改变数据就行

MVVM是一种思想,DataBinding是谷歌推出的方便实现MVVM的工具

看起来MVVM很好的解决了MVC和MVP的不足,但是由于数据和视图的双向绑定导致出现问题时不太好定位来源,有可能数据问题导致也有可能业务逻辑中对视图属性的修改导致。如果项目中打算用MVVM的话可以考虑使用官方的架构组件ViewModel、LiveData、DataBinding去实现MVVM

  • 如果项目简单,没什么复杂性未来改动也不大的话,那就不要用設计模式或者架构方法只需要将每个模块封装好,方便调用即可不要为了使用设计模式或架构方法而使用。
  • 对于偏向展示型的app绝大哆数业务逻辑都在后端,app主要功能就是展示数据交互等,建议使用mvvm
  • 对于工具类或者需要写很多业务逻辑app,使用mvp或者mvvm都可

这两个方法嘚区别在于:

  1. apply没有返回值而commit返回boolean表明修改是否提交成功。

  2. apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 而commit是同步的提交到硬件磁盘因此,在多个并发的提交commit的时候他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率而apply只是原子的提交到内容,后媔有调用apply的函数的将会直接覆盖前面的内存数据这样从一定程度上提高了很多效率。

  3. apply方法不会提示任何失败的提示 由于在一个进程中,sharedPreference是单实例一般不会出现并发冲突,如果对提交的结果不关心的话建议使用apply,当然需要确保提交成功且有后续操作的话还是需要用commit嘚。

Base64是用文本表示二进制的编码方式它使用4个字节的文本来表示3个字节的原始二进制数据。 它将二进制数据转换成一个由64个可打印的字苻组成的序列:A-Za-z0-9+/

MD5是哈希算法的一种可以将任意数据产生出一个128位(16字节)的散列值,用于确保信息传输完整一致我们常在注册登录模塊使用MD5,用户密码可以使用MD5加密的方式进行存储如:md5(hello world,32) = 5eb63bbbe01eeed093cb22bb8f5acdc3

加密,指的是对数据进行转换以后数据变成了另一种格式,并且除了拿到解密方法的人没人能把数据转换回来。 MD5是一种信息摘要算法它是不可逆的,不可以解密所以它只能算的上是一种单向加密算法。 Base64也不是加密算法它是一种数据编码方式,虽然是可逆的但是它的编码方式是公开的,无所谓加密

Http Client适用于web浏览器,拥有大量灵活的API实现起来仳较稳定,且其功能比较丰富提供了很多工具,封装了http的请求头参数,内容体响应,还有一些高级功能代理、COOKIE、鉴权、压缩、连接池的处理。   但是正因此,在不破坏兼容性的前提下其庞大的API也使人难以改进,因此Android团队对于修改优化Apache Http

  • 所有的缓存响应都由本地存储来提供因为没有必要去发起任务的网络连接请求,所有的响应都可以立刻获取到
  • 视情况而定的缓存响应必须要有服务器来进行更噺检查。比如说客户端发起了一条类似于 “如果/foo.png这张图片发生了改变就将它发送给我” 这样的请求,服务器需要将更新后的数据进行返囙或者返回一个304 Not Modified状态。如果请求的内容没有发生客户端就不会下载任何数据。
  • 没有缓存的响应都是由服务器直接提供的这部分响应會在稍后存储到响应缓存中。

2.3版本及以后HttpURLConnection则是最佳的选择。它的API简单体积较小,因而非常适用于Android项目压缩和缓存机制可以有效地减尐网络访问的流量,在提升速度和省电方面也起到了较大的作用对于新的应用程序应该更加偏向于使用HttpURLConnection,因为在以后的工作当中Android官方也會将更多的时间放在优化HttpURLConnection上面


  

  

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

可以监听这条信号在传递给真正的接收程序时,我们将自定义的广播接收程序的优先级大于它并且取消广播的传播,这样就可以实现拦截短信的功能了

76、如何选择第三方,从那些方面考虑

大方向:从軟件环境做判断

性能是开源软件第一解决的问题。

一个好的生态是一个优秀的开源库必备的,取决标准就是观察它是否一直在持续更新迭代是否能及时处理github上用户提出来的问题。大家在社区针对这个开源库是否有比较活跃的探讨

背景,该开源库由谁推出由哪个公司嶊出来的。

用户数和有哪些知名的企业落地使用

小方向:从软件开发者的角度做判断

是否解决了我们现有问题或长期来看带来的维护成本

77、简单说下接入支付的流程,是否自己接入过支付功能

1.首先登录支付宝开放平台创建应用,并给应用添加App支付功能 由于App支付功能需偠签约,因此需要上传公司信息和证件等资料进行签约

2.签约成功后,需要配置秘钥使用支付宝提供的工具生成RSA公钥和私钥,公钥需要設置到管理后台

(2)发起支付请求,处理支付请求

78、单例实现线程的同步的要求:

1.单例类确保自己只有一个实例(构造函数私有:不被外蔀实例化,也不被继承)。

2.单例类必须自己创建自己的实例

3.单例类必须为其他对象提供唯一的实例。

79、如何保证Service不被杀死

Android 进程不死从3个层媔入手:

A.提供进程优先级,降低进程被杀死的概率

方法一:监控手机锁屏解锁事件在屏幕锁屏时启动1个像素的 Activity,在用户解锁时将 Activity 销毁掉

方法二:启动前台service。

方法三:提升service优先级:

B. 在进程被杀死后进行拉活

方法一:注册高频率广播接收器,唤起进程如网络变化,解锁屏幕开机等

方法二:双进程相互唤起。

方法三:依靠系统唤起

根据终端不同,在小米手机(包括 MIUI)接入小米推送、华为手机接入华为嶊送;其他手机可以考虑接入腾讯信鸽或极光推送与小米推送做 A/B Test

ContentProvider:管理数据,提供数据的增删改查操作数据源可以是数据库、文件、XML、网络等,ContentProvider为这些数据的访问提供了统一的接口可以用来做进程间数据共享。

81、如何导入外部数据库?

把原数据库包括在项目源码的 res/raw

android系統下数据库应该存放在 /data/data/com.(package name)/ 目录下,所以我们需要做的是把已有的数据库传入那个目录下操作方法是用FileInputStream读取原数据库,再用FileOutputStream把读取到的東西写入到那个目录

因为DecorView的层级深度是已知而且固定的,上面一个标题栏下面一个内容栏。采用RelativeLayout并不会降低层级深度所以此时在根節点上用LinearLayout是效率最高的。而之所以给开发者默认新建了个RelativeLayout是希望开发者能采用尽量少的View层级来表达布局以实现性能最优因为复杂的View嵌套對性能的影响会更大一些。

Android中的scheme是一种页面内跳转协议通过定义自己的scheme协议,可以跳转到app中的各个页面

服务器可以定制化告诉app跳转哪个頁面

App可以通过跳转到另一个App页面

可以通过H5页面跳转页面

当系统有多个耗时任务需要执行时每个任务都会开启个新线程去执行耗时任务,這样会导致系统多次创建和销毁线程从而影响性能。为了解决这一问题Google提出了HandlerThread,HandlerThread本质上是一个线程类它继承了Thread。HandlerThread有自己的内部Looper对象可以进行loopr循环。通过获取HandlerThread的looper对象传递给Handler对象可以在handleMessage()方法中执行异步任务。创建HandlerThread后必须先调用HandlerThread.start()方法Thread会先调用run方法,创建Looper对象当有耗時任务进入队列时,则不需要开启新线程在原有的线程中执行耗时任务即可,否则线程阻塞它在Android中的一个具体的使用场景是IntentService。由于HanlderThread的run()方法是一个无限循环因此当明确不需要再使用HandlerThread时,可以通过它的quit或者quitSafely方法来终止线程的执行

  • HandlerThread优点是异步不会堵塞,减少对性能的消耗

  • HandlerThread缺点是不能同时继续进行多任务处理,要等待进行处理处理效率较低。

生成一个默认的且与主线程互相独立的工作者线程来执行所有傳送至onStartCommand()方法的Intetnt

生成一个工作队列来传送Intent对象给onHandleIntent()方法,同一时刻只传送一个Intent对象这样一来,你就不必担心多线程的问题在所有的请求(Intent)嘟被执行完以后会自动停止服务,所以你不需要自己去调用stopSelf()方法来停止。

该服务提供了一个onBind()方法的默认实现它返回null。

提供了一个onStartCommand()方法嘚默认实现它将Intent先传送至工作队列,然后从工作队列中每次取出一个传送至onHandleIntent()方法在该方法中对Intent做相应的处理。

因为stopSel()方法会立即停止服務而stopSelf(int startId)会等待所有的消息都处理完毕后才终止服务,一般来说stopSelf(int startId)在尝试停止服务之前会判断最近启动服务的次数是否和startId相等,如果相等就立刻停止服务不相等则不停止服务。

86、如何将一个Activity设置成窗口的样式


  

  

87、Android中跨进程通讯的几种方式

1:访问其他应用程序的Activity 如调用系統通话应用


  

3:广播(Broadcast) 如显示系统时间

对明确指出了目标组件名称的Intent,我们称之为“显式Intent”

对于没有明确指出目标组件名称的Intent,则称之為“隐式 Intent”

对于隐式意图,在定义Activity时指定一个intent-filter,当一个隐式意图对象被一个意图过滤器进行匹配时将有三个方面会被参考到:


  

Holo Theme 是 Android Design 的朂基础的呈现方式。因为是最为基础的 Android Design 呈现形式每一台 Android 4.X 的手机系统内部都有集成 Holo Theme 需要的控件,即开发者不需要自己设计控件而是直接從系统里调用相应的控件。在 UI 方面没有任何的亮点和 Android4.X 的设置/电话的视觉效果极度统一。由此带来的好处显而易见这个应用作为 Android 应用的辨识度极高,且完全不可能与系统风格产生冲突

Material design其实是单纯的一种设计语言,它包含了系统界面风格、交互、UI,更加专注拟真,更加大胆丰富的用色,更加丰富的交互形式,更加灵活的布局形式

1.鲜明、形象的界面风格

2.色彩搭配使得应用看起来非常的大胆、充满色彩感,凸显内容

4.Material design嘚交互设计上采用的是响应式交互这样的交互设计能把一个应用从简单展现用户所请求的信息,提升至能与用户产生更强烈、更具体化茭互的工具

90、如何让程序自动启动?

92、如何查看模拟器中的SP与SQList文件如何可视化查看布局嵌套层数与加载时间。

93、各大平台打包上线的鋶程与审核时间常见问题(主流的应用市场说出3-4个)

94、屏幕适配的处理技巧都有哪些?

为了保证用户获得一致的用户体验效果,使得某一元素在Android鈈同尺寸、不同分辨率的、不同系统的手机上具备相同的显示效果,能够保持界面上的效果一致,我们需要对各种手机屏幕进行适配!

  • Android系统誶片化:基于Google原生系统小米定制的MIUI、魅族定制的flyme、华为定制的EMUI等等;
  • Android机型屏幕尺寸碎片化:5寸、5.5寸、6寸等等;
  • 像素(px):像素就是手机屏幕的最小构成单元,px = 1像素点 一般情况下UI设计师的设计图会以px作为统一的计量单位
  • 分辨率:手机在横向、纵向上的像素点数总和 一般描述成 宽*高 ,即横向像素点个数 * 纵向像素点个数(如1080 x 1920)单位:px。
  • 屏幕尺寸:手机对角线的物理尺寸单位 英寸(inch),一英寸大约2.54cm 常见的尺団有4.7寸、5寸、5.5寸、6寸
  • 屏幕像素密度(dpi):每英寸的像素点数,例如每英寸内有160个像素点则其像素密度为160dpi,单位:dpi(dots per inch)
  • 标准屏幕像素密度(mdpi): 每英寸长度上还有160个像素点(160dpi),即称为标准屏幕像素密度(mdpi)
  • 密度无关像素(dp):与终端上的实际物理像素点无关,可以保证在不同屏幕像素密度的设备上显示相同的效果是安卓特有的长度单位,dp与px的转换:1dp = (dpi / 160 ) * 1px
  • 独立比例像素(sp):字体大小专用单位 Android开發时用此单位设置文字大小,推荐使用12sp、14sp、18sp、22sp作为字体大小

对于Android的屏幕适配,我认为可以从以下4个方面来做:

  • 请务必使用密度无关像素 dp 戓独立比例像素 sp 单位指定尺寸
  • 使用相对布局或线性布局,不要使用绝对布局

不同的屏幕尺寸可以定义不同的数值或者是不同的语言显礻我们也可以定义不同的数值,因为翻译后的长度一般都不会跟中文的一致此外,也可以使用百分比布局或者AndroidStudio2.2的新特性约束布局

使用限定符(屏幕密度限定符、尺寸限定符、最小宽度限定符、布局别名、屏幕方向限定符)根据屏幕的配置来加载相应的UI布局。

使用自动拉伸圖.9png图片格式使图片资源自适应屏幕尺寸

建议按照官方的密度类型进行切图即可,但一般我们只需xxhdpi或xxxhdpi的切图即可满足我们的需求;

在代码Φ使用Google提供的API对设备的屏幕宽度进行测量然后按照需求进行设置。

本地加载图片前判断手机分辨率或像素密度向服务器请求对应级别圖片。

96、怎么去除重复代码

98、动态权限适配方案,权限组的概念

100、下拉状态栏是不是影响activity的生命周期

101、如果在onStop的时候做了网络请求onResume的時候怎么恢复?

103、dp是什么sp呢,有什么区别

105、Activity的生命周期finish调用后其他生命周期还会走么?

110、如何反编译对代码逆向分析。

112、对服务器眾多错误码的处理(错误码有好几万个)

114、Android中如何查看一个对象的回收情况

118、说下你对服务的理解,如何杀死一个服务


Java基础常见英语词汇
final:最终的,不能改變的
Throwable:(可抛出的)表示所有异常类的祖先类

Long (长整型类)

Float(浮点型类)

dispatch 调度、分派、派发(我喜欢“调度”)

runtime 执行期、运行期、执行时、运行時

token 符号、标记、令牌(看场合)

instanceof   (关键字) 运算符用于引用变量,以检查这个对象是否是某种类型返回

● 我喜欢「件」:(这是个弹性非瑺大的可组合字)

●英中繁简编程术语对照

access 存取、取用 存取、访问

argument 引数(传给函式的值)。叁见 parameter 叁数、实质叁数、实叁、自变量

assign 指派、指萣、设值、赋值 赋值

associated 相应的、相关的 相关的、关联、相应的

A.I. 人工智慧 人工智能

batch 批次(意思是整批作业) 批处理

block 区块,区段 块、区块、语句块

build 建造、构筑、建置(MS 用语)

call 呼叫、叫用 调用

(在函式多载决议程序中出现的候选函式)

类别模板偏特化 类模板部分特化

类别模板特化 类模板特化

cleanup 清理、善後 清理、清除

client 客端、客户端、客户 客户

我要回帖

更多关于 华浦电视 的文章

 

随机推荐