android面试大全Word格式文档下载.docx
《android面试大全Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《android面试大全Word格式文档下载.docx(24页珍藏版)》请在冰豆网上搜索。
protectedvoidonStart();
protectedvoidonResume();
protectedvoidonPause();
protectedvoidonStop();
protectedvoidonDestroy();
}
你自己写的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]来处理多线程和界面交互的问题。
这个我后面会讲一些,最近因为这些东西头已经很大了,等我理清思绪再跟大家分享。
二让Activity变成一个窗口:
Activity属性设定
讲点轻松的吧,可能有人希望做出来的应用程序是一个漂浮在手机主界面的东西,那么很
简单你只需要设置一下Activity的主题就可以了在AndroidManifest.xml中定义Activity的
地方一句话:
Xml代码
android:
theme="
@android:
style/Theme.Dialog"
android:
这就使你的应用程序变成对话框的形式弹出来了,或者
style/Theme.Translucent"
就变成半透明的,[友情提示-.-]类似的这种activity的属性可以在android.R.styleable类的AndroidManifestActivity方法中看到,AndroidManifest.xml中所有元素的属性的介绍都可以参考这个类android.R.styleable
上面说的是属性名称,具体有什么值是在android.R.style中可以看到,比如这个"
就对应于android.R.style.Theme_Dialog,('
_'
换成'
.'
<
--注意:
这个是文章内容不是笑脸)就可以用在描述文件中了,找找类定义和描述文件中的对应关系就都明白了。
三你后台的Activity被系统回收怎么办:
onSaveInstanceState
当你的程序中某一个ActivityA在运行时中,主动或被动地运行另一个新的ActivityB
这个时候A会执行
Java代码
voidonSaveInstanceState(BundleoutState){
super.onSaveInstanceState(outState);
outState.putLong("
id"
1234567890);
publicvoidonSaveInstanceState(BundleoutState){
}
B完成以后又会来找A,这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回
收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数
savedInstanceState,没被收回的就还是onResume就好了。
savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。
在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。
if(savedInstanceState!
=null){
longid=savedInstanceState.getLong("
);
就像官方的Notepad教程里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整一些。
这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不需要特殊记住什么,哦,没准你需要记住滚动条的位置...
四调用与被调用:
我们的通信使者Intent
要说Intent了,Intent就是这个这个意图,应用程序间Intent进行交流,打个电话啦,来个
电话啦都会发Intent,这个是Android架构的松耦合的精髓部分,大大提高了组件的复用性,比如你要在你的应用程序中点击按钮,给某人打电话,很简单啊,看下代码先:
Intentintent=newIntent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("
tel:
"
+number));
startActivity(intent);
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("
startActivity(intent);
扔出这样一个意图,系统看到了你的意图就唤醒了电话拨号程序,打出来电话。
什么读联系人,发短信啊,邮件啊,统统只需要扔出intent就好了,这个部分设计地确实很好啊。
那Intent通过什么来告诉系统需要谁来接受他呢?
通常使用Intent有两种方法,第一种是直接说明需要哪一个类来接收代码如下:
Intentintent=newIntent(this,MyActivity.class);
intent.getExtras().putString("
"
1"
tartActivity(intent);
第一种方式很明显,直接指定了MyActivity为接受者,并且传了一些数据给MyActivity,在MyActivity里可以用getIntent()来的到这个intent和数据。
第二种就需要先看一下AndroidMenifest中的intentfilter的配置了
<
intent-filter>
action
name="
android.intent.action.VIEW"
/>
value="
android.intent.action.EDIT"
android.intent.action.PICK"
category
android.intent.category.DEFAULT"
data
mimeType="
vnd.android.cursor.dir/vnd.google.note"
/intent-filter>
actionandroid:
/>
categoryandroid:
dataandroid:
这里面配置用到了action,data,category这些东西,那么聪明的你一定想到intent里也会有这些东西,然后一匹配不就找到接收者了吗?
action其实就是一个意图的字符串名称。
上面这段intent-filter的配置文件说明了这个Activity可以接受不同的Action,当然相应的程序逻辑也不一样咯,提一下那个mimeType,他是在ContentProvider里定义的,你要是自己实现一个ContentProvider就知道了,必须指定mimeType才能让数据被别人使用。
如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
∙当你的程序中某一个Activity
A在运行时,主动或被动地运行另一个新的Activity
B,这个时候A会执行onSaveInstanceState()。
B完成以后又会来找A,这个时候就有两种情况:
一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;
而没被收回的就直接执行onResume(),跳过onCreate()了。
请介绍下Android中常用的五种布局
∙FrameLayout(框架布局),LinearLayout
(线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)
IntentService有何优点?
IntentService的好处
Acitivity的进程,当处理Intent的时候,会产生一个对应的Service
Android的进程处理器现在会尽可能的不kill掉你
非常容易使用
日历中IntentService的应用
publicclassDismissAllAlarmsServiceextendsIntentService{
@OverridepublicvoidonHandleIntent(IntentunusedIntent){
ContentResolverresolver=getContentResolver();
...
resolver.update(uri,values,selection,null);
inAlertReceiverextendsBroadcastReceiver,onReceive():
(mainthread)
Intentintent=newIntent(context,DismissAllAlarmsService.class);
context.startService(intent);
横竖屏切换时候Activity的生命周期。
1、不设置Activity的android:
configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:
configChanges="
orientation"
时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:
orientation|keyboardHidden"
时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
介绍下Android的数据存储方式。
一.SharedPreferences方式
二.文件存储方式
三.SQLite数据库方式
四.内容提供器(Content
provider)方式
五.网络存储方式
什么是ANR如何避免它?
ANR定义
在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:
ApplicationNotResponding)对话框。
用户可以选择让程序继续运行,但是,他们在使用你的应用程序时,并不希望每次都要处理这个对话框。
因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。
如何来避免:
考虑上面的ANR定义,让我们来研究一下为什么它会在Android应用程序里发生和如何最佳构建应用程序来避免ANR。
Android应用程序通常是运行在一个单独的线程(例如,main)里。
这意味着你的应用程序所做的事情如果在主线程里占用了太长的时间的话,就会引发ANR对话框,因为你的应用程序并没有给自己机会来处理输入事件或者Intent广播。
因此,运行在主线程里的任何方法都尽可能少做事情。
特别是,Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。
潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据库操作为例,通过异步请求的方式)来完成。
然而,不是说你的主线程阻塞在那里等待子线程的完成——也不是调用Thread.wait()或是Thread.sleep()。
替代的方法是,主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。
以这种方式设计你的应用程序,将能保证你的主线程保持对输入的响应性并能避免由于5秒输入事件的超时引发的ANR对话框。
这种做法应该在其它显示UI的线程里效仿,因为它们都受相同的超时影响。
IntentReceiver执行时间的特殊限制意味着它应该做:
在后台里做小的、琐碎的工作如保存设定或者注册一个Notification。
和在主线程里调用的其它方法一样,应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。
但不再是在子线程里做这些任务(因为BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个Service。
顺便提及一句,你也应该避免在IntentReceiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。
如果你的应用程序在响应Intent广播时需要向用户展示什么,你应该使用NotificationManager来实现。
一般来说,在应用程序里,100到200ms是用户能感知阻滞的时间阈值。
因此,这里有一些额外的技巧来避免ANR,并有助于让你的应用程序看起来有响应性。
如果你的应用程序为响应用户输入正在后台工作的话,可以显示工作的进度(ProgressBar和ProgressDialog对这种情况来说很有用)。
特别是游戏,在子线程里做移动的计算。
如果你的应用程序有一个耗时的初始化过程的话,考虑可以显示一个SplashScreen或者快速显示主画面并异步来填充这些信息。
在这两种情况下,你都应该显示正在进行的进度,以免用户认为应用程序被冻结了。
Android系统中GC什么情况下会出现内存泄露呢?
∙
(一)
查询数据库没有关闭游标
描述:
程序中经常会进行查询数据库的操作,但是经常会有使用完毕Cursor后没有关闭的情况。
如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险。
(二)
构造Adapter时,没有使用缓存的
convertView
(三)Bitmap对象不在使用时调用recycle()释放内存
(四)
释放对象的引用
简要解释一下activity、intent、intentfilter、service、Broadcast、BroadcaseReceiver
Activity
Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之中,Activity具有自己的生命周期(由系统控制生命周期,程序无法改变,但可以用onSaveInstanceState保存其状态)。
对于Activity,关键是其生命周期的把握(如那张经典的生命周期图=.=),其次就是状态的保存和恢复(onSaveInstanceState
onRestoreInstanceState),以及Activity之间的跳转和数据传输(intent)。
Intent
Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。
Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。
因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
在SDK中给出了Intent作用的表现形式为:
·
通过Context.startActivity()orActivity.startActivityForResult()启动一个Activity;
通过Context.startService()启动一个服务,或者通过Context.bindService()和后台服务交互;
通过广播方法(比如Context.sendBroadcast(),Context.sendOrderedBroadcast(),Context.sendStickyBroadcast())发给broadcastreceivers。
Intent属性的设置,包括以下几点:
(以下为XML中定义,当然也可以通过Intent类的方法来获取和设置)
(1)Action,也就是要执行的动作
SDk中定义了一些标准的动作,包括
onstant
Targetcom