版权声明:本文为博主原创文章,未经博主同意不得转载。

https://blog.csdn.net/bz419927089/article/details/31386787

1.Dalvik和标准Java虚拟机之间的主要区别?

Dalvik和标准Java虚拟机(JVM)之间的首要区别之中的一个,就是Dalvik基于寄存器,而JVM基于栈。
Dalvik和Java之间的另外一大区别就是运行环境——Dalvik经过优化,同意在有限的内存中同一时候运行多个虚拟机的实例。而且每个 Dalvik应用作为一个独立的Linux进程运行。

(1)虚拟机非常小。使用的空间也小;
(2)Dalvik没有JIT编译器。
(3)常量池已被改动为仅仅使用32位的索引,以简化解释器;
(4)它使用自己的字节码。而非Java字节码。

也就是说,每个应用程序在Android平台下,都是运行在一个独立的dalvik虚拟机上,而每个dalvik虚拟机都是LINUX下一个进程。所以,应用程序的进程。dalvik虚拟机的进程和LINUX的进程,这三个概念都是一个意思。

2.onSaveInstanceState,有什么作用?为了保证程序的正确性,一般在哪里写上持久层操作的代码?

onSaveInstanceState这种方法是在Activity被意外遮挡的时候调用(区别与用户手动的退出),比方说是突然来电话,或者是用户点击Home键的时候才会调用,应用程序界面在后台可能被杀死,也可能不被杀死,所以我们在这种方法里面能够保存一些界面的数值,若Activity被杀死,这些数值会被持久化到手机的硬盘。当我们再次进入的时候。我们能够调用onRestoreInstanceState,进行界面恢复。

由于onSaveInstanceState和onRestoreInstanceState这两个方法都不一定被系统调用,所以我们一般在onPause()方法里面。对数据进行持久化操作。

3.view怎样刷新?简述什么是双缓冲?

android中实现view的更新有两个方法,一个是invalidate。还有一个是postInvalidate,当中前者是在UI线程自身中使用,而后者在非UI线程中使用。

 

闪烁是图形编程的一个常见问题。当进行复杂的绘制操作时会导致呈现的图像闪烁或具有其它不可接受的外观。双缓冲的使用解决这些问题。

双缓冲使用内存缓冲区来解决由多重绘制操作造成的闪烁问题。当使用双缓冲时,首先在内存缓冲区里完毕全部绘制操作,而不是在屏幕上直接进行绘图。当全部绘制操作完毕后,把内存缓冲区完毕的图像直接复制到屏幕。由于在屏幕上仅仅运行一个图形操作,所以消除了由复杂绘制操作造成的图像闪烁问题。
在android中实现双缓冲,能够使用一个后台画布backcanvas,先把全部绘制操作都在这上面进行。等图画好了,然后在把backcanvas复制到
与屏幕关联的canvas上去,例如以下: 
Bitmap bitmapBase = new Bitmap()
Canvas backcanvas = new Canvas(bitmapBase)
backcanvas.draw()...//绘图
Canvas c = lockCanvas(null);
c.drawbitmap(bitmapBase);//把已经画好的图像输出到屏幕上
unlock(c)....

4.说一下对广播接收者有哪些了解

广播接收者(BroadcastReceiver)用于接收广播Intent。广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()来实现的。通常一个广播Intent能够被订阅了此Intent的多个广播接收者所接收。这个特性跟JMS中的Topic消息接收者相似。要实现一个广播接收者方法例如以下:
 第一步:继承BroadcastReceiver,并重写onReceive()方法。

public class IncomingSMSReceiver extends BroadcastReceiver {
     @Override public void onReceive(Context context, Intent intent) {
     }
 }
第二步:订阅感兴趣的广播Intent,订阅方法有两种:
 第一种:使用代码进行订阅
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
 IncomingSMSReceiver receiver = new IncomingSMSReceiver();
 registerReceiver(receiver, filter);
另外一种:在AndroidManifest.xml文件里的<application>节点里进行订阅:
  <receiver android:name=".IncomingSMSReceiver">
      <intent-filter>
          <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
     </intent-filter>
 </receiver>

广播类型:

