40单Android问题

1、 Android的季雅组件是哪头,它们的意?

报:Activity:Activity是Android程序与用户交互的窗口,是Android构造块被最为中心的同样种植,它需呢维持各界面的状态,做多持久化的事情,妥善管理生命周期以及部分跳转逻辑

service:后台服务被Activity,封装有一个完整的效益逻辑实现,接受上层指令,完成相关的东西,定义好得接受之Intent提供联合同异步的接口

Content
Provider:是Android提供的老三在用数据的看方案,可以派生Content
Provider类,对外提供数据,可以像数据库一样进行精选排序,屏蔽内部数据的积存细节,向他提供联合之假说模型,大大简化上层应用,对数码的咬合提供了还有益于之路线

BroadCast
Receiver:接受平等栽或多Intent作触发事件,接受有关信息,做片简约处理,转换成为一修Notification,统一了Android的轩然大波广播模型

2、 请介绍下Android中常用的五种植布局。

经常因此五种植布局方式,分别是:FrameLayout(框架布局),LinearLayout
(线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)。

无异于、FrameLayout:所有东西依次都放在左上角,会重叠,这个布局比较简单,也只能放一点比较简单的东西。二、LinearLayout:线性布局,每一个LinearLayout里面又只是分为垂直布局(android:orientation=”vertical”)和程度布局(android:orientation=”horizontal”
)。当垂直布局时,每一样行就是一味发生一个因素,多只元素依次垂直于生;水平布局时,只来一行,每一个素依次往右侧排列。三、AbsoluteLayout:绝对布局用X,Y坐标来指定元素的职位,这种布局方式为比较简单,但是当屏幕旋转时,往往会发题目,而且大多单因素的时段,计算比累。四、RelativeLayout:相对布局可以掌握呢有一个素也参照物,来恒定的布局方式。主要性能有:相对于某一个元素android:layout_below、
   
 android:layout_toLeftOf相对于父元素的地方android:layout_alignParentLeft、android:layout_alignParentRigh;五、TableLayout:表格布局,每一个TableLayout里面来报表行TableRow,TableRow里面可以切切实实定义每一个因素。每一个布局都起友好可之法子,这五独布局元素得以并行嵌套应用,做出漂亮的界面。

3、 android中之卡通有啊几看似,它们的风味以及界别是啊  

答:两种,一栽是Tween动画、还有同种植是Frame动画。Tween动画,这种实现方式得以要视图组件移动、放大、缩小同发生透明度的变更;另一样种Frame动画,传统的动画片方法,通过逐个的播音排列好的图片来落实,类似电影。

4、 android
中有啊几种植解析xml的类?官方推荐哪种?以及它们的规律和区分。

报:XML解析主要有三种方式,SAX、DOM、PULL。常规在PC上付出我们使用Dom相对轻松些,但有性敏感的数据库或手机及还是生死攸关运用SAX方式,SAX读取是独自为的,优点:不占用内存空间、解析属性方便,但缺点就是是于套嵌多个支行来说处理不是特别便宜。而DOM方式会将任何XML文件加载到内存中去,这里Android开发网提醒大家该措施以追寻方面可以和XPath很好的整合而数据量不是那个特别推荐应用,而PULL常常用当J2ME对于节点处理比较好,类似SAX方式,同样不行节省内存,在J2ME中我们常常下的KXML库来分析。

5、 ListView的优化方案

报经:1、如果打定义适配器,那么在getView方法中如果考虑方法传上的参数contentView是否为null,如果也null就创造contentView并回,如果无为null则一直以。在是方式中尽可能少创建view。

 
2、给contentView设置tag(setTag()),传入一个viewHolder对象,用于缓存要展示的数据,可以达标图像数据异步加载的功效。

 
3、如果listview需要出示的item很多,就要考虑分页加载。比如一共要来得100长或者另行多之时段,我们可以设想先加载20漫长,等用户拉至列表底部的时节重新去加载接下去的20修。

6、 请介绍下Android的数目存储方。

报:使用SharedPreferences存储数据;文件存储数据;SQLite数据库存储数据;使用ContentProvider存储数据;网络存储数据;

Preference,File, DataBase这三种方法分别对应的目录是/data/data/Package
Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package
Name/database 。

一样:使用SharedPreferences存储数据

率先说明SharedPreferences存储方,它是
Android提供的用来囤积一些简易布置信息之等同种体制,例如:登录用户之用户称与密码。其使用了Map数据结构来囤积数据,以键值的法子囤,可以概括的读取与写入,具体实例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
void ReadSharedPreferences(){
String strName,strPassword;
SharedPreferences   user = getSharedPreferences(“user_info”,0);
strName = user.getString(“NAME”,””);
strPassword = user getString(“PASSWORD”,””);
}
void WriteSharedPreferences(String strName,String strPassword){
SharedPreferences   user = getSharedPreferences(“user_info”,0);
uer.edit();
user.putString(“NAME”, strName);
user.putString(“PASSWORD” ,strPassword);
user.commit();
}

