android是什么四大组件是什么?讲讲你对它们的理解?

1430人阅读
1.说说Android系统的优缺点:
有点:开放性,丰富的硬件选择,无缝结合的Google应用支持
缺点:安全和隐私,开发商自定义,不够统一,同类机型用户减少
2. 简单描述Android的四大组件:
Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做胡肯多持久化的事情,妥善管理生命周期以及一些跳转逻辑。
Service后台服务于Activity,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的事务,定义好需要接受的Intent提供同步和异步的接口。
ContentProvider是Android提供的第三方应用数据的访问方案,可以派生ContentProvider类,对外提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供统一的接口模型,大大简化上层应用,对数据的整合提供了更方便的途径。
BroadCastReceiver接收一种或多种Intent作触发事件,接收相关信息,做一些简单处理,转换成一条Notification,统一了Android的事件广播模型。
3.Activity的生命周期:
onCreate onStart onStop onPause onResume onDestroy
可见生命周期:从onStart直到系统调用onstop
前台生命周期:从onResume直到系统调用onPause
4.如何启用Service,如何停用Service:
第一步:继承Service类
public class ServiceDemo extends Service{}
第二步:在AndroidManifest.xml文件中的&application&节点里对服务进行配置:
&service android:name=&.ServiceDemo&/&
服务不能自己运行,需要通过调用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()方法并不会导致多次创建服务及绑定。如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()--&onDestroy()方法。
5.请介绍下Android中常用的五种布局:
LinearLayout:线性布局,每个LinearLayout里面又可以分为垂直布局和水平布局。如果是垂直布局,每一行就只有一个元素,多个元素依次垂直往下排布;如果是水平布局,只有一行,每一个元素依次向右排布。
RelativeLayout:相对布局,可以理解为某一个元素为参照物,来定位的布局方式。
FrameLayout:单帧布局,所有子元素依次放在左上角,会重叠,这个布局比较简单,也只能放一些比较简单的东西。
AbsoluteLayout:绝对布局,用X、Y坐标来指定元素的位置,这种布局比较简单,但是在屏幕旋转时,往往会出现问题,而且多个元素的时候,计算计较麻烦。
TableLayout:表格布局,每一个TableLayout里面有表格行TableRow,TableRow里面可以具体定义每一个元素。
6.Android的存储方式有哪些:
文件,SQLite,SharePreferences,ContentProvider,网络。
7.Activity在屏幕旋转时的生命周期:
不设置Activity的android:configChanges时,切换会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次;设置Activity的android:configChanges=&orientation&时,切换还是会重新调用各个生命周期,切横、竖屏时只会执行一次;设置Activity的android:configChanges=&onrientationo|keyboardHidden&时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。
8.注册广播有几种方式,这些方式有何优缺点,请谈谈Android引入广播机制的用意:
首先写一个类要继承BroadCastReceiver
第一种:在清单文件中声明,添加
&receive android:name=&.BroadCastReceiverDemo&&
&intent-filter&
&action android:name=&android.provider.Telephony.SMS_RECEIVED&&
&/intent-filter&
&/receiver&
第二种:使用代码进行注册如:
IntentFilter filter = new IntentFilter(&android.provider.Telephony.SMS_RECEIVED&);
BroadCastReceiverDemo receiver = new BroadCastReceiver();
registerReceiver(receiver, filter);
两种注册类型的区别是:
a.第一种是常驻型广播,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
b.第二种不是常驻广播,也就是说广播跟随程序的生命周期。
9.请解释下在单线程模型中Message、Handler、MessageQueue、Looper之间的关系:
Handler获取当前线程中的Looper对象,Looper对象用来从存放Message的MessageQueue中取出Message,再由Handler进行Message的分发和处理。
10.简要解释一下activity、intent、intentfilter、service、BroadCast、BroadCastReceiver
一个activity呈现了一个用户可以操作的可视化用户界面;一个service不包含可见的用户界面,而是在后台运行,可以与一个Activity绑定,通过绑定暴露出来的接口并与其进行通信;一个BroadCastReceiver是一个接收广播消息并做出回应的component,BroadCastReceiver没有界面;一个intent是一个Intent对象,它保存了消息的内容。对于activity和service来说,它指定了请求的操作名称和待操作数据的URI,Intent对象可以显式的指定一个目标component。如果这样的话,android会找到一个component并激活它,但如果一个目标不是显式指定的,android必须找到响应intent的最佳component。它是通过将Intent对象和目标的intentfilter相比较完成这一工作的;一个component的intentfilter也是在androidmanifest.xml文件中声明的。
11.什么是ANR,如何避免它:
ANR:ApplicationNotResponding。在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应,当用户操作在5s内应用程序没能做出反应,BroadCastReceiver在10s内没有执行完毕,就会出现应用程序无响应对话框,即ANR。
避免方法:Activity应该在它的关键生命周期方法(如onCreate和onResume)里面尽可能少的去做创建操作。潜在的耗时操作,例如网络或者数据库操作,或者高耗时的计算(如改变位图尺寸),应该在子线程或异步方式来完成。主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。
12.什么情况会导致Force Close,如何避免,能否捕获导致其的异常:
程序出现异常,比如nullpointer
避免:编写程序时,逻辑连贯,思维缜密。
能捕获异常,在logcat中能看到异常信息。
13.描述下Android的系统架构:
Android系统架构从上往下分为应用层、应用程序框架层、运行库、内核
14.IntentService有何优点:
Activity的进程,当处理Intent的时候,会产生一个对应的Service;Android的进程处理器现在会尽可能的不kill掉你,非常容易使用。
15.如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态:
重写onSaveInstanceState()方法,在此方法中保存需要保存的数据,该方法将会在activity被回收之前调用。通过重写onRestoreInstanceState()方法可以从中提取保存好的数据。
16.Android本身的API并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,你遇到过吗?若有的话,会导致什么问题?如何解决:
会,比如nullpointerException。遇到过,比如textview.setText()时,textview没有初始化。会导致程序无法正常运行,出现forceclose。打开控制台查看logcat信息找出异常信息,并修改程序。
17.请介绍下ContentProvider是如何实现数据共享的:
一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数据暴露的。
ContentProvider存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。
要想使应用程序的数据公开化,可以通过创建一个属于自己的ContentProvider或者将数据添加到一个已经存在的ContentProvider中,前提是有相同数据类型并且有写入ContentProvider的权限。
Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。
18.如何退出Activity?如何安全退出已调用多个Activity的Application:
对于单一Activity的应用来说,直接finish()即可。当然也可以用killProcess()和System.exit()这样的方法。
对于多个activity,1、记录打开的Activity:每打开一个Activity,就记录下来,在需要退出时,关闭每一个Activity即可。2、发送特定广播:在需要结束应用时,发送一个特定的广播,每个Activity接收到广播后,关闭即可。3、递归退出:在打开新的Activity时使用startActivityForResult,然后自己添加标志,在onActivityResult中处理,递归关闭,为了编程方便,最好定义一个Activity基类,处理这些共通问题。
19.系统上安装了多种浏览器,能否指定某浏览器访问指定页面:
通过直接发送Uri把参数带过去,或者通过manifest里面的intentfilter里的data属性。
20.NDK是什么:
NDK是一系列工具集合,NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和Java应用打成apk包。
NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu、平台等的差异,开发人员只需要简单的修改mk文件就可以创建出so文件。
21.嵌入式操作系统存储管理有哪几种:
页式、段式、段页,用到了MMU,虚拟空间等技术。
22.什么是嵌入式实时操作系统,Android操作系统属于实时操作系统吗:
嵌入式实时操作系统是指当外界事件或者数据产生时,能够接收并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、军事设备、航空航天等领域,对系统的响应时间有苛刻的要求。实时系统又分为软实时和硬实时两种,而Android是基于Linux内核的,属于软实时。
23.Android dvm的进程和Linux的进程,应用程序的进程是否同一个概念:
DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux中的一个进程,所以说可以认为是同一个概念。
24.说说mvc模式的原理,它在Android中的运用,Android的官方建议应用程序的开发采用mvc模式。何谓mvc:
mvc是model、view、controller的缩写,mvc包含三个部分:
模型(model
)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
控制(controller)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,响应用户出发的相关事件,交给m层处理。
Android鼓励弱耦合和组件的重用,在android中mvc的具体体现如下:
a、视图层(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如果对Android比较了解的话,就一定可以想到在Android中也可以使用javascript+thml等方式作为view层,当然这需要进行Java和javascript之间的通信,幸运的是,Android提供了它们之间非常方便的通信实现。
b、控制层(controller):Android的控制层的重任通常落在Activity的肩上,也就是不要在Activity中写代码,要通过Activity交给model业务逻辑层处理,这样做的另一个原因就是Android中的Activity的响应时间是5s,如果耗时的操作放在这里,程序就容易被回收掉。
c、模型层(model):对数据库、网络等的操作都应该放在model里面处理,当然对业务计算等操作也是必须放在该层的。
25.Android的启动模式有哪些,是什么含义:
启动模式分别为:standard、singleTop、singleTask、singleInstance
它们主要有如下不同:
a、如何决定所属task
standard和singleTop的activity的目标task,和收到的Intent的发送者在同一个task内,除非intent包含参数FLAG_ACTIVITY_NEW_TASK。如果提供了FLAG_ACTIVITY_NEW_TASK参数,会启动到别的task里。singleTask和singleInstance总是把activity作为一个task的根元素,他们不会被启动到一个其他task里。
b、是否允许多个实例
standard和singleTop可以被实例化多次,并且存在于不同的task中,且一个task可以包括一个activity的多个实例;singleTask和singleInstance则限制只生成一个实例,并且是task的根元素。singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不发送给新的实例。
c、是够允许其他activity存在于本task内
singleInstance独占一个task,其他activit不能存在那个task里;如果它启动了一个新的activity,不管新的activity的launch mode如何,新的activity都将会到别的task里运行(如同加了FLAG_ACTIVITY_NEW_TASK)。而另外三种模式,则可以和其他activtiy共存。
d、是否每次都生成新实例
standard对于每一个启动Intent都会生成一个Activity的新实例;singleTop的Activity如果在task的栈顶的话,则不生成新的该Activity的实例,直接使用栈顶的实例,否则,生成该Activity的实例;singleInstance是其所在栈的唯一activity,他会每次都被重用;singleTask如果在栈顶,则接收intent,否则,该intent会被丢弃,但是该task仍会回到前台。
26.跟activity和Task有关的Intent启动方式有哪些:
核心的Intent Flag:
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
FLAG_ACTIVITY_SINGLE_TOP
27.ListView的优化方案:
a、如果自定义适配器,那么在getView方法中要考虑方法传进来的参数contentView是否为null,如果为null就创建contentView并返回,如果不为null,则直接使用。在这个方法中尽可能少创建view。
b、给contentView设置tag,传入一个viewHolder对象用于缓存要显示的数据,可以达到图像数据异步加载的效果。
c、如果listView要显示的item很多,就要考虑分页加载,比如一共要显示100条或者更多的数据时,可以考虑先加载20条,等用户拉到列表底部时,再去加载接下来的20条。
28.Android中的动画有哪几类,它们的特点和区别是什么:
两种,一种是Tween动画,另一种是Frame动画。Tween动画,这种方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
29.Android中有哪几种解释xml的类,官方推荐哪种,以及它们的原理和区别:
xml解释主要有三种方式,SAX、DOM、PULL。常规的PC上开发使用DOM相对轻松些,但一些性能敏感的数据或手机上还是主要采用SAX方法,SAX读取是单向的,优点:不占内存空间,解释属性方便,但缺点就是对嵌套多个分支来处理不是很方便。而DOM方式会把整个xml文件加载到内存中,这里Android开发网提醒大家该方法在查找方面可以和XPath很好的结合,如果数据量不是很大推荐使用,而PULL常常用在J2ME对于节点处理比较好,类似SAX方式,同样很节省内存,在J2ME中经常使用的KXML库来解析。
30.View和SurfaceView的区别:
SurfaceView是从View基类中派生出来的显示类,直接子类有GLSurfaceView和VedioView,可以看出GL和视频播放以及Camera摄像头一般均使用SurfaceView。对于Surface相关的,Android底层还提供了GPU加速功能,所以一般实时性很强的应用中主要使用SurfaceView而不是直接从View构建;SurfaceView和View最本质的区别在于,SurfaceView是在一个新起的单独线程中可以重新绘制画面而View必须在UI的主线程中更新画面。
31.Android View的刷新:
Android中对View的更新有很多种方式,使用时要区分不同的应用场合,即多线程和双缓冲的使用情况。
a、不使用多线程和双缓冲
这种情况比较简单,一般只是希望在View发生改变时,对UI进行重绘,只需在Activity中显示的调用View对象中的invalidate()方法即可。系统会自动调用View的onDraw()方法。
b、使用多线程和不使用双缓冲
这种情况需要开启新的线程,新开的线程就不好访问View对象了,强制访问的话会报:android.view.ViewRoot$CalledFromWrongThreadException:Only the originalthread that created a view hierarchy can touch its views.这时候需要创建一个继承了android.os.Handler的子类,并重写handleMessage(Message
msg)方法。android.os.Handler是能发送和处理消息的,需要在Activity中发出更新UI的消息,然后在Handler,也就是说,在新线程创建并发送一个Message,然后在主线程中捕获、处理该消息。
c、使用多线程和爽缓冲
Android中SurfaceView是View的子类,同时也现实了双缓冲。可以定义一个它的子类并实现SurfaceView.Callback接口。由于实现SurfaceHolder.Callback接口,新线程就不需要android.os.Handler帮忙了。SurfaceHolder中lockCanvas()方法可以锁定画布,绘制完新的图像后再调用unlockCanvasAndPost(canvas)解锁(显示),还是比较方便的。
32.谈谈Android的IPC机制:
IPC是内部进程通信的简称,是共享“命名管道“的资源。Android中IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android中该机制,只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接口。Service端实现IPC接口,Client端调用IPC接口本地代理。
33.Application类的作用:
API里的第一句话是:
Base class for those who need to maintain global application state.
如果想在整个应用中使用全局变量,在java中一般是使用静态变量,public类型;而在Android中如果使用这样的全局变量就不符合Android的框架架构,但是可以使用一种更优雅的方式使用Application context。
首先需要重写Application,主要重写里面的onCreate方法,就是创建的时候,初始化变量的值。然后在整个应用中的各个文件中可以对该变量进行操作了。
启动Application时,系统会创建一个PID,即进程ID,所有的Activity就会在此进程上运行。那么在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以去到这些全局变量的值,换句话说,在某一个Activity中改变了这些全局变量的值,那么在同一个应用的其他Activity中的值就会改变。
34.Android中如何计算一张Bitmap的大小:
在SDK &= 3.1 直接调用Bitmap的getByteCount()方法。
在SDK & 3.1&& bitmap.getRowBytes()*bitmap.getHeight();
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:23015次
排名:千里之外
原创:22篇
转载:15篇
(1)(3)(1)(2)(1)(3)(4)(1)(2)(3)(1)(5)(1)(6)(3)Android四大组件的详细讲解_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
喜欢此文档的还喜欢
Android四大组件的详细讲解
A​n​d​r​o​i​d​ ​组​件​ ​A​n​d​r​o​i​d​组​件​A​n​d​r​o​i​d​组​件​A​n​d​r​o​i​d​组​件​A​n​d​r​o​i​d​组​件
阅读已结束,如果下载本文需要使用
想免费下载本文?
文档免下载券下载特权
全站付费文档8折起
千本精品电子书免费看
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢Android四大基本组件介绍与生命周期
,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器。
了解四大基本组件
通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。
进行通信。在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据。
(activity的门户)、VIEW、PICK、EDIT
等。而动作对应的数据则以URI
的形式进行表示。例如:要查看一个人的联系方式,你需要创建一个动作类型为VIEW 的intent,以及一个表示这个人的URI。
。相对于intent 是一个有效的做某事的请求,一个intentfilter 则用于描述一个activity(或者IntentReceiver)能够操作哪些intent。一个activity 如果要显示一个人的联系方式时,需要声明一个IntentFilter,这个IntentFilter 要知道怎么去处理VIEW 动作和表示一个人的URI。IntentFilter 需要在AndroidManifest.xml 中定义。通过解析各种intent,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时,activity 将会调用startActivity(Intent
myIntent)方法。然后,系统会在所有安装的应用程序中定义的IntentFilter 中查找,找到最匹配myIntent 的Intent 对应的activity。新的activity 接收到myIntent 的通知后,开始运行。当startActivity 方法被调用将触发解析myIntent 的动作,这个机制提供了两个关键好处:
能够重复利用从其它组件中以Intent 的形式产生的一个请求;
可以在任何时候被一个具有相同IntentFilter 的新的Activity 取代。
组件为默认启动类当程序启动时系统自动调用它
&intent-filter&
&action android:name="android.intent.action.MAIN"
&category android:name="android.intent.category.LAUNCHER"
&/intent-filter&
如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice 来响应它们收到的信息,或者用NotificationManager
来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
发送的,该方法第2个参数决定该广播的级别,级别数值是在 -1000 到 1000 之间 ,
发送的优先级越高;广播接收者接收广播时的级别级别(可通过intentfilter中的priority进行设置设为时优先级最高),同级别接收的先后是随机的,
再到级别低的收到广播,高级别的或同级别先接收到广播的可以通过abortBroadcast()方法截断广播使其他的接收者无法收到该广播,还有其他构造函数
initialCode,
initialData, initialExtras)方法,该方法具有有序广播的特性也有异步广播的特性;发送异步广播要:
&uses-permission
android:name="android.permission.BROADCAST_STICKY"
/&权限,接收并处理完Intent后,广播依然存在,直到你调用removeStickyBroadcast(intent)主动把它去掉
参数与Contex.startActivity()启动起来的Intent不同,前者可以被多个订阅它的广播接收器调用,后者只能被一个(Activity或service)调用
的类,重写onReceive()方法,广播接收器仅在它执行这个方法时处于活跃状态。当onReceive()返回后,它即为失活状态,注意:为了保证用户交互过程的流畅,一些费时的操作要放到线程里,如类名SMSBroadcastReceiver
注册有两种方法程序动态注册和AndroidManifest文件中进行静态注册(可理解为系统中注册)如下:
注册的广播,下面的priority表示接收广播的级别
android:name=".SMSBroadcastReceiver"
&&&intent-filter
android:priority = "" &
&&&&&action
android:name="android.provider.Telephony.SMS_RECEIVED" /&
&/intent-filter&
&/receiver
可交互时onResume()内注册BroadcastReceiver
unregisterReceiver(receiver);
生命周期只有十秒左右,如果在
onReceive()
内做超过十秒内的事情,就会报ANR(Application
No Response) 程序无响应的错误信息,如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由Service 来完成 . 这里不能使用子线程来解决 , 因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver 的所在进程很容易在系统需要内存时被优先杀死
, 因为它属于空进程
( 没有任何活动组件的进程
). 如果它的宿主进程被杀死
, 那么正在工作的子线程也会被杀死
. 所以采用子线程来解决是不可靠的
2. 关掉后,广播也就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用
如开机启动、电池电量变化、时间改变等广播
是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序。
,让使用者可以选择歌曲并播放歌曲。然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的。在这个例子中,媒体播放器这个activity 会使用Context.startService()来启动一个service,从而可以在后台保持音乐的播放。同时,系统也将保持这个service 一直执行,直到这个service 运行结束。另外,我们还可以通过使用Context.bindService()方法,连接到一个service 上(如果这个service 还没有运行将启动它)。当连接到一个service 之后,我们还可以service
提供的接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作。
2&AndroidManifast.xml节点里对服务进行配置
name=".SMSService"/&
需要通过Contex.startService()或Contex.bindService()启动服务
方法启动的服务于调用者没有关系,即使调用者关闭了,服务仍然运行想停止服务要调用Context.stopService(),此时系统会调用onDestory(),使用此方法启动时,服务首次启动系统先调用服务的onCreate()--&onStart(),如果服务已经启动再次调用只会触发onStart()方法
启动的服务与调用者绑定,只要调用者关闭服务就终止,使用此方法启动时,服务首次启动系统先调用服务的onCreate()--&onBind(),如果服务已经启动再次调用不会再触发这2个方法,调用者退出时系统会调用服务的onUnbind()--&onDestory(),想主动解除绑定可使用Contex.unbindService(),系统依次调用onUnbind()--&onDestory();
使一个应用程序的指定数据集提供给其他应用程序。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式,
类(见ContentProviderAccessApp例子)从该内容提供者中获取或存入数据.(相当于在应用外包了一层壳),
统一数据访问方式。
顶级的表示数据库名,非顶级的都是表名)这些内容提供者在SDK文档的android.provider Java包中都有介绍。见:/reference/android/provider/package-summary.html
&&&&&&&&&&&&&
├────Groups
&&&&&&&&&&&&&
├────People
&&&&&&&&&&&&&
├────Phones
&&&&&&&&&&&&&
└────Photos
&&&&&&&&&&&&&
└────Thumbnails
&&&&&&&&&&&&&
├────Albums
&&&&&&&&&&&&&
├────Artists
&&&&&&&&&&&&&
├────Audio
&&&&&&&&&&&&&
├────Genres
&&&&&&&&&&&&&
└────Playlists
Contact.People.Phones
Setting.System
对外共享数据的步骤
类并根据需求重写以下方法:
public boolean onCreate();//
public Uri insert(Uri uri, ContentValues initialValues);
public int delete(Uri uri, String selection, String[]
selectionArgs);
public int update(Uri uri, ContentValues values, String
selection,
String[] selectionArgs);
public Cursor query(Uri uri, String[] projection, String
selection,
String[] selectionArgs, String sortOrder) ;
public String getType(Uri uri)
参数,得到后需要进行解析然后做对应处理,Uri表示要操作的数据,包含两部分信息:
2.中的什么数据进行操作,一个Uri格式:结构头://authorities(域名)/路径(要操作的数据,根据业务而定)
content://com.bravestarr.provider.personprovider/person/10
的结构头已经由android规定为content://
程序,外部调用者可以根据这个找到他
路径的构建根据业务而定.路径格式如下:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
表行号为10的记录,可以这样构建/person/10
表的所有记录,可以这样构建/person
中使用&provider&对ContentProvider进行配置注册(内容提供者注册它自己就像网站注册域名),ContentProvider采用authoritie(原意授权,可理解为域名)作为唯一标识,方便其他应用能找到
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" &
&!-- authorities公司名.provider.SomeProvider--&
&provider android:name=".PersonProvider"
android:authorities="com.bravestarr.provider.personprovider"/&
每个Activity、service、Content
Provider内容提供者都需要在AndroidManifest文件中进行配置AndroidManifest文件中未进行声明的activity、服务以及内容提供者将不为系统所见,从而也就不可用,而BroadcastReceive广播接收者的注册分静态注册(在AndroidManifest文件中进行配置)和通过代码动态创建并以调用Context.registerReceiver()的方式注册至系统。需要注意的是在AndroidManifest文件中进行配置的广播接收者会随系统的启动而一直处于活跃状态,只要接收到感兴趣的广播就会触发(即使程序未运行)
属性指定了实现了这个activity 的Activity 的子类。icon 和label 属性指向了包含展示给用户的此activity 的图标和标签的资源文件。
发出的请求后,内容提供者被激活。而其它三种组件──activity、服务和广播接收器被一种叫做intent 的异步消息所激活
的激活通过传递一个Intent 对象至Context.startActivity()或Activity.startActivityForResult()以载入(或指定新工作给)一个activity。相应的activity 可以通过调用getIntent() 方法来查看激活它的intent。如果它期望它所启动的那个activity 返回一个结果,它会以调用startActivityForResult()来取代startActivity()。比如说,如果它启动了另外一个Activity
以使用户挑选一张照片,它也许想知道哪张照片被选中了。结果将会被封装在一个Intent 对象中,并传递给发出调用的activity 的onActivityResult() 方法。
对象至Context.startService()或Context.bindService()前者Android 调用服务的onStart()方法并将Intent 对象传递给它,后者Android 调用服务的onBind()方法将这个Intent 对象传递给它
对象至给Context.sendBroadcast() 、
会调用所有对此广播有兴趣的广播接收器的onReceive()方法,将intent 传递给它们
提出请求的时候激活。而一个广播接收器仅在响应广播信息的时候激活。所以,没有必要去显式的关闭这些组件。
方法来关闭一个activity
方法启动的服务要调用Context.stopService()方法关闭服务,使用bindService()方法启动的服务要调用Contex.unbindService ()方法关闭服务
四大组件的生命周期
的栈它由一个或多个Activity组成的共同完成一个完整的用户体验,
换句话说任务就是
了,那么你的activity 所需要做的工作就是把请求信息放到一个Intent 对象里面,并把它传递给startActivity()。于是地图浏览器就会显示那个地图。而当用户按下BACK 键的时候,你的activity 又会再一次的显示在屏幕上,此时任务是由2个应用程序中的相关activity组成的)栈底的是启动整个任务的Activity,栈顶的是当前运行的用户可以交互的Activity,当一个activity 启动另外一个的时候,新的activity 就被压入栈,并成为当前运行的activity。而前一个activity 仍保持在栈之中。当用户按下BACK 键的时候,当前activity 出栈,而前一个恢复为当前运行的activity。栈中保存的其实是对象,栈中的Activity
永远不会重排,只会压入或弹出,所以如果发生了诸如需要多个地图浏览器的情况,就会使得一个任务中出现多个同一Activity 子类的实例同时存在。
是作为一个整体进行移动的。整个的任务(即activity
栈)可以移到前台,或退至后台。举个例子说,比如当前任务在栈中存有四个activity──三个在当前activity 之下。当用户按下HOME
键的时候,回到了应用程序加载器,然后选择了一个新的应用程序(也就是一个新任务)。则当前任务遁入后台,而新任务的根activity
显示出来。然后,过了一小会儿,用户再次回到了应用程序加载器而又选择了前一个应用程序(上一个任务)。于是那个任务,带着它栈中所有的四个activity,再一次的到了前台。当用户按下BACK 键的时候,屏幕不会显示出用户刚才离开的activity(上一个任务的根
被弹出,而同一任务中的上一个activity 显示了出来。
的操作系统,可以在用手机听音乐的同时,也执行其他多个程序。每多执行一个应用程序,就会多耗费一些系统内存,当同时执行的程序过多,或是关闭的程序没有正确释放掉内存,系统就会觉得越来越慢,甚至不稳定。
引入了一个新的机制--
生命周期(Life
框架进行管理,而不是由应用程序直接控
的onCreate 方法),都会产生
。当系统内存即将不足的时候,会依照优先级自动进行进程(process)的回收。不管是使用者或开发者,
都无法确定的应用程序何时会被回收。所以为了很好的防止数据丢失和其他问题,了解生命周期很重要。
生命周期图
种状态、7个重要方法和3个嵌套循环
运行在屏幕前台(处于当前任务活动栈的最上面),此时它获取了焦点能响应用户的操作,属于运行状态,同一个时刻只会有一个Activity 处于活动(Active)或运行
失去焦点但仍对用户可见(如在它之上有另一个透明的Activity或Toast、AlertDialog等弹出窗口时)它处于暂停状态。暂停的Activity仍然是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接),但是当系统内存极小时可以被系统杀掉
遮挡时处于停止状态,它仍然保留着所有的状态和成员信息。只是对用户不可见,当其他地方需要内存时它往往被系统杀掉
,可以在程序中调用"finish"方法。
虚拟机会根据其内存回收规则来回收内存:
或Service/Intent Receiver
无关的进程(即优先回收独
因此建议,我们的一些(耗时)后台操作,最好是作成Service的形式
2.处于Stopped状态的)Activity
3.Service除非真的没有内存可用时会被销毁)
4.状态的)Activity
5.状态的)Activity
当Activity从一种状态进入另一状态时系统会自动调用下面相应的方
第一次被实例化的时候系统会调用,
次这个方法
、为Activity设置所要使用的布局文件2、为按钮绑定监听器等静态的设置操作
onCreate(Bundle savedInstanceState);
可见未获得用户焦点不能交互时系统会调用
onStart();
已经停止然后重新被启动时系统会调用
onRestart();
可见且获得用户焦点能交互时系统会调用
onResume();
时,在新Activity启动之前被系统调用保存现有的Activity中的持久数据、停止动画等,这个实现方法必须非常快。当系统而不是用户自己出于回收内存时,关闭了activity
之后。用户会期望当他再次回到这个activity
的时候,它仍保持着上次离开时的样子。此时用到了onSaveInstanceState(),方法onSaveInstanceState()用来保存Activity被杀之前的状态,在onPause()之前被触发,当系统为了节省内存销毁了Activity(用户本不想销毁)时就需要重写这个方法了,当此Activity再次被实例化时会通过onCreate(Bundle
savedInstanceState)将已经保存的临时状态数据传入因为onSaveInstanceState()方法不总是被调用,触发条件为(按下HOME键,按下电源按键关闭屏幕,横竖屏切换情况下),你应该仅重写onSaveInstanceState()来记录activity的临时状态,而不是持久的数据。应该使用onPause()来存储持久数据。
onPause();
被新的Activity完全覆盖不可见时被系统调用
用户调用finish()或系统由于内存不足)被系统销毁杀掉时系统调用,(整个生命周期只调用1次)用来释放onCreate
()方法中创建的资源,如结束线程等
onDestroy();
1.Activity从第一次调用onCreate()开始直到调用onDestroy()结束
2.Activity从调用onStart()到相应的调用onStop()
可以保持显示Activity所需要的资源。如在onStart()中注册一个广播接收者监听影响你的UI的改变,在onStop() 中注销。
3.Activity从调用onResume()到相应的调用onPause()。
:有3个Acitivity,分别用One,Two(透明的),Three表示,One是应用启动时的主Activity
时,它的次序是
onCreate (ONE) - onStart (ONE) - onResume(ONE)
打开透明Activity"按钮时,这时走的次序是
onPause(ONE) - onCreate(TWO) - onStart(TWO) -
onResume(TWO)
回到第一个界面,Two会被杀这时走的次序是
onPause(TWO) - onActivityResult(ONE) - onResume(ONE) - onStop(TWO)
- onDestroy(TWO)
打开全屏Activity"按钮时,这时走的次序是
onPause(ONE) - onCreate(Three) - onStart(Three) - onResume(Three) -
onStop(ONE)
回到第一个界面,Three会被杀这时走的次序是
onPause(Three) - onActivityResult(ONE) - onRestart(ONE) -
onStart(ONE)- onResume(ONE) - onStop(Three) -
onDestroy(Three)
退出应用时,它的次序是
onPause(ONE) - onStop(ONE) - onDestroy(ONE)&&&&&&&&&
:横竖屏切换时候Activity的生命周期
,并把各个生命周期打印出来
,得到如下信息
切换成横屏时
切换成竖屏时,发现打印了两次相同的log
,把该Activity添加android:configChanges="orientation",执行步骤3
,发现不会再打印相同信息,但多打印了一行onConfigChanged
的android:configChanges="orientation" 改成
android:configChanges="orientation|keyboardHidden",执行步骤3,就只打印onConfigChanged
的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
的生命周期
产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变
键(跟被完全覆盖是一样的):onSaveInstanceState --& onPause
--& onStop,再次进入激活状态时:
内做超过十秒内的事情,就会报ANR(Application No Response)
程序无响应的错误信息
方法开始到该方法返回结果后结束
生命周期图
从调用onCreate()开始直到调用onDestroy()结束
启动,而以调用Context.stopService()结束
方法建立,以调用Context.unbindService()关闭
()或bindService()时,Service第一次被实例化的时候系统会调用,整个生命周期只调用1次这个方法,通常用于初始化设置。注意:多次调用startService()或bindService()方法不会多次触发onCreate()方法
void onCreate():
或unbindService()来停止服务时被系统调用,(整个生命周期只调用1次)用来释放onCreate()方法中创建的资源
void onDestroy():
方法启动的服务
的Intent对象。如音乐服务会打开Intent 来探明将要播放哪首音乐,并开始播放。注意:多次调用startService()方法会多次触发onStart()方法
void onStart(Intent intent):
方法启动的服务
的Intent 的对象。注意:多次调用bindService()时,如果该服务已启动则不会再触发此方法
IBinder onBind(Intent intent):
时系统调用此方法,Intent 对象同样传递给该方法
后,新的才会调用该方法
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 android是什么 的文章

 

随机推荐