标签:内存管理 依据 系统进程 boot destory horizon 颇受 状态 awr
从网上搜索的一些android面试问题及答案:
1、 Android dvm的进程和Linux的进程,
应用程序的进程是否为同一个概念
DVM指dalivk的虚拟机。
每个Android应用程序都在它自己的进程中执行,都拥有一个独立的Dalvik虚拟机实例。而每个DVM都是在Linux 中的一个进程,所以说能够觉得是同一个概念。
2、sim卡的EF
文件有何作用
sim卡的文件系统有自己规范,主要是为了和手机通讯。sim本身能够有自己的操作系统,EF就是作存储并和手机通讯用的
3、嵌入式操作系统内存管理有哪几种,各有何特性
页式,段式。段页,用到了MMU,虚拟空间等技术
4、什么是嵌入式实时操作系统, Android
操作系统属于实时操作系统吗?
嵌入式实时操作系统是指当外界事件或数据产生时,可以接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出高速响应,并控制全部实时任务协调一致执行的嵌入式操作系统。
主要用于工业控制、军事设备、航空航天等领域对系统的响应时间有苛刻的要求,这就须要使用实时系统。
又可分为软实时和硬实时两种。而android是基于linux内核的,因此属于软实时。
5、一条最长的短信息约占多少byte?
中文70(包含标点)。英文160。160个字节。
6、 android中的动画有哪几类。它们的特点和差别是什么?
两种。一种是Tween动画、另一种是Frame动画。
Tween动画。这样的实现方式能够使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现。类似电影。
7、handler机制的原理
andriod提供了 Handler
和 Looper
来满足线程间的通信。Handler
先进先出原则。
Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。
1)Looper: 一个线程能够产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
2)Handler: 你能够构造Handler对象来与Looper沟通,以便push新消息到Message
Queue里;或者接收Looper从Message
Queue取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。
4)线程:UI thread
通常就是main thread,而Android启动程序时会替它建立一个Message
Queue。
8、说说mvc模式的原理,它在android中的运用
android的官方建议应用程序的开发採用mvc模式。
何谓mvc?
mvc是model,view,controller的缩写,mvc包括三个部分:
l模型(model)对象:是应用程序的主体部分,全部的业务逻辑都应该写在该层。
l视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一能够看到的一层,接收用户的输入,显示处理结果。
l控制器(control)对象:是依据用户的输入,控制用户界面数据显示及更新model对象状态的部分。控制器更重要的一种导航功能,想用用户出发的相关事件。交给m哦得了处理。
android鼓舞弱耦合和组件的重用,在android中mvc的详细体现例如以下:
1)视图层(view):一般採用xml文件进行界面的描写叙述。使用的时候能够很方便的引入,当然,怎样你对android了解的比較的多了话,就一定能够想到在android中也能够使用javascript+html等的方式作为view层。当然这里须要进行java和javascript之间的通信,幸运的是,android提供了它们之间很方便的通信实现。
2)控制层(controller):android的控制层的重任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写代码。要通过activity交割model业务逻辑层处理。这样做的另外一个原因是android中的acitivity的响应时间是5s,假设耗时的操作放在这里,程序就非常easy被回收掉。
3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理。当然对业务计算等操作也是必须放在的该层的。
9、Activity的生命周期
和其它手机平台的应用程序一样。Android的应用程序的生命周期是被统一掌控的。也
就是说我们写的应用程序命运掌握在别人(系统)的手里。我们不能改变它。仅仅能学习并
适应它。
简单地说一下为什么是这样:我们手机在执行一个应用程序的时候,有可能打进来电话
发进来短信。或者没有电了,这时候程序都会被中断。优先去服务电话的基本功能,另
外系统也不同意你占用太多资源,至少要保证电话功能吧,所以资源不足的时候也就有可
能被干掉。
言归正传,Activity的基本生命周期例如以下代码所看到的:
Java代码
public
class MyActivity extends Activity {
protected
void onCreate(Bundle savedInstanceState);
protected
void onStart();
protected
void onResume();
protected
void onPause();
protected
void onStop();
protected
void onDestroy();
}
public class MyActivity extends Activity {protected void onCreate(Bundle savedInstanceState); protected void onStart();protected void onResume(); protected void onPause(); protected void onStop();protected void onDestroy(); }
你自己写的Activity会按须要重载这些方法,onCreate是免不了的,在一个Activity正常启动的过程中,他们被调用的顺序是
onCreate -> onStart -> onResume, 在Activity被干掉的时候顺序是onPause -> onStop -> onDestroy
,这样就是一个完整的生命周期,可是有人问了,程序正执行着呢来电话了。这个程序咋办?中止了呗。假设中止的时候新出的一个Activity是全屏的那么:onPause->onStop
,恢复的时候onStart->onResume
。假设打断这个应用程序的是一个Theme为Translucent
或者Dialog
的Activity那么仅仅是onPause ,恢复的时候onResume
。
具体介绍一下这几个方法中系统在做什么以及我们应该做什么:
onCreate: 在这里创建界面,做一些数据的初始化工作
onStart: 到这一步变成用户可见不可交互的
onResume: 变成和用户可交互的。(在activity
栈系统通过栈的方式管理这些个
Activity的最上面,执行完弹出栈。则回到上一个Activity)
onPause: 到这一步是可见但不可交互的,系统会停止动画等消耗CPU
的事情
从上文的描写叙述已经知道。应该在这里保存你的一些数据,由于这个时候
你的程序的优先级减少,有可能被系统收回。在这里保存的数据,应该在
onResume里读出来。注意:这种方法里做的事情时间要短,由于下一
个activity不会等到这种方法完毕才启动
onstop: 变得不可见,被下一个activity覆盖了
onDestroy: 这是activity被干掉前最后一个被调用方法了。可能是外面类调用finish方
法或者是系统为了节省空间将它临时性的干掉,能够用isFinishing()来判
断它,假设你有一个ProgressDialog在线程中转动。请在onDestroy里
把他cancel掉,不然等线程结束的时候。调用Dialog的cancel方法会抛
异常的。
onPause,onstop, onDestroy。三种状态下
activity都有可能被系统干掉
为了保证程序的正确性。你要在onPause()里写上持久层操作的代码,将用户编辑的内容都保存到存储介质上(一般都是数据库
)。
实际工作中由于生命周期的变化而带来的问题也非常多。比方你的应用程序起了新的线程在跑。这时候中断了。你还要去维护那个线程,是暂停还是杀掉还是数据回滚,是吧?由于Activity可能被杀掉,所以线程中使用的变量和一些界面元素就千万要注意了,一般都是採用Android的消息机制
[Handler,Message]来处理多线程和界面交互的问题。
10、让Activity变成一个窗体:Activity属性设定
讲点轻松的吧,可能有人希望做出来的应用程序是一个漂浮在手机主界面的东西,那么非常
简单你仅仅须要设置一下Activity的主题就能够了在AndroidManifest.xml
中定义 Activity的
地方一句话:
Xml代码
android :theme=”@android:style/Theme.Dialog”
android:theme=”@android:style/Theme.Dialog”
这就使你的应用程序变成对话框的形式弹出来了。或者
Xml代码
android:theme=”@android:style/Theme.Translucent”
android:theme=”@android:style/Theme.Translucent”
就变成半透明的,[友情提示-.-]类似的这样的activity的属性能够在android.R.styleable
类的AndroidManifestActivity
方法中看到,AndroidManifest.xml中全部元素的属性的介绍都能够參考这个类android.R.styleable
上面说的是属性名称。详细有什么值是在android.R.style中能够看到。比方这个”@android:style/Theme.Dialog”
就相应于android.R.style.Theme_Dialog ,(‘_’换成’.’ < --注意:这个是文章内容不是笑脸)就能够用在描写叙述文件中了,找找类定义和描写叙述文件里的相应关系就都明确了。
11、你后台的Activity被系统回收怎么办:onSaveInstanceState
当你的程序中某一个ActivityA
在执行时中,主动或被动地执行还有一个新的ActivityB
这个时候A会运行
Java代码
public
void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("id", 1234567890);
}
B 完毕以后又会来找A,
这个时候就有两种情况,一种是A被回收。一种是没有被回收。被回
收的A就要又一次调用onCreate()方法。不同于直接启动的是这回onCreate()里是带上參数
savedInstanceState。没被收回的就还是onResume就好了。
savedInstanceState是一个Bundle对象,你基本上能够把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,假设正常启动onCreate就不会有它,所以用的时候要推断一下是否为空。
Java代码
if(savedInstanceState != null){
long id =savedInstanceState.getLong("id");
}
就像官方的Notepad教程里的情况,你正在编辑某一个note。突然被中断,那么就把这个note的id记住,再起来的时候就能够依据这个id去把那个note取出来。程序就完整一些。这也是看你的应用需不须要保存什么,比方你的界面就是读取一个列表,那就不须要特殊记住什么,哦。没准你须要记住滚动栏的位置...
12、调用与被调用:我们的通信使者Intent
要说Intent了。Intent就是这个这个意图。应用程序间Intent进行交流,打个电话啦,来个
电话啦都会发Intent,
这个是Android架构的松耦合的精髓部分,大大提高了组件的复用性,比方你要在你的应用程序中点击button,给某人打电话。非常easy啊,看下代码先:
Java代码
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" +number));
startActivity(intent);
扔出这样一个意图。系统看到了你的意图就唤醒了电话拨号程序,打出来电话。
什么读联系人。发短信啊。邮件啊。统统仅仅须要扔出intent就好了,这个部分设计地确实非常好啊。
那Intent通过什么来告诉系统须要谁来接受他呢?
通常使用Intent有两种方法,第一种是直接说明须要哪一个类来接收代码例如以下:
Java代码
Intent intent = new Intent(this,MyActivity.class);
intent.getExtras().putString("id","1");
tartActivity(intent);
第一种方式非常明显。直接指定了MyActivity为接受者,而且传了一些数据给MyActivity。在MyActivity里能够用getIntent()来的到这个intent和数据。
另外一种就须要先看一下AndroidMenifest中的intentfilter的配置了
Xml代码
< action
android:name="android.intent.action.VIEW"
/>
< action
android:value="android.intent.action.EDIT"
/>
< action
android:value="android.intent.action.PICK"
/>
< category
android:name="android.intent.category.DEFAULT"
/>
< data
android:mimeType="vnd.android.cursor.dir/vnd.google.note"
/>
这里面配置用到了action,data, category这些东西,那么聪明的你一定想到intent里也会有这些东西,然后一匹配不就找到接收者了吗?
action事实上就是一个意图的字符串名称。
上面这段intent-filter的配置文件说明了这个Activity能够接受不同的Action,当然对应的程序逻辑也不一样咯,提一下那个
mimeType,他是在ContentProvider里定义的。你要是自己实现一个ContentProvider就知道了,必须指定
mimeType才干让数据被别人使用。
不知道原理说明确没,总结一句,就是你调用别的界面不是直接new那个界面,而是通过扔出一个intent。让系统帮你去调用那个界面,这样就多么松藕合啊。并且符合了生命周期被系统管理的原则。
想知道category都有啥,Android为你预先定制好的action都有啥等等,请亲自訪问官方链接Intent
ps:想知道怎么调用系统应用程序的同学,能够细致看一下你的logcat,每次执行一个程序的时候是不是有一些信息比方:
Starting activity: Intent {action=android.intent.action.MAINcategories={android.intent.category.LAUNCHER}flags=0x10200000comp={com.android.camera/com.android.camera.GalleryPicker} }
再对比一下Intent的一些set方法,就知道怎么调用咯,希望你喜欢:)
13. 怎样退出Activity?怎样安全退出已调用多个Activity的Application?
对于单一Activity的应用来说,退出非常easy。直接finish()就可以。
当然,也能够用killProcess()和System.exit()这个方案。
可是。对于多Activity的应用来说,在打开多个Activity后。假设想在最后打开的Activity直接退出。上边的方法都是没实用的,由于上边的方法都是结束一个Activity而已。
当然。网上也有人说能够。
就好像有人问,在应用里怎样捕获Home键。有人就会说用keyCode比較KEYCODE_HOME就可以。而其实假设不改动framework,根本不可能做到这一点一样。
所以,不妨自己亲自试一下。
那么,有没有办法直接退出整个应用呢?
在2.1之前,能够使用ActivityManager的restartPackage方法。
它能够直接结束整个应用。
在使用时须要权限android.permission.RESTART_PACKAGES。
注意不要被它的名字迷惑。
但是,在2.2,这种方法失效了。
在2.2加入了一个新的方法。killBackgroundProcesses()。须要权限
android.permission.KILL_BACKGROUND_PROCESSES。
可惜的是。它和2.2的restartPackage一样,根本起不到应有的效果。
另外另一个方法,就是系统自带的应用程序管理里,强制结束程序的方法,forceStopPackage()。
它须要权限android.permission.FORCE_STOP_PACKAGES。
而且须要加入android:sharedUserId=”android.uid.system”属性
相同可惜的是。该方法是非公开的,他仅仅能执行在系统进程。第三方程序无法调用。
由于须要在Android.mk中加入LOCAL_CERTIFICATE := platform。
而Android.mk是用于在Android源代码下编译程序用的。
从以上能够看出,在2.2,没有办法直接结束一个应用,而仅仅能用自己的办法间接办到。
现提供几个方法,供參考:
1、抛异常强制退出:
该方法通过抛异常。使程序ForceClose。
验证能够。可是,须要解决的问题是,怎样使程序结束掉。而不弹出Force Close的窗体。
2、记录打开的Activity:
每打开一个Activity。就记录下来。
在须要退出时。关闭每个Activity就可以。
3、发送特定广播:
在须要结束应用时,发送一个特定的广播,每一个Activity收到广播后,关闭就可以。
4、递归退出
在打开新的Activity时使用startActivityForResult,然后自己加标志。在onActivityResult中处理,递归关闭。
除了第一个。都是想办法把每个Activity都结束掉,间接达到目的。
可是这样做相同不完美。
你会发现,假设自己的应用程序对每个Activity都设置了nosensor。在两个Activity结束的间隙,sensor可能有效了。
但至少,我们的目的达到了,并且没有影响用户使用。
为了编程方便,最好定义一个Activity基类,处理这些共通问题。
摘自:http://blog.csdn.net/debug2/archive/2011/02/18/6193644.aspx
14. 请介绍下Android中经常使用的五种布局。
1、 LinearLayout –
线性布局。
orientation – 容器内元素的排列方式。vertical:
子元素们垂直排列;horizontal:
子元素们水平排列
gravity – 内容的排列形式。经常使用的有 top, bottom, left, right, center
等
2、 AbsoluteLayout –
绝对布局。
layout_x – x 坐标。以左上角为顶点
layout_y – y 坐标。以左上角为顶点
3、 TableLayout –
表格式布局
表格布局主要以行列的形式来管理子控件,当中每一行即一个TableRow对象,每一个TableRow对象能够加入子控件,而且每加入一个空间即相当于加入了一列
4、 RelativeLayout –
相对布局。
layout_centerInParent – 将当前元素放置到其容器内的水平方向和垂直方向的中央位置(类似的属性有:layout_centerHorizontal, layout_alignParentLeft等)
layout_marginLeft – 设置当前元素相对于其容器的左側边缘的距离
layout_below – 放置当前元素到指定的元素的以下
layout_alignRight – 当前元素与指定的元素右对齐
5、 FrameLayout –
层叠布局。以左上角为起点。将 FrameLayout
内的元素一层覆盖一层地显示,在帧布局中,先加入的图片会被后加入的图片覆盖。
摘自:http://javalover00000.javaeye.com/blog/851266
15. 请介绍下Android的数据存储方式。
Android提供了5种方式存储数据:
1、使用SharedPreferences存储数据;
2、文件存储数据;
3、SQLite数据库存储数据;
4、使用ContentProvider存储数据;
5、网络存储数据;
Android 中的数据存储都是私有的,其它应用程序都是无法訪问的,除非通过ContentResolver获取其它程序共享的数据。
摘自:http://www.moandroid.com/?p=319
16. 请介绍下ContentProvider是怎样实现数据共享的。
一个程序能够通过实现一个Contentprovider的抽象接口将自己的数据全然暴露出去,并且Content providers是以类似数据库中表的方式将数据暴露。Content
providers存储和检索数据。通过它能够让全部的应用程序訪问到。这也是应用程序之间唯一共享数据的方法。要想使应用程序的数据公开化,可通过2种方法:创建一个属于你自己的Content
provider或者将你的数据加入到一个已经存在的Content provider中,前提是有同样数据类型而且有写入Content provider的权限。
怎样通过一套标准及统一的接口获取其它应用程序暴露的数据?Android提供了ContentResolver,外界的程序能够通过ContentResolver接口訪问ContentProvider提供的数据。
參考:http://www.moandroid.com/?p=319
17. 怎样启用Service,怎样停用Service。
1.第一种是通过调用Context.startService()启动,调用Context.stopService()结束。startService()能够传递參数给Service
2.另外一种方式是通过调用Context.bindService()启动,调用Context.unbindservice()结束,还能够通过ServiceConnection訪问Service。
在Service每一次的开启关闭过程中。仅仅有onStart可被多次调用(通过多次startService调用),其它onCreate,onBind,onUnbind。onDestory在一个生命周期中仅仅能被调用一次。
參考:http://www.cnblogs.com/feisky/archive/2010/06/14/1758336.html
18. 注冊广播有几种方式。这些方式有何优缺点?请谈谈Android引入广播机制的用意。
android中,不同进程之间传递信息要用到广播,能够有两种方式来实现。
第一种方式:在Manifest.xml中注冊广播。是一种比較推荐的方法,由于它不须要手动注销广播(假设广播未注销,程序退出时可能会出错)。
详细实如今Manifest的application中加入:
上面两个android:name各自是广播名和广播的动作(这里的动作是表示系统启动完毕),假设要自己发送一个广播,在代码中为:
Intent i = new Intent(“android.intent.action.BOOT_COMPLETED”);
sendBroadcast(i);
这样,广播就发出去了。然后是接收。
接收能够新建一个类。继承至BroadcastReceiver。也能够建一个BroadcastReceiver的实例,然后得写onReceive方法,实现例如以下:
protected BroadcastReceiver mEvtReceiver = newBroadcastReceiver() {
@Override
public void onReceive(Context context, Intentintent) {
String action = intent.getAction();
if(action.equals(“android.intent.action.BOOT_COMPLETED”)) {
//Do something
}
}
};
另外一种方式,直接在代码中实现。但须要手动注冊注销。实现例如以下:
IntentFilter filter = new IntentFilter();
filter.addAction(“android.intent.action.BOOT_COMPLETED”);
registerReceiver(mEvtReceiver, filter); //这时注冊了一个recevier ,名为mEvtReceiver,然后相同用上面的方法以重写onReceiver,
最后在程序的onDestroy中要注销广播。实现例如以下:
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mPlayerEvtReceiver);
}
Android系统中的广播是广泛用于应用程序之间通信的一种手段,它类似于事件处理机制,不同的地方就是广播的处理是系统级别的事件处理过程(一般事件处理是控件级别的)。在此过程中仍然是离不开Intent对象,理解广播事件的处理过程。灵活运用广播处理机制,在关键之处往往能实现特别的效果,
在Android
中假设要发送一个广播必须使用sendBroadCast
向系统发送对其感兴趣的广播接收器中。
使用广播必需要有一个intent对象必设置其action动作对象
使用广播必须在配置文件里显式的指明该广播对象
每次接收广播都会又一次生成一个接收广播的对象
在BroadCast
中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity
或者 Service
去处理
转自:http://www.dengdeng.name/u/deng/archives/2010/92.html
http://www.cnblogs.com/TerryBlog/archive/2010/08/16/1801016.html
19. 请解释下在单线程模型中Message、Handler、Message
Queue、Looper之间的关系。
简单的说,Handler获取当前线程中的looper对象。looper用来从存放Message的MessageQueue中取出Message。再有Handler进行Message的分发和处理
參见:http://hi.baidu.com/%C1%F7%C0?%BB%D0%DD/blog/item/4e576b7c58d742360cd7dac9.html
http://blog.csdn.net/xuxinyl/archive/2010/12/25/6097560.aspx
20. AIDL的全称是什么?
怎样工作?
能处理哪些类型的数据?
AIDL全称Android Interface Definition Language(AndRoid接口描写叙述语言)是一种借口描写叙述语言;
编译器能够通过aidl文件生成一段代码。通过预先定义的接口达到两个进程内部通信进程跨界对象訪问的目的.AIDL的IPC的机制和COM或CORBA类似,
是基于接口的,但它是轻量级的。它使用代理类在client和实现层间传递值.
假设要使用AIDL,
须要完毕2件事情: 1.
引入AIDL的相关类.; 2.
调用aidl产生的class.理论上,
參数能够传递基本数据类型和String,
还有就是Bundle的派生类,
只是在Eclipse中,眼下的ADT不支持Bundle做为參数,
详细实现过程例如以下:
1、创建AIDL文件,
在这个文件中面定义接口,
该接口定义了可供client訪问的方法和属性。
2、编译AIDL文件,
用Ant的话,
可能须要手动,
使用Eclipse plugin的话,能够依据adil文件自己主动生产java文件并编译,
不须要人为介入.
3、在Java文件里,
实现AIDL中定义的接口.
编译器会依据AIDL接口,
产生一个JAVA接口。这个接口有一个名为Stub的内部抽象类,它继承扩展了接口并实现了远程调用须要的几个方法。接下来就须要自己去实现自己定义的几个接口了.
4、向client提供接口ITaskBinder,
假设写的是service。扩展该Service并重载onBind
()方法来返回一个实现上述接口的类的实例。
5、在server端回调client的函数.
前提是当client获取的IBinder接口的时候,要去注冊回调函数,
仅仅有这样,
server端才知道该调用那些函数
AIDL语法非常easy,能够用来声明一个带一个或多个方法的接口,也能够传递參数和返回值。
因为远程调用的须要,
这些參数和返回值并非不论什么类型.以下是些AIDL支持的数据类型:
1. 不须要import声明的简单Java编程语言类型(int,boolean等)
2. String, CharSequence不须要特殊声明
3. List, Map和Parcelables类型,
这些类型内所包括的数据成员也仅仅能是简单数据类型, String等其它比支持的类型.
(另外:
我没尝试Parcelables,
在Eclipse+ADT下编译只是,
也许以后会有所支持).
实现接口时有几个原则:
.抛出的异常不要返回给调用者.
跨进程抛异常处理是不可取的.
.IPC调用是同步的。假设你知道一个IPC服务须要超过几毫秒的时间才干完毕地话,你应该避免在Activity的主线程中调用。也就是IPC调用会挂起应用程序导致界面失去响应.
这样的情况应该考虑单起一个线程来处理.
.不能在AIDL接口中声明静态属性。
IPC的调用步骤:
1. 声明一个接口类型的变量。该接口类型在.aidl文件里定义。
2. 实现ServiceConnection。
3. 调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递.
4. 在ServiceConnection.onServiceConnected()实现中。你会接收一个IBinder实例(被调用的Service).
调用
YourInterfaceName.Stub.asInterface((IBinder)service)将參数转换为YourInterface类型。
5. 调用接口中定义的方法。你总要检測到DeadObjectException异常。该异常在连接断开时被抛出。它仅仅会被远程方法抛出。
6. 断开连接,调用接口实例中的ApplicationContext.unbindService()
參考:http://buaadallas.blog.51cto.com/399160/372090
21. 请解释下Android程序执行时权限与文件系统权限的差别。
apk程序是执行在虚拟机上的,相应的是Android独特的权限机制。仅仅有体现到文件系统上时才使用linux的权限设置。
android系统有的权限是基于签名的。
详细參见:http://blog.csdn.net/Zengyangtech/archive/2010/07/20/5749999.aspx
22. 系统上安装了多种浏览器。是否能指定某浏览器訪问指定页面?请说明原由。
通过直接发送Uri把參数带过去。或者通过manifest里的intentfilter里的data属性
23. 有一个一维整型数组int[]data保存的是一张宽为width,高为height的图片像素值信息。请写一个算法。将该图片全部的白色不透明(0xffffffff)像素点的透明度调整为50%。
24、什么是ANR
怎样避免它?
答:ANR:Application Not Responding,五秒在Android中。活动管理器和窗体管理器这两个系统服务负责监视应用程序的响应。当出现下列情况时。Android就会显示ANR对话框了:
对输入事件(如按键、触摸屏事件)的响应超过5秒
意向接受器(intentReceiver)超过10秒钟仍未运行完成
Android应用程序全然执行在一个独立的线程中(比如main)。这就意味着。不论什么在主线程中执行的,须要消耗大量时间的操作都会引发ANR。
由于此时。你的应用程序已经没有机会去响应输入事件和意向广播(Intent
broadcast)。
因此,不论什么执行在主线程中的方法。都要尽可能的仅仅做少量的工作。
特别是活动生命周期中的重要方法如onCreate()和 onResume()等更应如此。潜在的比較耗时的操作,如訪问网络和数据库;或者是开销非常大的计算。比方改变位图的大小,须要在一个单独的子线程中完毕 (或者是使用异步请求,如数据库操作)。
但这并不意味着你的主线程须要进入堵塞状态已等待子线程结束 — 也不须要调用Therad.wait()或者Thread.sleep()方法。取而代之的是,主线程为子线程提供一个句柄(Handler),让子线程在即将结束的时候调用它(xing:可以參看Snake的样例,这样的方法与曾经我们所接触的有所不同)。
使用这样的方法涉及你的应用程序,可以保证你的程序对输入保持良好的响应。从而避免由于输入事件超过5秒钟不被处理而产生的ANR。这样的实践须要应用到全部显示用户界面的线程,由于他们都面临着相同的超时问题。
25、什么情况会导致Force Close ?怎样避免?是否能捕获导致其的异常?
答:一般像空指针啊,能够看起logcat,然后相应到程序中来解决错误
26、Android本身的api并未声明会抛出异常。则其在执行时有无可能抛出runtime异常,你遇到过吗?诺有的话会导致什么问题?怎样解决?
27、简要解释一下activity、 intent
、intent filter、service、Broadcase、BroadcaseReceiver
答:一个activity呈现了一个用户能够操作的可视化用户界面
一个service不包括可见的用户界面,而是在后台无限地执行
能够连接到一个正在执行的服务中,连接后,能够通过服务中暴露出来的借口与其进行通信
一个broadcastreceiver是一个接收广播消息并作出回应的component。broadcast
receiver没有界面
intent:content provider在接收到ContentResolver的请求时被激活。
activity, service和broadcast receiver是被称为intents的异步消息激活的。
一个intent是一个Intent对象。它保存了消息的内容。对于activity和service来说。它指定了请求的操作名称和待操作数据的URI
Intent对象能够显式的指定一个目标component。假设这种话,android会找到这个component(基于
manifest文件里的声明)并激活它。但假设一个目标不是显式指定的,android必须找到响应intent的最佳component。
它是通过将Intent对象和目标的intent filter相比較来完毕这一工作的。
一个component的intent filter告诉android该component能处理的intent。
intent
filter也是在manifest文件里声明的。
28、IntentService有何长处?
答:IntentService的优点
* Acitivity的进程,当处理Intent的时候,会产生一个相应的Service
* Android的进程处理器如今会尽可能的不kill掉你
* 很easy使用
29、横竖屏切换时候activity的生命周期?
1、不设置Activity的android:configChanges时,切屏会又一次调用各个生命周期,切横屏时会运行一次,切竖屏时会运行两次
2、设置Activity的android:configChanges=”orientation”时。切屏还是会又一次调用各个生命周期,切横、竖屏时仅仅会运行一次
3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会又一次调用各个生命周期,仅仅会运行onConfigurationChanged方法
30. 怎样将SQLite数据库(dictionary.db文件)与apk文件一起公布?
解答:能够将dictionary.db文件拷贝到Eclipse Androidproject中的res
aw文件夹中。全部在res aw文件夹中的文件不会被压缩。这样能够直接提取该文件夹中的文件。能够将dictionary.db文件拷贝到res
aw文件夹中
31. 怎样将打开res aw文件夹中的数据库文件?
解答:在Android中不能直接打开res aw文件夹中的数据库文件,而须要在程序第一次启动时将该文件拷贝到手机内存或SD卡的某个文件夹中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res
aw文件夹中资源的 InputStream对象。然后将该InputStream对象中的数据写入其它的文件夹中对应文件里。在Android
SDK中能够使用SQLiteDatabase.openOrCreateDatabase方法来打开随意文件夹中的SQLite数据库文件。
32. Android引入广播机制的用意?
答:a:从MVC的角度考虑(应用程序内)
事实上回答这个问题的时候还能够这样问,android为什么要有那4大组件,如今的移动开发模型基本上也是照搬的web那一套MVC架构。仅仅只是是改了点嫁妆而已。android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构。它们之间有时候是一种相互依存的关系。有时候又是一种补充关系,引入广播机制能够方便几大组件的信息和数据交互。
b:程序间互通消息(比如在自己的应用程序内监听系统来电)
c:效率上(參考UDP的广播协议在局域网的方便性)
d:设计模式上(反转控制的一种应用,类似监听者模式)
转自:http://www.cnmsdn.com/html/201101/1295431222ID9251.html
33、android
的优势与不足
Android平台手机 5大优势:
一、开放性
在优势方面,Android平台首先就是其开发性,开发的平台同意不论什么移动终端厂商增加到Android联盟中来。显著的开放性能够使其拥有很多其它的开发人员。随着用户和应用的日益丰富。一个崭新的平台也将非常快走向成熟
开发性对于Android的发展而言,有利于积累人气,这里的人气包含消费者和厂商。而对于消费者来讲,随大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来。消费者将能够用更低的价位购得心仪的手机。
二、挣脱运营商的束缚
在过去非常长的一段时间,特别是在欧美地区。手机应用往往受到运营商制约,使用什么功能接入什么网络。差点儿都受到运营商的控制。从去年iPhone
上市。用户能够更加方便地连接网络,运营商的制约降低。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机任意接入网络已不是运营商口中的笑谈。当你能够通过手机IM软件方便地进行即时聊天时。再回忆不久前天价的彩信和图铃下载业务,是不是像噩梦一样?
互联网巨头Google推动的Android终端天生就有网络特色,将让用户离互联网更近。
三、丰富的硬件选择
这一点还是与Android平台的开放性相关。因为Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。
功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容,好比你从诺基亚 Symbian风格手机一下改用苹果 iPhone ,同一时候还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是能够方便地转移,是不是很方便呢?
四、不受不论什么限制的开发商
Android平台提供给第三方开发商一个十分宽泛、自由的环境。不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性。血腥、暴力、情色方面的程序和游戏如可控制正是留给Android难题之中的一个。
五、无缝结合的Google应用
现在叱诧互联网的Google已经走过10年度历史,从搜索巨人到全面的互联网渗透,Google服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的Google服务。
再说Android的5大不足:
一、安全和隐私
因为手机与互联网的紧密联系,个人隐私非常难得到保守。
除了上网过程中经意或不经意留下的个人足迹。Google这个巨人也时时站在你的身后,洞穿一切,因此,互联网的深入将会带来新一轮的隐私危机。
二、首先开卖Android手机的不是最大运营商
众所周知,T-Mobile在23日。于美国纽约公布了Android首款手机G1。可是在北美市场,最大的两家运营商乃AT&T和Verizon。而眼下所知取得Android手机销售权的仅有
T-Mobile和Sprint,当中T-Mobile的3G网络相对于其它三家也要逊色不少,因此,用户能够买账购买G1。是否能体验到最佳的3G网络服务则要另当别论了。
三、运营商仍然可以影响到Android手机
在国内市场,不少用户对购得移动定制机不满,感觉所购的手机被人涂画了广告一般。这种情况在国外市场相同出现。
Android手机的还有一发售运营商Sprint就将在其机型中内置其手机商店程序。
四、同类机型用户降低
在不少手机论坛都会有针对某一型号的子论坛。对一款手机的使用心得交流。并分享软件资源。而对于Android平台手机,因为厂商丰富,产品类型多样。这样使用同一款机型的用户越来越少,缺少统一机型的程序强化。
举个稍显不当的样例。如今山寨机泛滥,品种各异,就非常少有专门针对某个型号山寨机的讨论和群组,除了哪些功能异常抢眼、颇受追捧的机型以外。
五、过分依赖开发商缺少标准配置
在使用PC端的Windows Xp系统的时候,都会内置微软Windows
Media Player这样一个浏览器程序。用户能够选择很多其它样的播放器,如Realplay或暴风影音等。但入手開始使用默认的程序相同能够应付多样的须要。在 Android平台中,因为其开放性,软件很多其它依赖第三方厂商,比方Android系统的SDK中就没有内置音乐播放器,所有依赖第三方开发,缺少了产品的统一性。
34、android
中有哪几种解析xml的类?官方推荐哪种?
以及它们的原理和差别。
XML解析主要有三种方式,SAX、DOM、PULL。常规在PC上开发我们使用Dom相对轻松些,但一些性能敏感的数据库或手机上还是主要採用SAX方式,SAX读取是单向的,长处:不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是非常方便。而DOM方式会把整个XML文件载入到内存中去,这里Android开发网提醒大家该方法在查找方面能够和XPath非常好的结合假设数据量不是非常大推荐使用,而PULL经常常使用在J2ME对于节点处理比較好。类似SAX方式。相同非常节省内存。在J2ME中我们经常使用的KXML库来解析。
具体情况请參考http://blog.csdn.net/Android_Tutor/archive/2010/09/17/5890835.aspx
http://www.linuxidc.com/Linux/2010-11/29768.htm
http://littlefermat.blog.163.com/blog/static/59771167200981853037951/
35、DDMS和TraceView的差别?
DDMS是一个程序运行查看器,在里面能够看见线程和堆栈等信息。TraceView是程序性能分析器
36、Activity被回收了怎么办?
仅仅有另启用了
37、java中怎样引用本地语言
能够用JNI接口
38、谈谈Android的IPC机制
IPC是内部进程通信的简称,是共享”命名管道”的资源。Android中的IPC机制是为了让Activity和Service之间能够随时的进行交互,故在Android中该机制,仅仅适用于Activity和Service之间的通信,类似于远程方法调用。类似于C/S模式的訪问。
通过定义AIDL接口文件来定义IPC接口。
Servier端实现IPC接口,Client端调用IPC接口本地代理。
39、NDK是什么
NDK是一些列工具的集合,
NDK提供了一系列的工具,帮助开发人员迅速的开发C/C++的动态库。并能自己主动将so和java
应用打成apk包。
NDK集成了交叉编译器。并提供了对应的mk文件和隔离cpu、平台等的差异,开发者仅仅需简单的改动mk文件就能够创建出so
40 描写叙述一下android的系统架构
android系统架构分从下往上为linux
内核层、执行库、应用程序框架层、和应用程序层
linuxkernel:负责硬件的驱动程序、网络、电源、系统安全以及内存管理等功能。
libraries和 androidruntime:libraries:即c/c++函数库部分,大多数都是开放源码的函数库。比如webkit。该函数库负责
android网页浏览器的执行,比如标准的c函数库libc、openssl、sqlite等。当然也包含支持游戏开发2dsgl和
3dopengles,在多媒体方面有mediaframework框架来支持各种影音和图形文件的播放与显示,比如mpeg4、h.264、mp3、
aac、amr、jpg和png等众多的多媒体文件格式。
android的runtime负责解释和运行生成的dalvik格式的字节码。
applicationframework(应用软件架构),java应用程序开发者主要是使用该层封装好的api进行高速开发。
applications:该层是java的应用程序层,android内置的googlemaps、e-mail、即时通信工具、浏览器、mp3播放器等处于该层,java开发者开发的程序也处于该层,并且和内置的应用程序具有平等的位置。能够调用内置的应用程序,也能够替换内置的应用程序。
上面的四个层次,下层为上层服务,上层须要下层的支持。调用下层的服务,这样的严格分层的方式带来的极大的稳定性、灵活性和可扩展性,使得不同层的开发者能够依照规范专心特定层的开发。
android应用程序使用框架的api并在框架下执行,这就带来了程序开发的高度一致性,还有一方面也告诉我们,要想写出优质高效的程序就必须对整个 applicationframework进行很深入的理解。精通applicationframework,你就行真正的理解android的设计和执行机制,也就更可以驾驭整个应用层的开发。
标签:内存管理 依据 系统进程 boot destory horizon 颇受 状态 awr
原文地址:http://www.cnblogs.com/cxchanpin/p/7294903.html