数读取与写入的方都非常简单,只是当写入的下有些区别:先调用edit()使其处于编辑状态,然后才会改改数据,最后用commit()提交修改的数据。实际上SharedPreferences是使用了XML格式将数据存储到装备受到,在DDMS中之File Explorer中的/data/data/<package name>/shares_prefs下。使用SharedPreferences是起来限制的:只能于与一个包内使用,不可知以不同之包中用。

其次:文件存储数据

文本存储方是平等栽比较常用之艺术,在Android中读取/写副文件的不二法门,与 Java中落实I/O的次是完全相同的,提供了openFileInput()和openFileOutput()方法来读取设备上的文本。具体实例如下:

1
2
3
String fn = “moandroid.log”;
FileInputStream fis = openFileInput(fn);
FileOutputStream fos = openFileOutput(fn,Context.MODE_PRIVATE);

其三:网络存储数据

网存储方,需要同Android 网络数据包打交道,关于Android 网络数据包的详细说明,请看Android SDK引用了Java SDK的焉package?。

四:ContentProvider

1、ContentProvider简介

当以继续ContentProvider类,并重复写该类用于提供数据和存储数据的法子,就足以于另外以共享其数据。虽然采用外方法为可以对外共享数据,但数据看方式会为数量存储的章程如不同,如:采用文件措施对外共享数据,需要展开文件操作读写多少;采用sharedpreferences共享数据,需要使用sharedpreferences API读写多少。而以ContentProvider共享数据的便宜是联了数额看方式。

2、Uri类简介

Uri代表了如果操作的多寡,Uri主要含有了区区组成部分信息:1.急需操作的ContentProvider ,2.针对ContentProvider中之呀数据开展操作,一个Uri由以下几有的构成:

1.scheme:ContentProvider(内容提供者)的scheme已经由Android所确定啊:content://…

2.主机名(或Authority):用于唯一标识是ContentProvider,外部调用者可以根据这个标识来找到其。

3.路线(path):可以为此来代表我们若操作的数码,路径的构建应根据业务而定,如下:

若果操作contact表中id为10之笔录,可以构建这样的不二法门:/contact/10

如果操作contact表中id为10之笔录之name字段, contact/10/name

设若操作contact表中之备记录,可以构建这样的门道:/contact?

假设操作的数据未自然来自数据库,也足以是文本等客存储方,如下:

倘操作xml文件中contact节点下之name节点,可以构建这样的路:/contact/name

若如管一个字符串转换成Uri,可以采用Uri类中之parse()方法,如下:

Uri uri =
Uri.parse(“content://com.changcheng.provider.contactprovider/contact”)

3、UriMatcher、ContentUrist和ContentResolver简介

因Uri代表了要操作的数额,所以我们好经常需要解析Uri,并于
Uri中获取数据。Android系统提供了少只用于操作Uri的家伙类,分别吗UriMatcher
和ContentUris 。掌握它的采用,会好我们的开支工作。

UriMatcher:用于匹配Uri,它的用法如下: 

1.先是将您待匹配Uri路径全部于登记及,如下:

1
2
3
4
5
6
//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider /contact路径,返回匹配码为1
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//添加需要匹配uri,如果匹配就会返回匹配码
//如果match()方法匹配 content://com.changcheng.sqlite.provider.contactprovider/contact/230路径,返回匹配码为2
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);//#号为通配符

2.挂号了得般配的Uri后,就可使用uriMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配配码,匹配码是调用 addURI()方法传入的老三单参数,假设匹配 content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回的匹配码为1。

ContentUris:用于取Uri路径后面的ID部分,它发零星单比实用的点子:

withAppendedId(uri, id)用于为路径加上ID部分

parseId(uri)方法用于从路径中取ID部分

ContentResolver:当外部应用得针对ContentProvider中的数额进行添加、删除、修改及查询操作时,可以动用 ContentResolver 类来好,要博得ContentResolver 对象,可以用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,来操作数据。

7、activity的启航模式起怎样?是什么意义?

答:在android里,有4栽activity的启动模式,分别吗: 

“standard” (默认) 

“singleTop” 

“singleTask” 

“singleInstance”

它们要有如下不同:

1. 什么控制所属task 

“standard”和”singleTop”的activity的目标task,和接的Intent的发送者在同一个task内,除非intent包括参数FLAG_ACTIVITY_NEW_TASK。 

而提供了FLAG_ACTIVITY_NEW_TASK参数,会启动暨别的task里。 

“singleTask”和”singleInstance”总是拿activity作为一个task的根元素,他们不会见为启动到一个外task里。

2. 是不是同意多只实例 

“standard”和”singleTop”可以给实例化多次,并且是让不同的task中,且一个task可以包括一个activity的大半独实例; 

“singleTask”和”singleInstance”则限制只生成一个实例,并且是task的根元素。 singleTop要求要创建intent的上栈顶已经来使创造的Activity的实例,则拿intent发送给该实例,而休发送给新的实例。

