11 Android的四大组件,它们的作用?

android有四大组件:Activity,Broadcast Receiver,Service,Content Providers。

1)Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持久化的事情,妥善管理生命周期以及一些跳转逻辑。

一个Activity通常就是一个单独的屏幕(窗口)。
Activity之间通过Intent进行通信。

android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity

2)service:后台服务于Activity,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的事物,定义好需要接受的Intent提供同步和异步的接口。

service分为两种:

astarted(启动):当应用程序组件(如activity)调用startService()方法启动服务时,服务处于started状态。

started service(启动服务)是由其他组件调用startService()方法启动的,这导致服务的onStartCommand()方法被调用。当服务是started状态时,其生命周期与启动它的组件无关,并且可以在后台无限期运行,即使启动服务的组件已经被销毁。因此,服务需要在完成任务后调用stopSelf()方法停止,或者由其他组件调用stopService()方法停止。

bbound(绑定):当应用程序组件调用bindService()方法绑定到服务时,服务处于bound状态。

使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。

3)Content Provider:是Android提供的第三方应用数据的访问方案,可以派生Content Provider类,对外提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供统一的接口模型,大大简化上层应用,对数据的整合提供了更方便的途径。

a android 平台提供了 Content Provider 使一个应用程序的指定数据集提供给其他应用程序。其他应用可以 通过 ContentResolver 类从该内容提供者中获取或存入数据
b )只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处是统一数据访问方式。
c ContentProvider 实现数据共享 ContentProvider 用于保存和获取数据,并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式,因为 android 没有提供所有应用共同访问的公共存储区。
d )开发人员不会直接使用 ContentProvider 类的对象,大多数是通过 ContentResolver 对象实现对 ContentProvider 的操作。

eContentProvider使用URI来唯一标识其数据集,这里的URIcontent://作为前缀,表示该数据由ContentProvider来管理。

4)BroadCast Receiver:接受一种或者多种Intent作触发事件,接受相关消息,做一些简单处理,转换成一条Notification,统一了Android的事件广播模型。

附加的内容---> android中的任务(activity栈)

a)任务其实就是activity的栈,它由一个或多个Activity组成,共同完成一个完整的用户体验。栈底的是启动整个任务的Activity,栈顶的是当前运行的用户可以交互的Activity,当一个activity启动另外一个的时候,新的activity就被压入栈,并成为当前运行的activity。而前一个activity仍保持在栈之中。当用户按下BACK键的时候,当前activity出栈,而前一个恢复为当前运行的activity。栈中保存的其实是对象,栈中的Activity永远不会重排,只会压入或弹出。

b)任务中的所有activity是作为一个整体进行移动的。整个的任务(即activity栈)可以移到前台,或退至后台。

(c)Android系统是一个多任务(Multi-Task)的操作系统,可以在用手机听音乐的同时,也执行其他多个程序。每多执行一个应用程序,就会多耗费一些系统内存,当同时执行的程序过多,或是关闭的程序没有正确释放掉内存,系统就会觉得越来越慢,甚至不稳定。为了解决这个问题,Android引入了一个新的机制,即生命周期(Life Cycle)。


12Android中常用的五种布局?

常用五种布局方式:FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)。

1)FrameLayout:所有东西依次都放在左上角,会重叠,这个布局比较简单,也只能放一点比较简单的东西。

2)LinearLayout:线性布局,每一个LinearLayout里面又可分为垂直布局(android:orientation="vertical")和水平布局(android:orientation="horizontal" )。当垂直布局时,每一行就只有一个元素,多个元素依次垂直往下;水平布局时,只有一行,每一个元素依次向右排列。

3)AbsoluteLayout:绝对布局用X,Y坐标来指定元素的位置,这种布局方式也比较简单,但是在屏幕旋转时,往往会出问题,而且多个元素的时候,计算比较麻烦。

4)RelativeLayout:相对布局可以理解为某一个元素为参照物,来定位的布局方式。主要属性有:相对于某一个元素android:layout_below、 android:layout_toLeftOf 相对于父元素的地方android:layout_alignParentLeft、android:layout_alignParentRight等;

5)TableLayout:表格布局,每一个TableLayout里面有表格行TableRow,TableRow里面可以具体定义每一个元素。