广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”。普通广播是全然异步的,能够在同一时刻(逻辑上)被全部接收者接收到,消息传递的效率比較高,但缺点是:接收者不能将处理结果传递给下一个接收者,而且无法终止广播Intent的传播。然而有序广播是依照接收者声明的优先级别。被接收者依次接收广播。如:A的级别高于B,B的级别高于C,那么。广播先传给A,再传给B。最后传给C 。优先级别声明在intent-filter元素的android:priority属性中,数越大优先级别越高,取值范围:-1000到1000。优先级别也能够调用IntentFilter对象的setPriority()进行设置
。有序广播的接收者能够终止广播Intent的传播,广播Intent的传播一旦终止,后面的接收者就无法接收到广播。

另外。有序广播的接收者能够将数据传递给下一个接收者,如:A得到广播后,能够往它的结果对象中存入数据。当广播传给B时,B能够从A的结果对象中得到A存入的数据。

Context.sendBroadcast()
    发送的是普通广播。全部订阅者都有机会获得并进行处理。

Context.sendOrderedBroadcast()
    发送的是有序广播。系统会依据接收者声明的优先级别按顺序逐个运行接收者,前面的接收者有权终止广播(BroadcastReceiver.abortBroadcast())。假设广播被前面的接收者终止。后面的接收者就再也无法获取到广播。对于有序广播,前面的接收者能够将数据通过setResultExtras(Bundle)方法存放进结果对象。然后传给下一个接收者,下一个接收者通过代码:Bundle bundle = getResultExtras(true))能够获取上一个接收者存入在结果对象中的数据。

系统收到短信,发出的广播属于有序广播。

假设想阻止用户收到短信。能够通过设置优先级,让你们自己定义的接收者先获取到广播,然后终止广播,这样用户就接收不到短信了。

广播接收者的响应:
在Android中,每次广播消息到来时都会创建BroadcastReceiver实例并运行onReceive() 方法, onReceive() 方法运行完后,BroadcastReceiver 的实例就会被销毁。当onReceive() 方法在10秒内没有运行完毕。Android会觉得该程序无响应。所以在BroadcastReceiver里不能做一些比較耗时的操作,否側会弹出ANR(Application No Response)的对话框。假设须要完毕一项比較耗时的工作,应该通过发送Intent给Service,由Service来完毕。这里不能使用子线程来解决,由于BroadcastReceiver的生命周期非常短,子线程可能还没有结束BroadcastReceiver就先结束了。BroadcastReceiver一旦结束。此时BroadcastReceiver的所在进程非常easy在系统须要内存时被优先杀死,由于它属于空进程(没有不论什么活动组件的进程)。假设它的宿主进程被杀死,那么正在工作的子线程也会被杀死。所以採用子线程来解决是不可靠的。

public class IncomingSMSReceiver extends BroadcastReceiver {
     @Override 

    public void onReceive(Context context, Intent intent) {
             //发送Intent启动服务。由服务来完毕比較耗时的操作
            Intent service = new Intent(context, XxxService.class);
             context.startService(service);
     }
 }

经常使用广播Intent:

除了短信到来广播Intent,Android还有非常多广播Intent。如:开机启动、电池电量变化、时间已经改变等广播Intent。

 接收电池电量变化广播Intent ,在AndroidManifest.xml文件里的<application>节点里订阅此Intent:
 <receiver android:name=".IncomingSMSReceiver">
     <intent-filter>
          <action android:name="android.intent.action.BATTERY_CHANGED"/>
     </intent-filter>
 </receiver>

  接收开机启动广播Intent,在AndroidManifest.xml文件里的<application>节点里订阅此Intent:
 <receiver android:name=".IncomingSMSReceiver">
     <intent-filter>
          <action android:name="android.intent.action.BOOT_COMPLETED"/>
     </intent-filter>
 </receiver>
而且要进行权限声明:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

广播接收者生命周期

  广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁
  广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框
  最好也不要在广播接收者中创建子线程做耗时的工作,由于广播接收者被销毁后进程就成为了空进程。非常easy被系统杀掉
  耗时的较长的工作最好放在服务中完毕