3. 是否同意任何activity存在吃本task内 

“singleInstance”独占一个task,其它activity不克存在好task里;如果其启动了一个初的activity,不管新的activity的launch mode 如何,新的activity都用会见及别的task里运行(如同加了FLAG_ACTIVITY_NEW_TASK参数)。 

只要除此以外三种模式,则可以和另外activity共存。

4. 是否每次都深成新实例 

“standard”对于没有一个起步Intent都见面转移一个activity的新实例; 

“singleTop”的activity如果在task的栈顶的话,则无要命成新的该activity的实例,直接以栈顶的实例,否则,生成该activity的实例。 

依现在task栈元素为A-B-C-D(D在栈顶),这时候吃D发一个起先intent,如果D是 “standard”的,则生成D的一个初实例,栈变为A-B-C-D-D。 

如果D是singleTop的讲话,则无见面生产D的初实例,栈状态仍为A-B-C-D 

一经这时为B发Intent的语,不管B的launchmode是”standard” 还是 “singleTop” ,都见面生成B的新实例,栈状态变为A-B-C-D-B。

“singleInstance”是那个所在栈的唯一activity,它会每次都深受选定。

“singleTask”如果当栈顶,则受intent,否则,该intent会叫抛,但是该task仍会回来前台。

当就有的activity实例处理新的intent时候,会调用onNewIntent()方法 如果收到intent生成一个activity实例,那么用户可以由此back键回到上一个态;如果是既是的一个activity来拍卖这intent的话语,用户不可知透过按back键返回到即之前的状态。

8、跟activity和Task 有关的 Intent启动方式产生哪?其意思?

核心的Intent Flag有: 

FLAG_ACTIVITY_NEW_TASK 

FLAG_ACTIVITY_CLEAR_TOP 

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 

FLAG_ACTIVITY_SINGLE_TOP

FLAG_ACTIVITY_NEW_TASK 

  如果安,这个Activity会成为历史stack中一个新Task的启。一个Task(从启动它的Activity到下一个Task中的 Activity)定义了用户可迁移的Activity原子组。Task可以移动到前台和后台;在有特定Task中之兼具Activity总是保持同一的次序。 

  这个标志一般用来呈现“启动”类型的行:它们提供用户同样层层可以单独完成的政工,与开行它们的Activity完全无关。 

 使用此标志,如果正在起步之Activity的Task已经以运作吧,那么,新的Activity将非会见启动;代替的,当前Task会简单的移入前台。参考FLAG_ACTIVITY_MULTIPLE_TASK标志,可以禁用这同表现。 

  这个标志不可知用于调用方对已起步的Activity请求结果。

FLAG_ACTIVITY_CLEAR_TOP 

 
如果设置,并且这个Activity已经以时下之Task中运作,因此,不再是再次启航一个以此Activity的实例,而是在此Activity上方的装有Activity都拿关门,然后是Intent会作为一个初的Intent投递到一直的Activity(现在在顶端)中。 

 
例如,假要一个Task中蕴藏这些Activity:A,B,C,D。如果D调用了startActivity(),并且包含一个指向Activity
B的Intent,那么,C和D都将终止,然后B接收至之Intent,因此,目前stack的观是:A,B。 

  上例被正在周转的Activity
B既好在onNewIntent()中吸收及者新的Intent,也可以管自己关闭然后再开动来收纳这Intent。如果它们的开行模式声明也
“multiple”(默认值),并且你莫当此Intent中设置FLAG_ACTIVITY_SINGLE_TOP标志,那么它用关门然后又创设;对于其他的启动模式,或者以此Intent中安FLAG_ACTIVITY_SINGLE_TOP标志,都以拿此Intent投递到目前夫实例的onNewIntent()中。 

 
这个启动模式还得和FLAG_ACTIVITY_NEW_TASK结合起来以:用于启动一个Task中之根Activity,它见面把生Task中其他运行的实例带入前台,然后去掉其直到根Activity。这好有因此,例如,当于Notification
Manager处启动一个Activity。 

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 

   
如果安是标志,这个activity不管是由一个新的栈启动还是由已经来栈推到栈顶,它还拿因the
front door of the
task的法子启动。这虽提导致其他与下相关的栈都讲重置到健康状态(不管是正值讲activity移入还是移除),如果需要,或者直接重置该库为初步状态。

FLAG_ACTIVITY_SINGLE_TOP 

  如果安,当是Activity位于历史stack的上方运行时,不再启动一个初的

FLAG_ACTIVITY_BROUGHT_TO_FRONT 

 
这个标志一般不是由于程序代码设置的,如以launchMode中设置singleTask模式时系统助您设定。 

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 

  如果安,这将于Task的Activity