总结:每一个布局都有自己适合的方式,这五个布局元素可以相互嵌套应用,做出美观的界面。


13android中的动画有哪几类?
两种:

1)Tween动画(补间动画):使试图组件移动,放大,缩小以及产生透明度的变化。

Scale:缩放动画
Rotate:旋转动画
Translate:移动动画
Alpha::透明渐变动画

2)是Frame动画(逐帧动画):传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。


14android 中有哪几种解析xml的类?

XML解析主要有三种方式,SAX、DOM、PULL。

1)SAX读取是单向的,优点:不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。

2)而DOM方式会把整个XML文件加载到内存中去,该方法在查找方面可以和XPath很好的结合,如果数据量不是很大推荐使用。

3)PULL解析器的运行方式和SAX类似,都是基于事件的模式,同样很节省内存。不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器。


附加内容-->Pull解析xml实例:

Xml代码
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <books>
  3. <bookid="12">
  4. <name>thinkinginjava</name>
  5. <price>85.5</price>
  6. </book>
  7. <bookid="15">
  8. <name>SpringinAction</name>
  9. <price>39.0</price>
  10. </book>
  11. </books>

Java代码
  1. publicstaticList<Book>getBooks(InputStreaminputStream)throwsException{
  2. List<Book>books=null;
  3. Bookbook=null;
  4. XmlPullParserparser=Xml.newPullParser();
  5. parser.setInput(inputStream,"UTF-8");
  6. intevent=parser.getEventType();//产生第一个事件
  7. while(event!=XmlPullParser.END_DOCUMENT){
  8. switch(event){
  9. caseXmlPullParser.START_DOCUMENT://判断当前事件是否是文档开始事件
  10. books=newArrayList<Book>();//初始化books集合
  11. break;
  12. caseXmlPullParser.START_TAG://判断当前事件是否是标签元素开始事件
  13. if("book".equals(parser.getName())){//判断开始标签元素是否是book
  14. book=newBook();
  15. book.setId(Integer.parseInt(parser.getAttributeValue(0)));//得到book标签的属性值,并设置book的id
  16. }
  17. if(book!=null){
  18. if("name".equals(parser.getName())){//判断开始标签元素是否是name
  19. book.setName(parser.nextText());
  20. }elseif("price".equals(parser.getName())){//判断开始标签元素是否是price
  21. book.setPrice(Float.parseFloat(parser.nextText()));
  22. }
  23. }
  24. break;
  25. caseXmlPullParser.END_TAG://判断当前事件是否是标签元素结束事件
  26. if("book".equals(parser.getName())){//判断结束标签元素是否是book
  27. books.add(book);//将book添加到books集合
  28. book=null;
  29. }
  30. break;
  31. }
  32. event=parser.next();//进入下一个元素并触发相应事件
  33. }//endwhile
  34. returnbooks;
  35. }
14Android的数据存储方式?

作为一个完成的应用程序,数据存储操作是必不可少的。因此,Android系统一共提供了四种数据存储方式。分别是:SharePreference、SQLite、Content Provider和File。由于Android系统中,数据基本都是私有的的,都是存放于“data/data/程序包名”目录下,所以要实现数据共享,正确方式是使用Content Provider。

  1)SQLite:SQLite是一个轻量级的数据库,支持基本SQL语法,是常被采用的一种数据存储方式。Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的API。

  2)SharedPreference:除SQLite数据库外,另一种常用的数据存储方式,其本质就是一个xml文件,常用于存储较简单的参数设置。

  3)File:即常说的文件(I/O)存储方法,常用语存储大数量的数据,但是缺点是更新数据将是一件困难的事情。

  4)ContentProvider:Android系统中能实现所有应用程序共享的一种数据存储方式,由于数据通常在各应用间的是互相私密的,所以此存储方式较少使用,但是其又是必不可少的一种存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储。每个Content Provider都会对外提供一个公共的URI(包装成Uri对象),如果应用程序有数据需要共享时,就需要使用Content Provider为这些数据定义一个URI,然后其他的应用程序就通过Content Provider传入这个URI来对数据进行操作。


15 请解释下单线程模型中Message、Handler、Message queue、Looper的关系?

模型图如下:

    

