Android教程精华摘要开发面试免费.docx
- 文档编号:4865669
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:23
- 大小:52.59KB
Android教程精华摘要开发面试免费.docx
《Android教程精华摘要开发面试免费.docx》由会员分享,可在线阅读,更多相关《Android教程精华摘要开发面试免费.docx(23页珍藏版)》请在冰豆网上搜索。
Android教程精华摘要开发面试免费
ANDROID复习摘要
1、什么是ANR如何避免它?
ANR定义
在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户
显示一个对话框,这个对话框称作应用程序无响应(ANR:
ApplicationNot
Responding)对话框。
用户可以选择让程序继续运行,但是,他们在使用你的应
用程序时,并不希望每次都要处理这个对话框。
因此,在程序里对响应性能的设
计很重要,这样,系统不会显示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对这种情况来说很有用)。
特别是游戏,在子线程里做移动的计算。
若你的应用程序有一个耗时的初始化过程的话,考虑可以显示一个Splash
Screen或者快速显示主画面并异步来填充这些信息。
在这两种情况下,你都应该
显示正在进行的进度,以免用户认为应用程序被冻结了。
本文来自CSDN博客,转载请标明出处:
2、什么情况会导致ForceClose?
如何避免?
能否捕获导致其的异常?
3、Android本身的api并未声明会抛出异常,则其在运行时有无可能抛出runtime
异常,你遇到过吗?
诺有的话会导致什么问题?
如何解决?
4、简要解释一下activity、intent、intentfilter、service、Broadcast、
BroadcaseReceiver
Activity
Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之
中,Activity具有自己的生命周期(由系统控制生命周期,程序无法改变,但可
以用onSaveInstanceState保存其状态)。
对于Activity,关键是其生命周期的把握(如那张经典的生命周期图=.=),其
次就是状态的保存和恢复(onSaveInstanceStateonRestoreInstanceState),
以及Activity之间的跳转和数据传输(intent)。
Activity中常用的函数有SetContentView()findViewById()finish()
startActivity(),其生命周期涉及的函数有:
voidonCreate(BundlesavedInstanceState)
voidonStart()
voidonRestart()
voidonResume()
voidonPause()
voidonStop()
voidonDestroy()
注意的是,Activity的使用需要在Manifest文件中添加相应的
置其属性和intent-filter。
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
Targetcomponent
Action
ACTION_CALL
activity
Initiateaphonecall.
ACTION_EDIT
activity
Displaydatafortheusertoedit.
ACTION_MAIN
activity
Startupastheinitialactivityofatask,withnodatainputandno
returnedoutput.
ACTION_SYNC
activity
Synchronizedataonaserverwithdataonthemobiledevice.
ACTION_BATTERY_LOW
broadcastreceiver
Awarningthatthebatteryislow.
ACTION_HEADSET_PLUG
broadcastreceiver
Aheadsethasbeenpluggedintothedevice,orunpluggedfromit.
ACTION_SCREEN_ON
broadcastreceiver
Thescreenhasbeenturnedon.
ACTION_TIMEZONE_CHANGED
broadcastreceiver
Thesettingforthetimezonehaschanged.
当然,也可以自定义动作(自定义的动作在使用时,需要加上包名作为前缀,如
"com.example.project.SHOW_COLOR”),并可定义相应的Activity来处理我们
的自定义动作。
(2)Data,也就是执行动作要操作的数据
Android中采用指向数据的一个URI来表示,如在联系人应用中,一个指向某联系
人的URI可能为:
content:
//contacts/1。
对于不同的动作,其URI数据的类型是
不同的(可以设置type属性指定特定类型数据),如ACTION_EDIT指定Data为文
件URI,打电话为tel:
URI,访问网络为http:
URI,而由contentprovider提供的
数据则为content:
URIs。
(3)type(数据类型),显式指定Intent的数据类型(MIME)。
一般Intent的
数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显
式指定的类型而不再进行推导。
(4)category(类别),被执行动作的附加信息。
例如LAUNCHER_CATEGORY表
示Intent的接受者应该在Launcher中作为顶级应用出现;而
ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这些动
作可以在同一块数据上执行。
还有其他的为
Constant
Meaning
CATEGORY_BROWSABLE
Thetargetactivitycanbesafelyinvokedbythebrowsertodisplay
datareferencedbyalink—forexample,animageorane-mail
message.
CATEGORY_GADGET
Theactivitycanbeembeddedinsideofanotheractivitythathosts
gadgets.
CATEGORY_HOME
Theactivitydisplaysthehomescreen,thefirstscreentheusersees
whenthedeviceisturnedonorwhentheHOMEkeyispressed.
CATEGORY_LAUNCHER
Theactivitycanbetheinitialactivityofataskandislistedin
thetop-levelapplicationlauncher.
CATEGORY_PREFERENCE
Thetargetactivityisapreferencepanel.
(5)component(组件),指定Intent的的目标组件的类名称。
通常Android会
根据Intent中包含的其它属性的信息,比如action、data/type、category进行
查找,最终找到一个与之匹配的目标组件。
但是,如果component这个属性有指
定的话,将直接使用它指定的组件,而不再执行上述查找过程。
指定了这个属性
以后,Intent的其它所有属性都是可选的。
(6)extras(附加信息),是其它所有附加信息的集合。
使用extras可以为组
件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮
件的标题、正文等保存在extras里,传给电子邮件发送组件。
理解Intent的关键之一是理解清楚Intent的两种基本用法:
一种是显式的Intent
,即在构造Intent对象时就指定接收者;另一种是隐式的Intent,即Intent的发
送者在构造Intent对象时,并不知道也不关心接收者是谁,有利于降低发送者和
接收者之间的耦合。
对于显式Intent,Android不需要去做解析,因为目标组件已经很明确,Android
需要解析的是那些隐式Intent,通过解析,将Intent映射给可以处理此Intent
的Activity、IntentReceiver或Service。
Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有
IntentFilter及其中定义的Intent,最终找到匹配的Intent。
在这个解析过程中
,Android是通过Intent的action、type、category这三个属性来进行判断的,
判断方法如下:
·如果Intent指明定了action,则目标组件的IntentFilter的action列表中就
必须包含有这个action,否则不能匹配;
·如果Intent没有提供type,系统将从data中得到数据类型。
和action一样,
目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。
·如果Intent中的数据不是content:
类型的URI,而且Intent也没有明确指定
它的type,将根据Intent中数据的scheme(比如http:
或者mailto:
)进行匹
配。
同上,Intent的scheme必须出现在目标组件的scheme列表中。
·如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类
别列表中。
比如Intent中包含了两个类别:
LAUNCHER_CATEGORY和
ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。
Intent-Filter的定义
一些属性设置的例子:
name="com.example.project.SHOW_CURRENT"/> name="android.intent.category.DEFAULT"/> mimeType="video/mpeg"android: scheme="http".../> mimeType="image/*"/> scheme="http"android: type="video/*"/> 完整的实例 name="NotesList" android: label="@string/title_notes_list"> android: name="android.intent.action.MAIN"/> android: name="android.intent.category.LAUNCHER"/> android: name="android.intent.action.VIEW"/> android: name="android.intent.action.EDIT"/> android: name="android.intent.action.PICK"/> android: name="android.intent.category.DEFAULT"/> android: mimeType="vnd.android.cursor.dir/vnd.google.note"/> android: name="android.intent.action.GET_CONTENT"/> android: name="android.intent.category.DEFAULT"/> android: mimeType="vnd.android.cursor.item/vnd.google.note"/> Intent用法实例 1.无参数Activity跳转 Intentit=newIntent(Activity.Main.this,Activity2.class); startActivity(it); 2.向下一个Activity传递数据(使用Bundle和Intent.putExtras) Intentit=newIntent(Activity.Main.this,Activity2.class); Bundlebundle=newBundle(); bundle.putString("name","ThisisfromMainActivity! "); it.putExtras(bundle);//it.putExtra(“test”,"shuju”); startActivity(it);//startActivityForResult (it,REQUEST_CODE); 对于数据的获取可以采用: Bundlebundle=getIntent().getExtras();String name=bundle.getString("name"); 3.向上一个Activity返回结果(使用setResult,针对startActivityForResult (it,REQUEST_CODE)启动的Activity) Intentintent=getIntent(); Bundlebundle2=newBundle(); bundle2.putString("name","ThisisfromShowMsg! "); intent.putExtras(bundle2); setResult(RESULT_OK,intent); 4.回调上一个Activity的结果处理函数(onActivityResult) @OverrideprotectedvoidonActivityResult(intrequestCode,int resultCode,Intentdata){ //TODOAuto-generatedmethodstub super.onActivityResult(requestCode,resultCode,data); if(requestCode==REQUEST_CODE){ if(resultCode==RESULT_CANCELED) setTitle("cancle"); elseif(resultCode==RESULT_OK){ Stringtemp=null; Bundlebundle=data.getExtras(); if(bundle! =null)temp=bundle.getString("name"); setTitle(temp); } } } 下面是转载来的其他的一些Intent用法实例(转自javaeye) 显示网页 1.Uriuri=Uri.parse(""); 2.Intentit=newIntent(Intent.ACTION_VIEW,uri); 3.startActivity(it); 显示地图 1.Uriuri=Uri.parse("geo: 38.899533,-77.036476"); 2.Intentit=newIntent(Intent.ACTION_VIEW,uri); 3.startActivity(it); 4.//其他geoURI範例 5.//geo: latitude,longitude 6.//geo: latitude,longitude? z=zoom 7.//geo: 0,0? q=my+street+address 8.//geo: 0,0? q=business+near+city 9. //google.streetview: cbll=lat,lng&cbp=1,yaw,,pitch,zoom&mz=mapZoom 路径规划 1.Uriuri=Uri.parse(" f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en"); 2.Intentit=newIntent(Intent.ACTION_VIEW,uri); 3.startActivity(it); 4.//wherestartLat,startLng,endLat,endLngarealongwith6 decimalslike: 50.123456 打电话 1.//叫出拨号程序 2.Uriuri=Uri.parse("tel: 0800000123"); 3.Intentit=newIntent(Intent.ACTION_DIAL,uri); 4.startActivity(it); 1.//直接打电话出去 2.Uriuri=Uri.parse("tel: 0800000123"); 3.Intentit=newIntent(Intent.ACTION_CALL,uri); 4.startActivity(it); 5.//用這個,要在AndroidManifest.xml中,加上 6.// 传送SMS/MMS 1.//调用短信程序 2.Intentit=newIntent(Intent.ACTION_VIEW,uri); 3.it.putExtra("sms_body","TheSMStext"); 4.it.setType("vnd.android-dir/mms-sms"); 5.startActivity(it); 1.//传送消息 2.Uriuri=Uri.parse("smsto: //0800000123"); 3.Intenti
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 教程 精华 摘要 开发 面试 免费
![提示](https://static.bdocx.com/images/bang_tan.gif)