stack中设置一个还原点,当Task恢复时,需要清理Activity。也就是说,下一样破Task带在
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记上前台时(典型的操作是用户在主画面重开它),这个Activity和她之上的还用关门,以至于用户不克再回到回到其,但是足以回来之前的Activity。 

 
这当公的次第来分割点的下杀有因此。例如,一个e-mail应用程序可能有一个操作是翻开一个附件,需要启动图片浏览Activity来展示。这个
Activity应该作为e-mail应用程序Task的均等有,因为就是用户以是Task中触发的操作。然而,当用户距离这Task,然后从主画面选择e-mail
app,我们或想返回查看的对话中,但无是查图片附件,因为就吃丁困惑。通过以启动图片浏览时设定是标志,浏览和其他启动之Activity在下次用户返回到mail程序时犹用所有脱。 

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 

  如果安,新的Activity不会见以前不久起步的Activity的列表中保留。 

FLAG_ACTIVITY_FORWARD_RESULT 

 
如果设置,并且是Intent用于打一个存的Activity启动一个初的Activity,那么,这个作为回答目标的Activity将会流传这个新的Activity中。这种艺术下,新的Activity可以调用setResult(int),并且是结果值将发送给大作为回答目标的
Activity。 

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY 

 
这个标志一般不由应用程序代码装,如果是Activity是打历史记录里启动的(常以HOME键),那么,系统会拉扯您设定。 

FLAG_ACTIVITY_MULTIPLE_TASK 

 
不要使用是标志,除非您协调实现了应用程序启动器。与FLAG_ACTIVITY_NEW_TASK结合起来使用,可以禁用把已经怀的Task送入前台的一言一行。当装时,新的Task总是会启动来拍卖Intent,而无任就是是否已经出一个Task可以拍卖同之事务。 

 
由于默认的网未含图形Task管理作用,因此,你莫该使这标志,除非您提供给用户同样栽艺术可回到到已启动之Task。 

  如果FLAG_ACTIVITY_NEW_TASK标志没有设置,这个标志为忽略。 

FLAG_ACTIVITY_NO_ANIMATION 

 
如果在Intent中设置,并传递让Context.startActivity()的话,这个标志将堵住系统上下一个Activity时用
Acitivity迁移动画。这并无表示动画将毫不运行——如果其他一个Activity在启动显示之前,没有点名这个标志,那么,动画将让下。这个标志可以死好之用来实践一连串的操作,而动画片被当做是又胜一级的轩然大波之叫。 

FLAG_ACTIVITY_NO_HISTORY 

 
如果设置,新的Activity将不再历史stack中保留。用户同样离开她,这个Activity就倒闭了。这吗得以经设置noHistory特性。 

FLAG_ACTIVITY_NO_USER_ACTION 

 
如果安,作为新开行的Activity进入前台时,这个标志将于Activity暂停之前阻止打极度前方的Activity回调的onUserLeaveHint()。 

 
典型的,一个Activity可以借助是回调指明显式的用户动作引起的Activity移出后台。这个回调在Activity的生命周期中标记一个当的接触,并关闭部分Notification。 

 
如果一个Activity通过非用户驱动的事件,如来电要闹钟,启动之,这个标志为相应传递让Context.startActivity,保证暂停的Activity不看用户已经知晓其Notification。 

FLAG_ACTIVITY_PREVIOUS_IS_TOP 

  If set and this intent is being used to launch a new activity from an
existing one, the current activity will not be counted as the top
activity for deciding whether the new intent should be delivered to the
top instead of starting a new one. The previous activity will be used as
the top, with the assumption being that the current activity will finish
itself immediately. 

FLAG_ACTIVITY_REORDER_TO_FRONT 

 
如果在Intent中设置,并传递让Context.startActivity(),这个标志将引发已经运行的Activity移动到历史stack的上面。 

 
例如,假要一个Task由四只Activity组成:A,B,C,D。如果D调用startActivity()来启动Activity
B,那么,B会动至历史stack的顶端,现在底主次变成A,C,D,B。如果FLAG_ACTIVITY_CLEAR_TOP标志为安的话,那么这标志将为忽略。 

9、 请描述下Activity的生命周期。

报经:activity的生命周期方法来:onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory();

看得出生命周期:从onStart()直到系统调用onStop()

前台生命周期:从onResume()直到系统调用onPause()

10、 activity在屏幕旋转时之生命周期

答:不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时见面实施同一涂鸦,切竖屏时会见履两次等;设置Activity的android:configChanges=”orientation”时,切屏还是会见再也调用各个生命周期,切横、竖屏时单会履行同一坏;设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会见又调用各个生命周期,只见面履onConfigurationChanged方法

11、 如何启用Service,如何停用Service。

服务的付出比较简便,如下:

第一步:继承Service类

1
public class SMSService extends Service {}

其次步:在AndroidManifest.xml文件中之<application>节点里对劳动进行部署:<service
android:name=”.SMSService” />

劳务不能够和谐运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这半独方法还足以启动Service,但是它们的运场所有所不同。使用startService()方法启用服务,调用者与劳务中间从未关,即使调用者退出了,服务还运行。使用bindService()方法启用服务,调用者与服务绑定在了同,调用者一旦退出,服务啊便已,大来“不求同时生,必须同时充分”的特征。

