1 抽象类和接口的区别?
抽象类:
1)抽象方法,只有行为的概念,没有具体的行为实现。使用abstract关键字修饰,没有方法体。子类必须重写这些抽象方法。
2)包含抽象方法的类,一定是抽象类。
3)抽象类只能被继承,一个类只能继承一个抽象类。
接口:
1)全部的方法都是抽象方法,属型都是常量
2)不能实例化,可以定义变量。
3)接口变量可以引用具体实现类的实例
4)接口只能被实现,一个具体类实现接口,必须实现全部的抽象方法
5)接口之间可以多实现
6)一个具体类可以实现多个接口,实现多继承现象
2 列举你所知道的线程同步的方法:
1)wait():让线程等待。将线程存储到一个线程池中。
2)notify():唤醒被等待的线程。通常都唤醒线程池中的第一个。让被唤醒的线程处于临时阻塞状态。
3)notifyAll(): 唤醒所有的等待线程。将线程池中的所有线程都唤醒。
3 简述String和StringBuffer、ArrayList和LinkedList、HashMap和HashTable的特点及区别。
答:String 对象的长度一旦定义就固定就不可以改变,对于已经存在的String对象的修改都是创建一个新的对象,然后把新的值存进去,String类不能被继承。StringBuffer是一个可变对象,当对它进行修改的时候不会像String那样重新建立对象。它只能通过构造函数来建立对象。另外StringBuffer还是一个线程安全的类。
ArrayList是实现了基于动态数组的数据结构用于,LinkedList基于连表的数据结构,二者都可以存储对象的引用。对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率要高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。就HashMap与HashTable主要从三方面来说。
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value
4 什么是java序列化,如何事件java序列化
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
public class Cat implementsSerializable {}
……
Try{
FileOutputStream fos = new FileOutputStream("catDemo.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
System.out.println(" 1> " + cat.getName());
cat.setName("My Cat");
oos.writeObject(cat);
oos.close();
}catch(Exception e){
……
}
……
5 多线程有几种实现方式,同步有几种实现方式,stop()和suspend()方法为什么不推荐使用
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现方面有两种,分别是synchronized,wait与notify"
反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。 调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复 运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的
Thread类中置入一个标志,
6 简述你对java反射机制的理解
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性
7 写下你对多线程的理解,怎么创建一个线程以及线程同步的方法。
1.多线程是操作系统的重要部分,可以提高应用程序的效率,将耗时操作放进工作线程,可以有效提高用户体验。
2.new Thread().start,在方法中重写run方法;新建类实现Runable接口,重写其抽象方法
3.public staticsynchronized void test() { }
public void test2() {synchronized(lock){ }}
8 从操作系统角度请阐述一下线程与进程的区别
答:进程是系统进行资源分配和调度的一个独立单位,线程是CPU调度和分派的基本单位
进程和线程的关系:
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
(5)线程是指进程内的一个执行单元,也是进程内的可调度实体。
线程与进程的区别:
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行。
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。
(4)系统开销:在创建或撤销进程的时候,由于系统都要为之分配和回收资源,导致系统的明显大于创建或撤销线程时的开销。但进程有独立的地址空间,进程崩溃后,在保护模式下不会对其他的进程产生影响,而线程只是一个进程中的不同的执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但是在进程切换时,耗费的资源较大,效率要差些。
9 Android系统的架构,采用了分层的架构,从高层到底层分别是:
1.Android系统架构之应用程序
Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。
2.Android系统架构之应用程序框架
开发人员可以完全访问核心应用程序所使用的API框架(android.jar)。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块。
3.Android系统架构之系统运行库
1)程序库
Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。
4.Android系统架构之Linux 内核
Android 的核心系统服务依赖于 Linux 2.6
内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层。
10 消息推送的方式有哪几种,每种方式的优缺点是什么?
前Android上主要的推送实现方案有以下几种:
方案1、使用极光和友盟推送。
方案2、使用XMPP协议(Openfire + Spark +Smack)
简介:基于XML协议的通讯协议,前身是Jabber,目前已由IETF国际标准化组织完成了标准化工作。
优点:协议成熟、强大、可扩展性强、目前主要应用于许多聊天系统中,且已有开源的Java版的开发实例androidpn。
缺点:协议较复杂、冗余(基于XML)、费流量、费电,部署硬件成本高。
方案3、使用MQTT协议(更多信息见:http://mqtt.org/)
简介:轻量级的、基于代理的“发布/订阅”模式的消息传输协议。
优点:协议简洁、小巧、可扩展性强、省流量、省电,目前已经应用到企业领域(参考:http://mqtt.org/software),且已有C++版的服务端组件rsmb。
缺点:不够成熟、实现较复杂、服务端组件rsmb不开源,部署硬件成本较高。
方案4、使用HTTP轮循方式
简介:定时向HTTP服务端接口(Web Service API)获取最新消息。
优点:实现简单、可控性强,部署硬件成本低。
缺点:实时性差。
11 android的数据存储的方式?
答:Android提供了5种方式存储数据:
(1)使用SharedPreferences存储数据;它是Android提供的用来存储一些简单配置信息的一种机制,采用了XML格式将数据存储到设备中。只能在同一个包内使用,不能在不同的包之间使用。
(2)文件存储数据;文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。
(3)SQLite数据库存储数据;SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。
(4)使用ContentProvider存储数据;主要用于应用程序之间进行数据交换,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。
(5)网络存储数据;通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储在网络空间中的数据信息。
12 横竖屏切换时候activity的生命周期?
不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
13 Android中动画分为哪几类?他们的特点和区分有那些?
一种是tweened animation(补间动画)
一种是frame by frame(逐帧动画)
特点:
补间动画是通过改变view的大小、旋转的角度、透明度、位置来产生动画,可以控制动画的播放快慢以及加速度。
逐帧动画是用一组图片轮流绘制,产生动画的感觉。类似于gif图片。
区别:
补间动画的所有操作是通过矩阵变换对同一个物体(绘制的一个view或者图片)进行操作产生动画。
而逐帧动画是多个物体(多张图片)进行绘制,可以说这多张图片是不相关的(从播放的角度来看只能说是内容相关)。
14 请解释下在单线程模式中Message,Handler,MessageQueue,Looper之间的关系解释下.
Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理.
Message Queue(消息队列):用来存放通过Handler发布的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列.
Handler:可以发布或者处理一个消息或者操作一个Runnable,通过Handler发布消息,消息将只会发送到与它关联的消息队列,然也只能处理该消息队列中的消息.
Looper:是Handler和消息队列之间通讯桥梁,程序组件首先通过Handler把消息传递给Looper,Looper把消息放入队列。 Looper也把消息队列里的消息广播给所有的Handler:Handler接受到消息后调用handleMessage进行处理.
15 说说mvc模式的原理,它在android中的运用
答:android的官方建议应用程序的开发采用mvc模式。何谓mvc?
mvc是model,view,controller的缩写,mvc包含三个部分:
l模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
2视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
3控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,想用用户出发的相关事件,交给m哦得了处理。
在android中mvc的具体体现如下:
1)视图层(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如何你对android了解的比较的多了话,就一定可以想到在android中也可以使用javascript+html等的方式作为view层,当然这里需要进行java和javascript之间的通信,幸运的是,android提供了它们之间非常方便的通信实现。
2)控制层(controller):android的控制层的重 任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写代码,要通过activity交割model业务逻辑层处理, 这样做的另外一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。
16 请描述下Activity的生命周期.
onCreate(BundlesavedInstanceState):创建activity时调用。设置在该方法
中,还以Bundle的形式提供对以前储存的任何状态的访问!
onStart():activity变为在屏幕上对用户可见时调用。
onResume():activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。 onPause():activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!
onStop():activity被停止并转为不可见阶段及后续的生命周期事件时调用。
onRestart():重新启动activity时调用。该活动仍在栈中,而不是启动新的活 动。
OnDestroy():activity被完全从系统内存中移除时调用该方法
17 Android中4大组件有哪些?他们的作用是什么?
Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持久化的事情,妥善管理生命周期以及一些跳转逻辑。
service:后台服务于Activity,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的事务,定义好需要接受的Intent提供同步和异步的接口。
ContentProvider:是Android提供的第三方应用数据的访问方案,可以派生Content Provider类,对外提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供统一的接口模型,大大简化上层应用,对数据的整合提供了更方便的途径。
BroadCastReceiver:接受一种或者多种Intent作触发事件,接受相关消息,做一些简单处理,转换成一条Notification,统一了Android的事件广播模型。
18 Activity有哪4种启动模式?有哪些特点?
standard 默认模式 --------- 来了intent,每次都创建新的实例。
singleTop -------- 来了intent, 每次都创建新的实例,仅一个例外:当栈顶的activity 恰恰就是该activity的实例(即需要创建的实例)时,不再创建新实例。这解决了栈顶复用问题,想一想,你按两次back键,退出的都是同一个activity,这感觉肯定不爽。
singleTask ---------- 来了intent后,检查栈中是否存在该activity的实例,如果存在就把intent发送给它,否则就创建一个新的该activity的实例,栈中只能有它一个该activity实例,但允许其他activity加入该栈。解决了在一 个task中共享一个activity。
singleInstance ----------- 肯定位于一个task的栈底, 并且是该栈唯一的activity。解决了多个task共享一个activity。
19 注册广播有几种方式,这些方式有何特点?
1)动态代码注册不是常驻型广播,也就是说广播跟随程序的生命周期。
2)清单文件注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
20 谈谈对android内存优化的方法,方案,规则及对内存泄漏如何避免
OOM即Out Of Memory,一般是由程序编写者对内存使用不当,如对该释放的内存资源没有释放,导致其一直不能被再次使用而使内存被耗尽的现象。根本的解决办法是对代码进行优化:在内存引用上做些处理,使用软引用、虚引用、和弱引用;在内存中加载图片时直接在内存中做处理,如边界压缩等;建立动态回收内存机制;优化Dalvik虚拟机的堆内存分配;自定义堆内存大小等。
一般而言,android中常见的原因主要有以下几个:
1.数据库的cursor没有关闭。
2.构造adapter没有使用缓存contentview。
3.调用registerReceiver()后未调用unregisterReceiver().
4.未关闭InputStream/OutputStream。
5.Bitmap使用后未调用recycle()。
6.Context泄漏。
7.static关键字等。
21 启动service有几种方式,说出他们之间的主要区别
答:
调用startService():通过此种方法启动的service会一直运行在后台直到stopService()或stopSelf()方法被调用。
调用bindService():通过此种方法启动的service会与调用者绑定,如果这个service还没有被启动,那么service启动时将不会调用onStart(),只调用onCreate()和onBind(),调用者被销毁时,service也被销毁
22 intent.putExtra时,如果传递的不是基本类型,而是一个”Object”,那么对这个对象有什么要求?还是说任何对象都可以进行传递?
答:
必须实现Serializable接口,或者实现Parcelable接口的对象才可以进行传递。
23 当调用startActivityForResult时,如何获取并处理返回的结构
答:
通过onActivityResult(int requestCode,int resultCode, Intent data)处理返回的数据
requestCode:调用startActivityForResult(Intent intent, intrequestCode)时传递过去的请求码。
resultCode:被调用的Activity执行setResult(intresultCode, Intent intent)时传递的结果码,一般有RESULT_CANCELED,RESULT_OK等,用于区分被调用的Activity传回的不同结果
data:被调用的Activity传回来的数据,可以用data.getExtras()得到数据,用Bundle类型的变量来接收,调用get…(String key)来获取对应的值
24 使用startService()和bindService()启一个Service,这个Sercice的生命周期会有哪里不同?
答: 1.Context.startService()方式的生命周期:启动时,startService –> onCreate() –> onStart()停止时,stopService –> onDestroy()如果调用者直接退出而没有停止Service,则Service 会一直在后台运行 Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法附代码
2.Context.bindService()方式启动:①Context.bindService()方式的生命周期: 绑定时,bindService -> onCreate() –> onBind()调用者退出了,即解绑定时,Srevice就会unbindService –>onUnbind() –>onDestory()Context.bindService()方式启动 Service的方法:绑定Service需要三个参数:bindService(intent, conn,Service.BIND_AUTO_CREATE);第一个:Intent对象第二个:ServiceConnection对象,创建该对象要实现它的onServiceConnected()和
onServiceDisconnected()来判断连接成功或者是断开连接第三个:如何创建Service,一般指定绑定的时候自动创建。
25 Android中什么是ANR,如何应对或者如何避免它?
答: ANR 就是application not responding
在android中Activity的最长执行时间是5秒.
BroadcastReceiver的最长执行时间则是10秒.
超出执行时间就会产生ANR.
解决方法: 1.运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法 (如onCreate()和onResume())里尽可能少的去做创建操作。(可以采用重新开启子线程的方式,然后使用Handler+Message的方式做一些操作,比如更新主线程中的ui等)
2. 应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为 BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个 Service。
26 AIDL的全称是什么?如何工作?能处理哪些类型的数据?
答: AIDL: (Android Interface Definition Language)跨进程通信传输语言
如何工作:AIDL文件由自己定义,在被绑定的Service中和绑定的客户端中都要部署
1.创建AIDL文件, 在这个文件里面定义接口, 该接口定义了可供客户端访问的方法和属性。
2、编译AIDL文件, 用Ant的话, 可能需要手 动, 使用Eclipse plugin的话,可以根据adil文件自动生产java文件并编译, 不需要人为介入.
3、在Java文件中, 实现 AIDL中定义的接口. 编译器会根据AIDL接口, 产生一个JAVA接口。这个接口有一个名为Stub的内部抽象类,它继承扩展 了接口并实现了远程调 用需要的几个方法(是Binder的子类)。接下来就需 要自己去实现自定义的几个接口了.
4.第一个程序的Service:因为跨进程传递时利用Binder对象来实现的,所以我们要在Service端构建Binder对象,又因为我们定义的接口AIDL文件在编译转成.java时的内部类Sub实现了Binder,所以我们构建Binder对象时构建实例内部类直接继承Sub内部类,在类中我们可以调用Service中的方法,此类的对象也就是Binder对象.
5.第二个程序的Activity:在Activity中我们利用bindService方法启动一个绑定的Service的同时需要传入连接对象,所以我们先在Activity中构建Service的连接对象,在该对象的匿名内部类中重写获得Binder对象的方法,参数含有Binder对象,将此对象强制转换成我们在Service中继承Sub的类的对象,强转后我们可以利用该对象调用Service中的方法,从而实现跨进程通信,控制Service.
27 请简单介绍一下NDK。
NDK全称:Native Development Kit。
1、NDK是一系列工具的集合。
* NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。
28 你后台的Activity被系统回收怎么办:
当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B 这个时候A会执行
Java代码
public
void onSaveInstanceState(BundleoutState) {
super.onSaveInstanceState(outState);
outState.putLong("id",1234567890);
}
public void
onSaveInstanceState(BundleoutState) {
B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回 onCreate()里是带上参数 savedInstanceState,没被收回的就还是onResume就好了。
savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。
Java代码
if(savedInstanceState!=null){
long id=savedInstanceState.getLong("id");
}
if(savedInstanceState!=null){
就像官方的Notepad教程里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来。
29 怎么优化listview
1、如果自定义适配器,那么在getView方法中要考虑方法传进来的参数contentView是否为null,如果为null就创建contentView并返回,如果不为null则直接使用。在这个方法中尽可能少创建view。
2、给contentView设置tag(setTag()),传入一个viewHolder对象,用于缓存要显示的数据,可以达到图像数据异步加载的效果。
3、如果listview需要显示的item很多,就要考虑分页加载。比如一共要显示100条或者更多的时候,我们可以考虑先加载20条,等用户拉到列表底部的时候再去加载接下来的20条。
4、设置listview的监听器,如果listview是飞快滑动状态则不更新view
30 根据自己的理解描述下Android数字签名。
(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
(3)如果要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名。
(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。
31 简述Android root机制
答:root指的是你有权限可以再系统上对所有档案有 "读" "写" "执行"的权力。root机器不是真正能让你的应用程序具有root权限。它原理就跟linux下的像sudo这样的命令。在系统的bin目录下放个su程序并属主是root并有suid权限。则通过su执行的命令都具有Androidroot权限。当然使用临时用户权限想把su拷贝的/system/bin目录并改属性并不是一件容易的事情。这里用到2个工具跟2个命令。把busybox拷贝到你有权限访问的目录然后给他赋予4755权限,你就可以用它做很多事了。
32 进程间通信机制,传统IPC 和 Binder
答:传统的进程间通信机制IPC 有管道(Pipe)、信号(Signal)和跟踪(Trace),这三项通信手段只能用于父进程和子进程之间,或者兄弟进程之间;后来又增加了命令管道(Named Pipe),使得进程间通信不再局限于父子进程或兄弟进程之间。后来又出现了报文队列(Message)、共享内存(Share Memeory)和信号量(Semaphore)。Android系统没有采用上述提到的各种进程间通信机制,而是采用Binder机制,它是基于OpenBinder来实现的。
它提供了远程过程调用(RPC)功能,在Android系统的Binder机制中,有一系列组件组成包括 Client、Server、ServiceManager和Binder驱动程序。
33 Serializable和Parcelable的特点及比较
答:Serializable和Parcelable二者都是实现序列化的接口。Parcelable,定义了将数据写入Parcel,和从Parcel中读出的接口。一个实体(用类来表示),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就成为“可打包的”了。一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的。因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。而实际上,Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。Serializable的实现,只需要implements
Serializable即可,这只是给对象打了一个标记,系统会自动将其序列化。Parcelable的实现,需要在类中添加一个静态成员变量CREATOR,这个变量需要继承Parcelable.Creator接口。
比较:Serializable是Java.io中的,不可被activity中的内部类被继承,否则出错;Parcelable是Android特有的,比Serializable节省内存,可以传递Bundle对象,当我们有boolean型的变量可以现存在Bundle中。
34 View、surfaceView、GLSurfaceView有什么区别
View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等,必须在UI主线程内更新画面,速度较慢
SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发,是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快
GLSurfaceView:基于SurfaceView视图再次进行拓展的视图类,专用于3D游戏开发的视图,是surfaceView的子类,openGL专用
35 你曾经用到的android手机访问服务端的方式有哪些?
Android手机访问服务端的方式有两种,分别是:通过socket访问和通过Http协议发送Post和Get请求。
Socket是长连接,服务端和客户端之间通过Socket建立连接,首先ServerSocket将在服务端监听某个端口,当发现客户端有Socket来试图连接它时,它会接受该Socket的连接请求,同时在服务端建立一个对应的Socket与之进行通信。这样就有两个Socket了,客户端和服务端各一个。
发送get和post协议,通过HTTP协议建立短连接。客户端发送请求(Request),服务器端收到后根据请求的类型返回相应的响应(response)。
36 什么是TCP和IP,它们位于网络模型的哪层?
TCP是传输控制协议,IP是internet协议,TCP在网络模型中与UDP一样同属于第二层(传输层),IP属于三层(网络层),IP用于确定主机在网络中的位置,而TCP与UDP用于标示不同的服务,即应用程序。
37 Xml和json的区别
1.可读性 JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。
2可扩展性 XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。
3.编码难度 XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。
4.解码难度 XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。
5.流行度 XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。
38 SAX 、DOM4J 、PULL解析的区别
Sax特点
1. 解析效率高,占用内存少
2.可以随时停止解析
3.不能载入整个文档到内存
4.不能写入xml
5.SAX解析xml文件采用的是事件驱动
pull与sax的不同之处
1.pull读取xml文件后触发相应的事件调用方法返回的是数字。
2.pull可以在程序中控制,想解析到哪里就可以停止到哪里
3.Android中更推荐使用pull解析
DOM的特点
>优点
1.整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能
2.通过树形结构存取xml文档
3.可以在树的某个节点上向前或向后移动
>缺点
1.将整个文档调入内存(包括无用的节点),浪费时间和空间
>适用场合
一旦解析了文档还需多次访问这些数据;硬件资源充足(内存,cpu)
39 在你的理解里,需求分析在整个项目管理的过程中,扮演一个什么样的角色,如何与团队的其他成员(如项目经理、程序开发人员)展开工作?
具有决策性,方向性,策略性的作用,他在软件开发的过程中具有举足轻重的地位.大家一定要对需求分析具有足够的重视.在一个大型软件系统的开发中,他的作用要远远大于程序设计.
按工作分配,分工合作!大家相互努力!才能做到最好 团队出现问题.一定要开团队会议!找原因!
40 如果项目落后于计划,项目经理要求你在3天之内完成某个功能模块的需求分析设计,你会怎么办?
深度理解需求,认真评估完成该功能模块需要的时间,如果于3天内稍微加班可完成则加班完成,如果不能,则以更细的粒度分解需求,3天内只能完成一部分,找别人帮忙。
41 在你的理解里,需求分析师要做的工作内容包括哪些,请按照重要级别列出(最多5项)
根据概要需求(客户及内部需求)编写详细需求规格说明书
系统规划,与产品人员进行前期调研和产品设计工作,编写调研报告和项目解决方案
参与系统功能验收工作及用户手册、新增产品功能培训资料的编写 负责客户及内部需求调研及需求反馈的分析
配合测试人员编写测试计划、测试用例、测试报告的编写、问题缺陷的发现及跟踪、产品用户手册编写;
42 你在一个项目中,在需求调研中,有的客户很配合,把知道的情况及增加的需求都告诉你;但有的客户却很不配合,以各种各样的接口推脱,这时候你该怎么办。
自己主动的去调查,去询问,一定要将项目需求弄明白。
43 你在一组项目中,客户内部的意见不一致,一个工程师告诉你,这个按钮应该放在左上角,一个主任告诉你应该放在右上角,一个处长告诉你,这个应该去掉,这时候你很为难,不知道该听谁的,这时候你该怎么做
请客户内部讨论得出一致的意见之后在开始项目
1
抽象类和接口的区别?
抽象类:
1)抽象方法,只有行为的概念,没有具体的行为实现。使用abstract关键字修饰,没有方法体。子类必须重写这些抽象方法。
2)包含抽象方法的类,一定是抽象类。
3)抽象类只能被继承,一个类只能继承一个抽象类。
接口:
1)全部的方法都是抽象方法,属型都是常量
2)不能实例化,可以定义变量。
3)接口变量可以引用具体实现类的实例
4)接口只能被实现,一个具体类实现接口,必须实现全部的抽象方法
5)接口之间可以多实现
6)一个具体类可以实现多个接口,实现多继承现象
2
列举你所知道的线程同步的方法:
1)wait():让线程等待。将线程存储到一个线程池中。
2)notify():唤醒被等待的线程。通常都唤醒线程池中的第一个。让被唤醒的线程处于临时阻塞状态。
3)notifyAll():
唤醒所有的等待线程。将线程池中的所有线程都唤醒。
3 简述String和StringBuffer、ArrayList和LinkedList、HashMap和HashTable的特点及区别。
答:String
对象的长度一旦定义就固定就不可以改变,对于已经存在的String对象的修改都是创建一个新的对象,然后把新的值存进去,String类不能被继承。StringBuffer是一个可变对象,当对它进行修改的时候不会像String那样重新建立对象。它只能通过构造函数来建立对象。另外StringBuffer还是一个线程安全的类。
ArrayList是实现了基于动态数组的数据结构用于,LinkedList基于连表的数据结构,二者都可以存储对象的引用。对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率要高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map
interface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap
就必须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。就HashMap与HashTable主要从三方面来说。
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java
1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value
4
什么是java序列化,如何事件java序列化
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
public class Cat implementsSerializable
{}
……
Try{
FileOutputStream fos = new FileOutputStream("catDemo.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
System.out.println(" 1> " + cat.getName());
cat.setName("My Cat");
oos.writeObject(cat);
oos.close();
}catch(Exception e){
……
}
……
5
多线程有几种实现方式,同步有几种实现方式,stop()和suspend()方法为什么不推荐使用
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现方面有两种,分别是synchronized,wait与notify"
反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。 调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复
运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的 Thread类中置入一个标志,
6 简述你对java反射机制的理解
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性
7
写下你对多线程的理解,怎么创建一个线程以及线程同步的方法。
1.多线程是操作系统的重要部分,可以提高应用程序的效率,将耗时操作放进工作线程,可以有效提高用户体验。
2.new Thread().start,在方法中重写run方法;新建类实现Runable接口,重写其抽象方法
3.public staticsynchronized void test() {
}
public void test2() {synchronized(lock){
}}
8 从操作系统角度请阐述一下线程与进程的区别
答:进程是系统进行资源分配和调度的一个独立单位,线程是CPU调度和分派的基本单位
进程和线程的关系:
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
(5)线程是指进程内的一个执行单元,也是进程内的可调度实体。
线程与进程的区别:
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行。
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。
(4)系统开销:在创建或撤销进程的时候,由于系统都要为之分配和回收资源,导致系统的明显大于创建或撤销线程时的开销。但进程有独立的地址空间,进程崩溃后,在保护模式下不会对其他的进程产生影响,而线程只是一个进程中的不同的执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但是在进程切换时,耗费的资源较大,效率要差些。
9 Android系统的架构,采用了分层的架构,从高层到底层分别是:
1.Android系统架构之应用程序
Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。
2.Android系统架构之应用程序框架
开发人员可以完全访问核心应用程序所使用的API框架(android.jar)。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块。
3.Android系统架构之系统运行库
1)程序库
Android
包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android
应用程序框架为开发者提供服务。
4.Android系统架构之Linux
内核
Android
的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux
内核也同时作为硬件和软件栈之间的抽象层。
10 消息推送的方式有哪几种,每种方式的优缺点是什么?
前Android上主要的推送实现方案有以下几种:
方案1、使用极光和友盟推送。
方案2、使用XMPP协议(Openfire + Spark +Smack)
简介:基于XML协议的通讯协议,前身是Jabber,目前已由IETF国际标准化组织完成了标准化工作。
优点:协议成熟、强大、可扩展性强、目前主要应用于许多聊天系统中,且已有开源的Java版的开发实例androidpn。
缺点:协议较复杂、冗余(基于XML)、费流量、费电,部署硬件成本高。
方案3、使用MQTT协议(更多信息见:http://mqtt.org/)
简介:轻量级的、基于代理的“发布/订阅”模式的消息传输协议。
优点:协议简洁、小巧、可扩展性强、省流量、省电,目前已经应用到企业领域(参考:http://mqtt.org/software),且已有C++版的服务端组件rsmb。
缺点:不够成熟、实现较复杂、服务端组件rsmb不开源,部署硬件成本较高。
方案4、使用HTTP轮循方式
简介:定时向HTTP服务端接口(Web Service API)获取最新消息。
优点:实现简单、可控性强,部署硬件成本低。
缺点:实时性差。
11 android的数据存储的方式?
答:Android提供了5种方式存储数据:
(1)使用SharedPreferences存储数据;它是Android提供的用来存储一些简单配置信息的一种机制,采用了XML格式将数据存储到设备中。只能在同一个包内使用,不能在不同的包之间使用。
(2)文件存储数据;文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。
(3)SQLite数据库存储数据;SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。
(4)使用ContentProvider存储数据;主要用于应用程序之间进行数据交换,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。
(5)网络存储数据;通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储在网络空间中的数据信息。
12 横竖屏切换时候activity的生命周期?
不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
13 Android中动画分为哪几类?他们的特点和区分有那些?
一种是tweened animation(补间动画)
一种是frame by frame(逐帧动画)
特点:
补间动画是通过改变view的大小、旋转的角度、透明度、位置来产生动画,可以控制动画的播放快慢以及加速度。
逐帧动画是用一组图片轮流绘制,产生动画的感觉。类似于gif图片。
区别:
补间动画的所有操作是通过矩阵变换对同一个物体(绘制的一个view或者图片)进行操作产生动画。
而逐帧动画是多个物体(多张图片)进行绘制,可以说这多张图片是不相关的(从播放的角度来看只能说是内容相关)。
14 请解释下在单线程模式中Message,Handler,MessageQueue,Looper之间的关系解释下.
Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理.
Message Queue(消息队列):用来存放通过Handler发布的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列.
Handler:可以发布或者处理一个消息或者操作一个Runnable,通过Handler发布消息,消息将只会发送到与它关联的消息队列,然也只能处理该消息队列中的消息.
Looper:是Handler和消息队列之间通讯桥梁,程序组件首先通过Handler把消息传递给Looper,Looper把消息放入队列。
Looper也把消息队列里的消息广播给所有的Handler:Handler接受到消息后调用handleMessage进行处理.
15
说说mvc模式的原理,它在android中的运用
答:android的官方建议应用程序的开发采用mvc模式。何谓mvc?
mvc是model,view,controller的缩写,mvc包含三个部分:
l模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
2视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
3控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,想用用户出发的相关事件,交给m哦得了处理。
在android中mvc的具体体现如下:
1)视图层(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如何你对android了解的比较的多了话,就一定可以想到在android中也可以使用javascript+html等的方式作为view层,当然这里需要进行java和javascript之间的通信,幸运的是,android提供了它们之间非常方便的通信实现。
2)控制层(controller):android的控制层的重 任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写代码,要通过activity交割model业务逻辑层处理,
这样做的另外一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。
16 请描述下Activity的生命周期.
onCreate(BundlesavedInstanceState):创建activity时调用。设置在该方法
中,还以Bundle的形式提供对以前储存的任何状态的访问!
onStart():activity变为在屏幕上对用户可见时调用。
onResume():activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。 onPause():activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!
onStop():activity被停止并转为不可见阶段及后续的生命周期事件时调用。
onRestart():重新启动activity时调用。该活动仍在栈中,而不是启动新的活
动。
OnDestroy():activity被完全从系统内存中移除时调用该方法
17 Android中4大组件有哪些?他们的作用是什么?
Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持久化的事情,妥善管理生命周期以及一些跳转逻辑。
service:后台服务于Activity,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的事务,定义好需要接受的Intent提供同步和异步的接口。
ContentProvider:是Android提供的第三方应用数据的访问方案,可以派生Content Provider类,对外提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供统一的接口模型,大大简化上层应用,对数据的整合提供了更方便的途径。
BroadCastReceiver:接受一种或者多种Intent作触发事件,接受相关消息,做一些简单处理,转换成一条Notification,统一了Android的事件广播模型。
18 Activity有哪4种启动模式?有哪些特点?
standard 默认模式 ---------
来了intent,每次都创建新的实例。
singleTop -------- 来了intent, 每次都创建新的实例,仅一个例外:当栈顶的activity
恰恰就是该activity的实例(即需要创建的实例)时,不再创建新实例。这解决了栈顶复用问题,想一想,你按两次back键,退出的都是同一个activity,这感觉肯定不爽。
singleTask ---------- 来了intent后,检查栈中是否存在该activity的实例,如果存在就把intent发送给它,否则就创建一个新的该activity的实例,栈中只能有它一个该activity实例,但允许其他activity加入该栈。解决了在一
个task中共享一个activity。
singleInstance ----------- 肯定位于一个task的栈底,
并且是该栈唯一的activity。解决了多个task共享一个activity。
19 注册广播有几种方式,这些方式有何特点?
1)动态代码注册不是常驻型广播,也就是说广播跟随程序的生命周期。
2)清单文件注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
20 谈谈对android内存优化的方法,方案,规则及对内存泄漏如何避免
OOM即Out Of Memory,一般是由程序编写者对内存使用不当,如对该释放的内存资源没有释放,导致其一直不能被再次使用而使内存被耗尽的现象。根本的解决办法是对代码进行优化:在内存引用上做些处理,使用软引用、虚引用、和弱引用;在内存中加载图片时直接在内存中做处理,如边界压缩等;建立动态回收内存机制;优化Dalvik虚拟机的堆内存分配;自定义堆内存大小等。
一般而言,android中常见的原因主要有以下几个:
1.数据库的cursor没有关闭。
2.构造adapter没有使用缓存contentview。
3.调用registerReceiver()后未调用unregisterReceiver().
4.未关闭InputStream/OutputStream。
5.Bitmap使用后未调用recycle()。
6.Context泄漏。
7.static关键字等。
21 启动service有几种方式,说出他们之间的主要区别
答:
调用startService():通过此种方法启动的service会一直运行在后台直到stopService()或stopSelf()方法被调用。
调用bindService():通过此种方法启动的service会与调用者绑定,如果这个service还没有被启动,那么service启动时将不会调用onStart(),只调用onCreate()和onBind(),调用者被销毁时,service也被销毁
22 intent.putExtra时,如果传递的不是基本类型,而是一个”Object”,那么对这个对象有什么要求?还是说任何对象都可以进行传递?
答:
必须实现Serializable接口,或者实现Parcelable接口的对象才可以进行传递。
23 当调用startActivityForResult时,如何获取并处理返回的结构
答:
通过onActivityResult(int requestCode,int resultCode, Intent data)处理返回的数据
requestCode:调用startActivityForResult(Intent intent, intrequestCode)时传递过去的请求码。
resultCode:被调用的Activity执行setResult(intresultCode, Intent intent)时传递的结果码,一般有RESULT_CANCELED,RESULT_OK等,用于区分被调用的Activity传回的不同结果
data:被调用的Activity传回来的数据,可以用data.getExtras()得到数据,用Bundle类型的变量来接收,调用get…(String
key)来获取对应的值
24 使用startService()和bindService()启一个Service,这个Sercice的生命周期会有哪里不同?
答: 1.Context.startService()方式的生命周期:启动时,startService
–> onCreate() –> onStart()停止时,stopService
–> onDestroy()如果调用者直接退出而没有停止Service,则Service
会一直在后台运行 Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法附代码
2.Context.bindService()方式启动:①Context.bindService()方式的生命周期: 绑定时,bindService -> onCreate()
–> onBind()调用者退出了,即解绑定时,Srevice就会unbindService
–>onUnbind() –>onDestory()Context.bindService()方式启动 Service的方法:绑定Service需要三个参数:bindService(intent, conn,Service.BIND_AUTO_CREATE);第一个:Intent对象第二个:ServiceConnection对象,创建该对象要实现它的onServiceConnected()和
onServiceDisconnected()来判断连接成功或者是断开连接第三个:如何创建Service,一般指定绑定的时候自动创建。
25 Android中什么是ANR,如何应对或者如何避免它?
答: ANR
就是application not responding
在android中Activity的最长执行时间是5秒.
BroadcastReceiver的最长执行时间则是10秒.
超出执行时间就会产生ANR.
解决方法: 1.运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法 (如onCreate()和onResume())里尽可能少的去做创建操作。(可以采用重新开启子线程的方式,然后使用Handler+Message的方式做一些操作,比如更新主线程中的ui等)
2. 应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为 BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个
Service。
26 AIDL的全称是什么?如何工作?能处理哪些类型的数据?
答:
AIDL: (Android Interface Definition Language)跨进程通信传输语言
如何工作:AIDL文件由自己定义,在被绑定的Service中和绑定的客户端中都要部署
1.创建AIDL文件, 在这个文件里面定义接口, 该接口定义了可供客户端访问的方法和属性。
2、编译AIDL文件, 用Ant的话, 可能需要手 动, 使用Eclipse plugin的话,可以根据adil文件自动生产java文件并编译, 不需要人为介入.
3、在Java文件中, 实现 AIDL中定义的接口. 编译器会根据AIDL接口, 产生一个JAVA接口。这个接口有一个名为Stub的内部抽象类,它继承扩展
了接口并实现了远程调 用需要的几个方法(是Binder的子类)。接下来就需
要自己去实现自定义的几个接口了.
4.第一个程序的Service:因为跨进程传递时利用Binder对象来实现的,所以我们要在Service端构建Binder对象,又因为我们定义的接口AIDL文件在编译转成.java时的内部类Sub实现了Binder,所以我们构建Binder对象时构建实例内部类直接继承Sub内部类,在类中我们可以调用Service中的方法,此类的对象也就是Binder对象.
5.第二个程序的Activity:在Activity中我们利用bindService方法启动一个绑定的Service的同时需要传入连接对象,所以我们先在Activity中构建Service的连接对象,在该对象的匿名内部类中重写获得Binder对象的方法,参数含有Binder对象,将此对象强制转换成我们在Service中继承Sub的类的对象,强转后我们可以利用该对象调用Service中的方法,从而实现跨进程通信,控制Service.
27 请简单介绍一下NDK。
NDK全称:Native Development Kit。
1、NDK是一系列工具的集合。
* NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。
28 你后台的Activity被系统回收怎么办:
当你的程序中某一个Activity A
在运行时中,主动或被动地运行另一个新的Activity B 这个时候A会执行
Java代码
public
void onSaveInstanceState(BundleoutState) {
super.onSaveInstanceState(outState);
outState.putLong("id",1234567890);
}
public void
onSaveInstanceState(BundleoutState) {
B 完成以后又会来找A,
这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回 onCreate()里是带上参数 savedInstanceState,没被收回的就还是onResume就好了。
savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。
Java代码
if(savedInstanceState!=null){
long id=savedInstanceState.getLong("id");
}
if(savedInstanceState!=null){
就像官方的Notepad教程里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来。
29 怎么优化listview
1、如果自定义适配器,那么在getView方法中要考虑方法传进来的参数contentView是否为null,如果为null就创建contentView并返回,如果不为null则直接使用。在这个方法中尽可能少创建view。
2、给contentView设置tag(setTag()),传入一个viewHolder对象,用于缓存要显示的数据,可以达到图像数据异步加载的效果。
3、如果listview需要显示的item很多,就要考虑分页加载。比如一共要显示100条或者更多的时候,我们可以考虑先加载20条,等用户拉到列表底部的时候再去加载接下来的20条。
4、设置listview的监听器,如果listview是飞快滑动状态则不更新view
30 根据自己的理解描述下Android数字签名。
(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
(3)如果要正式发布一个Android
,必须使用一个合适的私钥生成的数字证书来给程序签名。
(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。
31 简述Android root机制
答:root指的是你有权限可以再系统上对所有档案有 "读" "写"
"执行"的权力。root机器不是真正能让你的应用程序具有root权限。它原理就跟linux下的像sudo这样的命令。在系统的bin目录下放个su程序并属主是root并有suid权限。则通过su执行的命令都具有Androidroot权限。当然使用临时用户权限想把su拷贝的/system/bin目录并改属性并不是一件容易的事情。这里用到2个工具跟2个命令。把busybox拷贝到你有权限访问的目录然后给他赋予4755权限,你就可以用它做很多事了。
32 进程间通信机制,传统IPC
和 Binder
答:传统的进程间通信机制IPC
有管道(Pipe)、信号(Signal)和跟踪(Trace),这三项通信手段只能用于父进程和子进程之间,或者兄弟进程之间;后来又增加了命令管道(Named Pipe),使得进程间通信不再局限于父子进程或兄弟进程之间。后来又出现了报文队列(Message)、共享内存(Share
Memeory)和信号量(Semaphore)。Android系统没有采用上述提到的各种进程间通信机制,而是采用Binder机制,它是基于OpenBinder来实现的。
它提供了远程过程调用(RPC)功能,在Android系统的Binder机制中,有一系列组件组成包括 Client、Server、ServiceManager和Binder驱动程序。
33 Serializable和Parcelable的特点及比较
答:Serializable和Parcelable二者都是实现序列化的接口。Parcelable,定义了将数据写入Parcel,和从Parcel中读出的接口。一个实体(用类来表示),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就成为“可打包的”了。一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的。因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。而实际上,Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。Serializable的实现,只需要implements
Serializable即可,这只是给对象打了一个标记,系统会自动将其序列化。Parcelable的实现,需要在类中添加一个静态成员变量CREATOR,这个变量需要继承Parcelable.Creator接口。
比较:Serializable是Java.io中的,不可被activity中的内部类被继承,否则出错;Parcelable是Android特有的,比Serializable节省内存,可以传递Bundle对象,当我们有boolean型的变量可以现存在Bundle中。
34 View、surfaceView、GLSurfaceView有什么区别
View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等,必须在UI主线程内更新画面,速度较慢
SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发,是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快
GLSurfaceView:基于SurfaceView视图再次进行拓展的视图类,专用于3D游戏开发的视图,是surfaceView的子类,openGL专用
35 你曾经用到的android手机访问服务端的方式有哪些?
Android手机访问服务端的方式有两种,分别是:通过socket访问和通过Http协议发送Post和Get请求。
Socket是长连接,服务端和客户端之间通过Socket建立连接,首先ServerSocket将在服务端监听某个端口,当发现客户端有Socket来试图连接它时,它会接受该Socket的连接请求,同时在服务端建立一个对应的Socket与之进行通信。这样就有两个Socket了,客户端和服务端各一个。
发送get和post协议,通过HTTP协议建立短连接。客户端发送请求(Request),服务器端收到后根据请求的类型返回相应的响应(response)。
36
什么是TCP和IP,它们位于网络模型的哪层?
TCP是传输控制协议,IP是internet协议,TCP在网络模型中与UDP一样同属于第二层(传输层),IP属于三层(网络层),IP用于确定主机在网络中的位置,而TCP与UDP用于标示不同的服务,即应用程序。
37 Xml和json的区别
1.可读性 JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。
2可扩展性 XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。
3.编码难度 XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。
4.解码难度 XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。
5.流行度 XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。
38 SAX
、DOM4J
、PULL解析的区别
Sax特点
1. 解析效率高,占用内存少
2.可以随时停止解析
3.不能载入整个文档到内存
4.不能写入xml
5.SAX解析xml文件采用的是事件驱动
pull与sax的不同之处
1.pull读取xml文件后触发相应的事件调用方法返回的是数字。
2.pull可以在程序中控制,想解析到哪里就可以停止到哪里
3.Android中更推荐使用pull解析
DOM的特点
>优点
1.整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能
2.通过树形结构存取xml文档
3.可以在树的某个节点上向前或向后移动
>缺点
1.将整个文档调入内存(包括无用的节点),浪费时间和空间
>适用场合
一旦解析了文档还需多次访问这些数据;硬件资源充足(内存,cpu)
39 在你的理解里,需求分析在整个项目管理的过程中,扮演一个什么样的角色,如何与团队的其他成员(如项目经理、程序开发人员)展开工作?
具有决策性,方向性,策略性的作用,他在软件开发的过程中具有举足轻重的地位.大家一定要对需求分析具有足够的重视.在一个大型软件系统的开发中,他的作用要远远大于程序设计.
按工作分配,分工合作!大家相互努力!才能做到最好 团队出现问题.一定要开团队会议!找原因!
40 如果项目落后于计划,项目经理要求你在3天之内完成某个功能模块的需求分析设计,你会怎么办?
深度理解需求,认真评估完成该功能模块需要的时间,如果于3天内稍微加班可完成则加班完成,如果不能,则以更细的粒度分解需求,3天内只能完成一部分,找别人帮忙。
41 在你的理解里,需求分析师要做的工作内容包括哪些,请按照重要级别列出(最多5项)
根据概要需求(客户及内部需求)编写详细需求规格说明书
系统规划,与产品人员进行前期调研和产品设计工作,编写调研报告和项目解决方案
参与系统功能验收工作及用户手册、新增产品功能培训资料的编写
负责客户及内部需求调研及需求反馈的分析
配合测试人员编写测试计划、测试用例、测试报告的编写、问题缺陷的发现及跟踪、产品用户手册编写;
42 你在一个项目中,在需求调研中,有的客户很配合,把知道的情况及增加的需求都告诉你;但有的客户却很不配合,以各种各样的接口推脱,这时候你该怎么办。
自己主动的去调查,去询问,一定要将项目需求弄明白。
43 你在一组项目中,客户内部的意见不一致,一个工程师告诉你,这个按钮应该放在左上角,一个主任告诉你应该放在右上角,一个处长告诉你,这个应该去掉,这时候你很为难,不知道该听谁的,这时候你该怎么做
请客户内部讨论得出一致的意见之后在开始项目