在Android中对这六个部分进行了抽象成四个独立的部分:Handler,Message,MessageQueue,Looper。

  • Message就是消息原型,包含消息描述和数据。
  • MessageQueue就是消息队列。
  • Looper完成消息循环。
  • Handler就是驾驭整个消息系统模型,统领Message,MessgeQueue和Looper。

16 什么是ANR,如何避免?

ANR:Application Not Responding。在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应,当主线程中的耗时操作在5s内没能做出反应,BroadcastReceiver在10秒内没有执行完毕,就会出现应用程序无响应对话框,这既是ANR。

避免方法:Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做耗时操作,例如网络或数据库操作,这些操作应该在子线程里(或者异步方式)来完成。主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。


17 Service和Thread的区别?

1)Service是系统的组件,它由系统进程托管(Service Manager),它们之间的通信类似于client和server,是一种轻量级的ipc通信,这种通信的载体是binder,它是在linux层交换信息的一种ipc。

2)Thread是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。


区别(控制问题):

Thread的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread或者 Thread 里的run 方法没有执行完毕的话,Thread也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。

你可以把Service 想象成一种消息服务,而你可以在任何有Context 的地方调用Context.startService、Context.stopService、Context.bindService,Context.unbindService,来控制它,你也可以在Service 里注册BroadcastReceiver,在其他地方通过发送broadcast 来控制它,当然这些都是Thread 做不到的。


18 AIDL的是什么,能处理哪些类型的数据?

AIDL(AndRoid接口描述语言)是一种借口描述语言, 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的。如果需要在一个Activity中, 访问另一个Service中的某个对象,需要先将对象转化成AIDL可识别的参数(可能是多个参数),然后使用AIDL来传递这些参数, 在消息的接收端,,使用这些参数组装成自己需要的对象。

 AIDL的语法与Java接口的语法非常相似,但是存在一些差异:

1)AIDL定义接口的源代码后缀必须以.aidl结尾。

2)AIDL一样要指定AIDL接口的包信息package *。

3)AIDL接口无需指定public、private、protected等作用域,可以理解为就是public。

4)AIDL默认情况下只能传递基本类型、String、List、Map、CharSequence。

5) 如果需要传递一个复杂类型的对象,就没那么简单了,需要额外做一些处理。如下:

a)定义数据接口的AIDL文件中,使用parcelable关键字,例如:parcelable Message;

b)在其数据实现类中实现Parcelable接口,并实现对应的方法。

c)在业务接口的AIDL文件中,使用import引入数据接口AIDL的包名。


19 android的优势与不足?

优势:

1)开放性

2)挣脱运营商的束缚

3)丰富的硬件选择

4)不受任何限制的开发商

5)无缝结合的Google应用

不足:

1)安全和隐私

2)首先开卖Android手机的不是最大运营商

3)运营商仍然能够影响到Android手机

4)同类机型用户减少

5)过分依赖开发商缺少标准配置

20Android的IPC(进程间通信)机制 ?

在linux中是以进程为单位分配和管理资源的,出于保护机制,一个进程不能访问另一个进程的资源,进程间是封闭的。而应用程序常常需要进程间进行通信来共享资源,所以操作系统提供了进程间的通信机制(IPC)。Android上几乎看不到IPC通信方式,取而代之的是Binder方式。


(图片转自红黑联盟)


更多相关文章

  1. Android(安卓)应用的安装位置
  2. Android如何下抓取tcp数据包
  3. Android(安卓)Adapter的应用
  4. 在android中button响应的两种方式
  5. Android核心模块内容概述
  6. Android(安卓)O 8.0 新功能预览
  7. Android(安卓)Volley 库通过网络获取 JSON 数据
  8. [入门四]Android核心模块及相关技术
  9. android 解析json数据格式

随机推荐

  1. android屏幕常亮
  2. Android(安卓)简单的统计图
  3. 选项菜单、子菜单、上下文菜单的使用
  4. Android(安卓)Drawable
  5. Android(安卓)Studio 导入问题总结-IT蓝
  6. android sdcard 相关操作
  7. android 利用TrafficStats类获取本应用的
  8. Android(安卓)Studio生成javadoc
  9. Android必会小功能总结
  10. [zz]一个JNI下c和java程序范例