苟打算用Context.startService()方法启动服务,在服务不受创造时,系统会先调用服务之onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务就为创造,多次调用startService()方法并无会见造成多次创造服务,但会导致多次调用onStart()方法。采用startService()方法启动的劳动,只能调用Context.stopService()方法了劳动,服务了时会见调用onDestroy()方法。

若是打算动用Context.bindService()方法启动服务,在劳动不吃创造时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和劳动绑定在齐,调用者退出了,系统即会见先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已给绑定,多次调用bindService()方法并无会见造成多次开立服务和绑定(也就是说onCreate()和onBind()方法并无会见受数调用)。如果调用者希望与正在绑定的劳动解除绑定,可以调用unbindService()方法,调用该方式也会见导致系统调用服务之onUnbind()–>onDestroy()方法。 

劳动常用生命周期回调方法如下: 

onCreate()
该方法在服务让创造时调用,该办法只有见面让调用一蹩脚,无论调用多少次startService()或bindService()方法,服务也才于创造同不成。

onDestroy()该办法在服务为停时调用。

同下Context.startService()方法启动服务有关的生命周期方法

onStart()
只来使Context.startService()方法启动服务时才会回调该措施。该方式在劳动开始运行时给调用。多次调用startService()方法尽管不见面一再创办服务,但onStart()
方法会被频繁调用。

暨下Context.bindService()方法启动服务有关的生命周期方法

onBind()只来下Context.bindService()方法启动服务时才会回调该措施。该方式在调用者与服务绑定时叫调用,当调用者与劳务既绑定,多次调用Context.bindService()方法并无会见招拖欠法为数调用。

onUnbind()只发下Context.bindService()方法启动服务经常才会回调该办法。该办法在调用者与劳动解除绑定时叫调用

12、
注册广播有几种植方式,这些方法发生哪里优缺点?请谈谈Android引入广播机制的用意。

报:首先写一个类要继承BroadcastReceiver

先是种:在清单文件被声称,添加

1
2
3
4
5
<receive android:name=".IncomingSMSReceiver " >
<intent-filter>
   <action android:name="android.provider.Telephony.SMS_RECEIVED")
<intent-filter>
<receiver>

亚种植使代码进行登记如:

1
2
3
IntentFilter filter =  new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomgSMSReceiver();
registerReceiver(receiver.filter);

有数种注册项目的界别是:

1)第一种植不是常驻型广播,也就是说广播跟随程序的生命周期。

2)第二种是常驻型,也就是说当应用程序关闭后,如果产生信息播报来,程序吗会见让系统调用自动运行。

13、 请解释下以单线程模型中Message、Handler、Message
Queue、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进行处理

Message:消息的档次,在Handler类中之handleMessage方法被落单个的信进行拍卖

当单线程模型下,为了线程通信问题,Android设计了一个Message
Queue(消息队列), 线程间可以由此该Message
Queue并构成Handler和Looper组件进行信息交换。下面将本着它们进行分级介绍:

  1. Message 

   
Message消息,理解为丝程间交流的消息,处理数据后台线程需要更新UI,则发送Message内包含部分多少被UI线程。

  1. Handler 

   
Handler处理者,是Message的重中之重处理者,负责Message的发送,Message内容之推行处理。后台线程就是经过污染进的
Handler对象引用来sendMessage(Message)。而采取Handler,需要implement
该类的
handleMessage(Message)方法,它是处理这些Message的操作内容,例如Update
UI。通常要子类化Handler来实现handleMessage方法。

  1. Message Queue 

    Message
Queue消息队列,用来存放通过Handler发布的音,按照先进先出执行。

    每个message queue都见面有一个对应之Handler。Handler会向message
queue通过简单栽方式发送信息:sendMessage或post。这片种信息都见面插在message
queue队尾并按先进先出执行。但透过就点儿种植方式发送的信息执行的计略有不同:通过sendMessage发送的凡一个message对象,会叫
Handler的handleMessage()函数处理;而经post方法发送的是一个runnable对象,则会好行。

  1. Looper 

    Looper是各国条线程里的Message Queue的管家。Android没有Global的Message
Queue,而Android会自动为主线程(UI线程)建立Message
Queue,但于子线程里并没有成立Message
Queue。所以调用Looper.getMainLooper()得到的主线程的Looper不为NULL,但调用Looper.myLooper()
得到时线程的Looper就有或吗NULL。对于子线程使用Looper,API
Doc提供了不利的使方法:这个Message机制的大约流程:

    1. 每当Looper.loop()方法运行起来后,循环地按照接收顺序取出Message
Queue里面的非NULL的Message。

    2. 一律起Message
Queue里面的Message都是NULL的。当Handler.sendMessage(Message)到Message
Queue,该函数里面安装了很Message对象的target属性是时下的Handler对象。随后Looper取出了挺Message,则调用
该Message的target指向的Hander的dispatchMessage函数对Message进行拍卖。在dispatchMessage方法里,如何处理Message则由用户指定,三独判断,优先级从赛到低位:

    1)
