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分为两种:
(a)started(启动):当应用程序组件(如activity)调用startService()方法启动服务时,服务处于started状态。
started service(启动服务)是由其他组件调用startService()方法启动的,这导致服务的onStartCommand()方法被调用。当服务是started状态时,其生命周期与启动它的组件无关,并且可以在后台无限期运行,即使启动服务的组件已经被销毁。因此,服务需要在完成任务后调用stopSelf()方法停止,或者由其他组件调用stopService()方法停止。
(b)bound(绑定):当应用程序组件调用bindService()方法绑定到服务时,服务处于bound状态。
使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
3)Content Provider:是Android提供的第三方应用数据的访问方案,可以派生Content Provider类,对外提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供统一的接口模型,大大简化上层应用,对数据的整合提供了更方便的途径。
( a ) android 平台提供了 Content Provider 使一个应用程序的指定数据集提供给其他应用程序。其他应用可以 通过 ContentResolver 类从该内容提供者中获取或存入数据 。
( b )只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处是统一数据访问方式。
( c ) ContentProvider 实现数据共享 。 ContentProvider 用于保存和获取数据,并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式,因为 android 没有提供所有应用共同访问的公共存储区。
( d )开发人员不会直接使用 ContentProvider 类的对象,大多数是通过 ContentResolver 对象实现对 ContentProvider 的操作。
(e)ContentProvider使用URI来唯一标识其数据集,这里的URI以content://作为前缀,表示该数据由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)。
12 Android中常用的五种布局?
常用五种布局方式: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里面可以具体定义每一个元素。
总结:每一个布局都有自己适合的方式,这五个布局元素可以相互嵌套应用,做出美观的界面。
两种:
1)Tween动画(补间动画):使试图组件移动,放大,缩小以及产生透明度的变化。
Scale:缩放动画
2)是Frame动画(逐帧动画):传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
Rotate:旋转动画
Translate:移动动画
Alpha::透明渐变动画
14 android 中有哪几种解析xml的类?
XML解析主要有三种方式,SAX、DOM、PULL。
1)SAX读取是单向的,优点:不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。
2)而DOM方式会把整个XML文件加载到内存中去,该方法在查找方面可以和XPath很好的结合,如果数据量不是很大推荐使用。
3)PULL解析器的运行方式和SAX类似,都是基于事件的模式,同样很节省内存。不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器。
附加内容-->Pull解析xml实例:
作为一个完成的应用程序,数据存储操作是必不可少的。因此,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。
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 做不到的。
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)过分依赖开发商缺少标准配置
20 Android的IPC(进程间通信)机制 ?
在linux中是以进程为单位分配和管理资源的,出于保护机制,一个进程不能访问另一个进程的资源,进程间是封闭的。而应用程序常常需要进程间进行通信来共享资源,所以操作系统提供了进程间的通信机制(IPC)。Android上几乎看不到IPC通信方式,取而代之的是Binder方式。
(图片转自红黑联盟)