Android面试题目整理与解说(二)的更多相关文章

  1. Android面试题目整理与解说(一)

    这一篇文章专门整理一下研究过的Android面试题,内容会随着学习不断的添加,假设答案有错误,希望大家能够指正 1.简述Activity的生命周期 当Activity開始启动的时候,首先调用onCre ...

  2. 【Java基础】Java面试题目整理与解说(二)

    1.Collection 和 Collections 的差别. Collection 是集合类的上级接口,继承于他的接口主要有 Set 和 List. Collections 是针对集合类的一个帮助类 ...

  3. 【Android进阶】Android面试题目整理与讲解(二)

    1. ArrayList,Vector, LinkedList 的存储性能和特性 ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们 ...

  4. 【Android进阶】Android面试题目整理与讲解(一)

    这一篇文章专门整理一下研究过的Android面试题,内容会随着学习不断的增加,如果答案有错误,希望大家可以指正 1.简述Activity的生命周期 当Activity开始启动的时候,首先调用onCre ...

  5. Android面试题目及其答案

    转自:http://blog.csdn.net/wwj_748/article/details/8868640 Android面试题目及其答案 1.Android dvm的进程和Linux的进程, 应 ...

  6. Android面试题目2

    1. 请描述下Activity的声明周期. onCreate->onStart->onRemuse->onPause->onStop->onRestart->onD ...

  7. Android 面试题目汇总

    内容源自:2017-2018最新Android面试题 以下是几点重点,是面试官基本必问的问题,请一定要去了解! 基础知识 – 四大组件(生命周期,使用场景,如何启动) java基础 – 数据结构,线程 ...

  8. C/C++ 笔试、面试题目大汇总(二)

    一.找错题 试题1: void test1() { charstring[10]; char* str1 ="0123456789"; strcpy( string, str1 ) ...

  9. android面试题目大全<完结部分>,android笔试题目集锦

    1. 下列哪些语句关于内存回收的说明是正确的? (b ) A. 程序员必须创建一个线程来释放内存   B.内存回收程序负责释放无用内存    C.内存回收程序允许程序员直接释放内存    D.内存回收 ...

随机推荐

  1. [leetcode]984. 不含 AAA 或 BBB 的字符串

    给定两个整数 A 和 B,返回任意字符串 S,要求满足: S 的长度为 A + B,且正好包含 A 个 'a' 字母与 B 个 'b' 字母: 子串 'aaa' 没有出现在 S 中: 子串 'bbb' ...

  2. P、NP、NPC、NP-Hard问题到底是何方神圣?

    最近在做一个求解有向图中回路的问题,老师说求解图中全部回路是一个NP难问题.突然想到P.NP.NPC.NP-hard的描述一致不是很清楚,所以又学习了一下. 在解释这四个概念之前,我们需要先知道两个问 ...

  3. virtualbox中 清理磁盘

    1. 碎片整理 windows: 下载 sdelete 工具 执行命令: sdelete –z c:\ Linux: 执行如下命令: sudo dd if=/dev/zero of=/EMPTY bs ...

  4. LeNet训练MNIST

    jupyter notebook: https://github.com/Penn000/NN/blob/master/notebook/LeNet/LeNet.ipynb LeNet训练MNIST ...

  5. 2018-11-27 中文代码示例之Programming in Scala笔记第七八章

    续前文: 中文代码示例之Programming in Scala学习笔记第二三章 中文代码示例之Programming in Scala笔记第四五六章. 同样仅节选有意思的例程部分作演示之用. 源文档 ...

  6. 唯一索引的一种使用情景【有则U无则I】

    这个知识点是最近一位面试老师问我的,当时对这种方法不了解,所以只能说那个中效率低的方法了,也就是先进性select判断,然后在执行更新或者插入操作,显然这种是很麻烦的,也自我反思一下,确实有很多的知识 ...

  7. Python 关于xpath查找XML元素的一点总结

    关于xpath查找XML元素的一点总结 by:授客 QQ:1033553122   欢迎加入全国软件测试qq群:7156436   测试环境 Win7 64 python 3.4.0 实践出真知 代码 ...

  8. leetcode-69.x的平方根

    leetcode-69.x的平方根 Points 二分查找 牛顿迭代 题意 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保 ...

  9. jsfiddle 使用教程

    最近有许多的Css 3 demo,因此为了方便查阅,就将demo部分放在jsfiddle ,方便日后翻阅. 这是 JSFIDDLE 的官网文档,都是英文,不过对照看还是可以的:官方文档 HTML区域: ...

  10. SparkSQL【1.x版本】字段敏感不敏感问题

    一.特征 1.SqlContext默认大小写不敏感,如果DataFrame中有字段相同,大小写不同,在使用字段的时候不会引起歧义. 2.HiveContext提供更多的Hive预置函数,可以更高效的进 ...