Message里面的Callback,一个兑现了Runnable接口的对象,其中run函数做拍卖工作;

    2)
Handler里面的mCallback指向的一个兑现了Callback接口的对象,由其handleMessage进行拍卖;

    3)
处理消息Handler对象对应之近乎继承并贯彻了中handleMessage函数,通过此实现的handleMessage函数处理消息。

    由此可见,我们实现的handleMessage方法是优先级最低的!

    3. Handler拍卖了该Message (update UI)
后,Looper则设置该Message为NULL,以便回收!

   
在网上发成千上万文章讲述主线程和其它子线程如何相互,传送信息,最终谁来施行拍卖信息等等的,个人掌握是无限简易的计——判断Handler对象中的Looper对象是属哪条线程的,则由于该线程来施行! 

    1. 当Handler对象的构造函数的参数为空,则为眼前所在线程的Looper; 

2.
Looper.getMainLooper()得到的凡主线程的Looper对象,Looper.myLooper()得到的凡时线程的Looper对象。

14、 简要解释一下activity、 intent 、intent
filter、service、Broadcase、BroadcaseReceiver

答:一个activity呈现了一个用户可以操作的可视化用户界面;一个service不带有可见的用户界面,而是以后台运行,可以同一个activity绑定,通过绑定暴露出来接口并与那开展通信;一个broadcast
receiver是一个接收播放消息并做出答复的component,broadcast
receiver没有界面;一个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文件中扬言的。

15、
说说mvc模式的规律,它以android中之运,android的官方建议应用程序的支付使用mvc模式。何谓mvc?

mvc是model,view,controller的缩写,mvc包含三个组成部分:

  模型(model)对象:是应用程序的主导有,所有的工作逻辑都该写在该层。

  视图(view)对象:是应用程序中承担转用户界面的有。也是以普mvc架构中用户唯一可以看出底等同重叠,接收用户的输入,显示处理结果。

  控制器(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,如果耗时的操作放在这里,程序就算异常易让回收掉。

  3)模型层(model):对数据库的操作、对纱等之操作都应有于model里面处理,当然对业务计算相当于操作也是须放在的该层的。

16、 什么是ANR 如何避免其?

报:ANR:Application Not
Responding。在Android中,活动管理器和窗口管理器这简单独网服务承担监视应用程序的应,当用户操作的在5s内应用程序没会做出反应,BroadcastReceiver以10秒内无实行完毕,就会见油然而生应用程序无响应对话框,这既是是ANR。

避免方法:Activity应该在它的重中之重生命周期方法(如onCreate()和onResume())里尽可能少的失去做创建操作。潜在的耗时操作,例如网络或数据库操作,或者高耗时之盘算而反各图尺寸,应该当子线程里(或者异步方式)来完成。主线程应该为子线程提供一个Handler,以便形成时能交给给主线程。

17、 什么动静会导致Force Close ?如何避免?能否捕获导致该的充分?

报经:程序出现异常,比如nullpointer。

避:编写程序时逻辑连贯,思维缜密。能捕获异常,在logcat中会来看那个信息

18、 描述一下android之网架构

android系统架构分从生往上为linux
内核层、运行库、应用程序框架层、和应用程序层。

linuxkernel:负责硬件的驱动程序、网络、电源、系统安全以及内存管理等于力量。

libraries和 android
runtime: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的计划与运行机制,也就算更能够驾驶整个应用层的开发。

19、 请介绍下ContentProvider是哪落实数据共享的。

一个程序可以经实现一个Content
provider的悬空接口将好之数了暴露出,而且Content
providers是因看似数据库中表的方法以数据暴露。Content
providers存储和摸索数据,通过她可于抱有的应用程序访问到,这吗是应用程序之间唯一共享数据的法门。

要惦记只要应用程序的数码公开化,可透过2种植方法:创建一个属于您自己之Content
provider或者将公的多寡增长到一个业已是的Content
provider中,前提是出同等数据类型并且产生描绘副Content provider的权能。

何以通过平等效仿标准以及联合之接口获取其他应用程序暴露的数额?

Android提供了ContentResolver,外界的次第可以通过ContentResolver接口访问ContentProvider提供的数量。

20、 Service和Thread的区别?

报:servie是系的零部件,它由系统经过托管(servicemanager);它们中的通信类于client和server,是一致种轻量级的ipc通信,这种通信的载体是binder,它是在linux层交换信息之平等种ipc。而thread是出于准应用程序托管。1).
Thread:Thread 是程序执行的极端小单元,它是分配CPU的骨干单位。可以为此
Thread 来实施有异步的操作。

2). Service:Service 是android的同等栽机制,当它们运行的当儿要是Local
Service,那么相应的 Service 是运作于主进程的 main
线程上的。如:onCreate,onStart 这些函数在吃系统调用的早晚还是当主进程的
main 线程上运行的。如果是Remote Service,那么相应的 Service
则是运作于单身进程的 main 线程上。

既然如此这样,那么我们怎么而用 Service 呢?其实就与 android
的体系编制有关,我们先行以 Thread 来说。Thread 的运行是独为 Activity
的,也就是说当一个 Activity 被 finish 之后,如果您从未积极性息 Thread
或者 Thread 里的 run 方法没有实行完毕的话,Thread
也会一直推行。因此这里会面世一个问题:当 Activity 给 finish
之后,你不再抱有该 Thread 的援。另一方面,你莫艺术于不同之 Activity
中针对同一 Thread 进行支配。  

推选个例证:如果您的 Thread
需要不停止地隔一段时间就要连续服务器做某种同步的话,该 Thread 需要在
Activity 没有start的时候吗当运转。这个时当您 start 一个 Activity
就从不辙在该 Activity 里面控制前创建的
Thread。因此若就用创造并启动一个 Service ,在 Service
里面创建、运行并控制该 Thread,这样即使解决了拖欠问题(因为其他 Activity
都得控制同一 Service,而系统为单独见面创一个遥相呼应 Service 的实例)。  

就此你可以拿 Service 想象变为一种信息服务,而而得于其它有 Context
的地方调用
Context.startService、Context.stopService、Context.bindService,Context.unbindService,来支配其,你呢得以以
Service 里登记 BroadcastReceiver,在外地方通过发送 broadcast
来支配它们,当然这些都是 Thread 做不顶的。

21、
Android本身的api并未声明会抛来十分,则该于运作时有无可能抛出runtime异常,你碰到过吧?诺有的说话会导致什么问题?如何化解?

报:会,比如nullpointerException。我赶上了,比如textview.setText()时,textview没有初始化。会导致程序无法正常运转出现forceclose。打开控制台查看logcat信息寻找有特别信息并修改程序。

22、 IntentService有哪里长?

答:Acitivity的进程,当处理Intent的时,会产生一个遥相呼应之Service;
Android的历程处理器现在会尽可能的无kill掉你;非常容易使用

23、
如果后台的Activity由于有因让系统回收了,如何以被网回收之前封存时状态?

报经:重写onSaveInstanceState()方法,在这办法被保留得保留之数目,该措施以会当activity被回收之前调用。通过重复写onRestoreInstanceState()方法好从中提取保存好之多少

24、 如何拿一个Activity设置成窗口的体制。

答:<activity>中配置:android
:theme=”@android:style/Theme.Dialog” 

除此以外android:theme=”@android:style/Theme.Translucent” 是设置透明

25、 如何退出Activity?如何安全退出已调用多单Activity的Application?

报经:对于单一Activity的施用来说,退出很简单,直接finish()即可。当然,也堪用killProcess()和System.exit()这样的法。

于多个activity,1、记录打开的Activity:每打开一个Activity,就记录下来。在得退出时,关闭每一个Activity即可。2、发送特定广播:在急需收尾应用时,发送一个一定的播音,每个Activity收到广播后,关闭即可。3、递归退出:在开拓新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。为了编程方便,最好定义一个Activity基类,处理这些同接问题。

当2.1事先,可以使用ActivityManager的restartPackage方法。

其可直接收所有应用。在运时需权限android.permission.RESTART_PACKAGES。

留神不要给它的讳迷惑。

但,在2.2,这个艺术失效了。在2.2加加了一个新的法门,killBackground
Processes(),需要权限
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、抛大强制退出:

欠方法通过废除大,使程序Force Close。

证可以,但是,需要解决的题目是,如何使程序结束掉,而不弹有Force
Close766游戏网官网的窗口。

2、记录打开的Activity:

每打开一个Activity,就记录下来。在急需退出时,关闭每一个Activity即可。

3、发送特定广播:

当得了应用时,发送一个特定的播放,每个Activity收到广播后,关闭即可。

4、递归退出

于开拓新的Activity时采取startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

除外第一单,都是怀念方法将各级一个Activity都得了掉,间接达到目的。但是这么做一样未圆满。你会意识,如果协调的应用程序对每一个Activity都设置了nosensor,在点滴独Activity结束的空,sensor可能使得了。但至少,我们的目的上了,而且没有影响用户用。为了编程方便,最好定义一个Activity基类,处理这些并接入问题。

26、 AIDL的齐全是什么?如何工作?能处理哪些项目的数目?

答:全称是:Android Interface Define Language

当Android中, 每个应用程序都得产生协调的进程. 在描写UI应用之时段,
经常要为此到Service. 在不同的过程遭到, 怎样传递对象也?显然,
Java中不允许超过进程内存共享. 因此传递对象,
只能将目标拆分成操作系统能亮的简款式, 以高达跨界对象看的目的.
在J2EE中,采用RMI的方, 可以经序列化传递对象. 在Android中,
则采用AIDL的方式. 理论上AIDL可以传递Bundle,实际上做起来可比麻烦。

AIDL(AndRoid接口描述语言)是同等种植借口描述语言;
编译器可以经过aidl文件特别成一段子代码,通过事先定义之接口及少单过程中通信进程的目的.
如果急需以一个Activity中, 访问另一个Service中的某某对象,
需要事先将目标转化成AIDL可认识别的参数(可能是大抵只参数),
然后用AIDL来传递这些参数, 在消息的接收端,
使用这些参数组装成自己得的对象.

AIDL的IPC的机制以及COM或CORBA类似,
是根据接口的,但它是轻量级的。它应用代理类在客户端与贯彻层间传递值.
如果如采用AIDL, 需要形成2件事务: 1. 引入AIDL的连带类.; 2.
调用aidl产生的class.

AIDL的创造方法:

AIDL语法很简短,可以用来声称一个带来一个要多只方式的接口,也堪传递参数和归值。
由于远距离调用的要,
这些参数和归值并无是外类型.下面是数AIDL支持之数据类型:

  1. 勿待import声明的简易Java编程语言类(int,boolean等)

  2. String, CharSequence不需独特声明

  3. List, Map和Parcelables类型,
    这些项目内所涵盖的数额成员为不得不是简单数据类型,
    String等另外比支持之类型.

(另外: 我没有尝试Parcelables, 在Eclipse+ADT下编译不过, 或许以后会有所支持)

27、 请解释下Android程序运行时权和文件系统权限的分。

答:运行时权Dalvik( android授权) 

文件系统 linux 内核授权

28、
系统及设置了余浏览器,能否指定某个浏览器访问指定页面?请说明原委。

由此直接发送Uri把参数带过去,或者经manifest里的intentfilter里的data属性

29、 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中就从未有过放音乐
播放器,全部赖第三正值出,缺少了活之统一性。

30、 Android dvm的历程同Linux的历程, 应用程序的长河是否为与一个概念 

报经:DVM指dalivk的虚拟机。每一个Android应用程序都当其和谐之长河遭到运作,都抱有一个独立的Dalvik虚拟机实例。而各个一个DVM都是于Linux
中之一个经过,所以说好看是跟一个概念。

31、 sim卡的EF文件是啊?有哪打算

报:sim卡的文件系统有协调专业,主要是为和手机通讯,sim本
身可以起和好的操作系统,EF就是发存储并同手机通讯用之

32、 嵌入式操作系统内存管理出哇几栽, 各起哪里特征

  页式,段式,段页,用到了MMU,虚拟空间等技术

33、 什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?

嵌入式实时操作系统是依赖当外界事件要数量发生时,能够接受并因十足快之进度与处理,其拍卖的结果同时会以确定之时光中来支配生育过程还是针对拍卖系统作出迅速响应,并操纵所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、
军事装备、
航空航天等世界对网的响应时间发出苛刻的要求,这就得以实时系统。又只是分为软实时以及身心健康时有限栽,而android是基于linux内核的,因此属于软实时。

34、 一长条极其丰富的短消息约占小byte?

  汉语70(包括标点),英文160,160只字节。  

35、 如何拿SQLite数据库(dictionary.db文件)与apk文件共发布

解答:可以拿dictionary.db文件复制到Eclipse Android工程中之res
aw目录中。所有在res
aw目录中的文件未会见于压缩,这样好直接领取该目录中的公文。可以将dictionary.db文件复制到res
aw目录中

36、 如何用打开res aw目录中之数据库文件?

解答:在Android中不可知直接打开res
aw目录中之数据库文件,而待在次第一浅开行时将拖欠公文复制到手机内存还是SD卡的某个目录中,然后又打开该数据库文件。

复制的着力方法是运用getResources().openRawResource方法得到res
aw目录中资源的
InputStream对象,然后拿该InputStream对象被之数据勾勒副另外的目录中相应文件中。在Android
SDK中好使SQLiteDatabase.openOrCreateDatabase方法来开辟任意目录中之SQLite数据库文件。

37、 DDMS和TraceView的区别? 

DDMS是一个程序执行查看器,在里可以望见线程和储藏室等消息,TraceView是先后性能分析器

38、 java中怎样引用本地语言 

得据此JNI(java native interface  java 本地接口)接口 。

39、 谈谈Android的IPC(进程之中通信)机制 

IPC是中间进程通信的简称,
是共享”命名管道”的资源。Android中之IPC机制是为了让Activity和Service之间可以随时的展开互动,故在Android中该机制,只适用于Activity与Service之间的通信,类似于远程方法调用,类似于C/S模式的看。通过定义AIDL接口文件来定义IPC接口。Servier端实现IPC接口,Client端调用IPC接口本地代理。

40、 NDK是什么

NDK是有列工具的汇,NDK提供了相同密密麻麻的工具,帮助开发者迅速的开销C/C++的动态库,并会活动将so和java
应用打成apk包。

NDK集成了接力编译器,并提供了对应的mk文件及隔断cpu、平台等之差距,开发人员只待简的改mk文件就好创建有so

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注