资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2012/10/8,#,智能移动平台应用开发,1,:,Android,应用程序架构及其生命周期,陈辰,复旦大学软件学院,Android,应用程序架构,一般情况,Android,应用程序是由以下四种组件所组成的:,活动,(Activity),服务,(Service),广播接收器,(Broadcast Receiver),内容提供器,(Content Provider),Android,应用程序架构,活动,(Activity),一般,所指的,活动(,Activity,)是,用户界面。一个应用程序可能有一个或以上的活动存在,每个活动也都会有自己,的,View,。,所有的活动在系统里由活动堆栈所管理,当一个新的活动被执行后,它将会被放置到堆栈的最顶端,并且变成“,running activity”,,而先前的活动原则上还是会存在于堆栈中,但它此时不会是在前景的情况,除非新加入的活动离开,。,Android,应用程序架构,服务,(Service),服务是在背景长时间运行的应用组件,不和用户直接进行互动。,例如:某服务可能在后台播放音乐,而用于在执行其他的操作,或者它通过网络抓取资料或者执行某些计算,将结果提供給活动(,Activity,)。,Android,应用程序架构,广播接收器,(Broadcast Receiver,),广播接收器负责接受和响应通知,很多通知源自于系统所发送的,例如:发送时区变换的通知,电池电量不足,或用户改变语言设置,。,应用程序也可以发出广播通知,举例来说,通知其它应用程序,数据已下载完毕,可供使用,。,应用程序,可以拥有任意数量的广播接收器来接收任何的通知。另外也可以启动活动(,Activity,)去响应接收到的通知,或利用通知管理器,(,Notification Manager,),来通知使用者。,Android,应用程序架构,内容提供者,(Content Provider,),内容提供者将应用程序数据组合成特定的集合供其它应用程序使用。数据可以是储存在文件、,SQLite,数据库,或是其它任何用户可以存取资料的地方,。,内容提供者继承於内容提供者基础类别,并实现一组标准的方法,使应用程序可以检索和储存它控制的数据,。,应用程序不是直接调用这些实现方法。而是通过内容解析器,(ContentResolver),对象调用方法。内容解析器能够通知任何的内容提供者,并可以参与这些内容提供者进程间的管理。,程序的生命周期,(Life Cycle),何谓生命周期,?,应用程序,组件都具有,生命周期;,从,Android,产生回应一个,Intent,对象开始,到实际被释放,为止;,程序的,生命周期,(Life Cycle,),一个,Activity,基本上有三个生命状态:,active,或,running,(,一个,Activity,在屏幕的最上层,时,也就是在系统,堆栈中的最,顶端),Paused,(,一个,Activity,失去焦点,(Focus,),,但,还看得到它的,画面),Stop,(,被其它的,Activity,完全遮蔽,),程序的,生命周期,(Life Cycle,),当一个,Activity,处于,Pause,或,Stop,的状态时,系统可以要求,Activity,结束或删除它,当它再度呈现在使用者面前时,要能完整的重新启动及回复先前的状态。,应用程序存在与否并非由应用程序所自行决定,而是由,Android,系统通过运行机制决定,。,程序的生命周期,(Life Cycle),Activity,栈,遵循“后进先出”的规则,程序的,生命周期,(Life Cycle,),Activity,状态,间的切换包含了调用下列几种回调方法,:,public class MyActivity extends Activity ,protected void onCreate(Bundle savedInstanceState);,protected void onStart();,protected void onRestart();,protected void onResume();,protected void onPause();,protected void onStop();,protected void onDestroy();,程序的生命周期,(Life Cycle),函数,是否,可终止,说明,onCreate(),否,Activity,启动后第一个被调用的函数,常用来进行,Activity,的初始化,例如创建,View,、绑定数据或恢复信息等。,onStart(),否,当,Activity,显示在屏幕上时,该函数被调用。,onRestart(),否,当,Activity,从停止状态进入活动状态前,调用该函数。,onResume(),否,当,Activity,可以接受用户输入时,该函数被调用。,onPause(),否,当,Activity,进入暂停状态时,该函数被调用。主要用来保存持久数据、关闭动画、释放,CPU,资源等。该函数中的代码必须简短,因为另一个,Activity,必须等待该函数执行完毕后才能显示在界面上。,onStop(),是,当,Activity,不对用户可见后,该函数被调用,,Activity,进入停止状态。,onDestroy(),是,在,Activity,被终止前,即进入非活动状态前,该函数被调用。有两种情况该函数会被调用:,(1),当程序主动调用,finish(),函数;,(2),程序被,Android,系统终结。,程序的生命周期,(Life Cycle),onRestoreInstanceState(),和,onSaveInstanceState(),不属于生命周期的事件回调函数,但可以用于保存和恢复,Activity,的界面临时信息,onSaveInstanceState(),会将界面临时信息保存在,Bundle,中,,onCreate(),和,onRestoreInstanceState(),都可以恢复这些保存的信息,简化的办法是使用,onCreate(),恢复,但有些特殊的情况下还是需要使用,onRestoreInstanceState(),函数恢复,必须在界面完全初始化完毕后才能进行的操作,或需要由子类来确定是否采用缺省设置等,函数,说明,onSaveInstanceState(),暂停或停止,Activity,前调用该函数,用以保存,Activity,的临时状态信息,onRestoreInstanceState(),恢复,onSaveInstanceState(),保存的,Activity,状态信息。,Activity,的生命周期,(Life Cycle,),程序的,生命周期,(Life Cycle,),Activity,的,整个生命周期,一,个,Activity,的,整个生命周期是由,onCreate(Bundle),开始,直到,onDestroy(),结束;,一,个,Activity,可以,把所有的资源设置写在,onCreate,中,直到,onDestroy(),时,再释放,出来;,举例来说,当需要一个线程在后台执行网络下载数据,这个线程就可以在,onCreate(),中建立起来,一直到,onDestroy(),再把线程,释放;,Activity,的生命周期,生命周期,程序的生命周期,(Life Cycle),Activity,的,可视生命周期(,Visible Lifetime,):,一,個,Activity,的,Visible Lifetime,则是指在,onStart(),到,onStop(),之间,称为“可视生命周期”,在这段时间内,用户可以在屏幕上看见,Activity,,但这个,Activity,不见得一定在,前景跟使用,者直接,互动;,举例来说,:你可以在,onStart(),注册一个,BroadcastReceiver,用来监控并改变你的,UI,,当使用者不想再看你所呈现的结果时,在,onStop(),删除注册的,roadcastReceiver,。,onStart,(),跟,onStop(),可以在,Activity,在,Visible,及,Hidden,两个状态切换时多次被调用执行,Activity,的,可视生命周期(,Visible Lifetime,),可视生命周期,程序的生命周期,(Life Cycle),Activity,的前台生命周期,(,Foreground Lifetime,),ForegroundLifetime,则是指,onResume(),到,onPause(),之间,在这个时期的活动是在所有的活动的前面,并且直接跟使用者进行互动。,一,个,Activity,能,很频繁的在,Resume,及,Pause,这两个状态切换,所以在,onResume(),及,onPause(),中实现的程序应尽量精简,。,Activity,的前台生命周期,(,Foreground,Lifetime,),前台生命周期,程序的生命周期,(Life Cycle),服务(,Service,),在每一个包含服务组件的,AndroidManifest.xml,文件中,必须有一个相应的,声明。,服务可以用两种方式调用:,服务自行启动和运行,直到某项操作停止或自行停止时。,它,可被提供给对外用户的接口所操作。客户端与服务对象建立连接并调用服务。,程序的生命周期,(Life Cycle),服务,上述两种模式不是完全分开的,且可以绑定一个被,startService(),启动的服务,。,例如,一个背景音乐服务可以被一个,Intent,对象定义音乐播放,通过调用,startService(),启动。随后,使用者想操作一些控制或获得正在播放的音乐信息时,,Activity,可通过,bindService(),建立连接,。,这种情况下,,stopService(),不会停止服务,一直到最后一个绑定的连接关闭时。,与活动相似,服务也有一些生命周期方法,程序员可以实现它们去改变状态,但方法比活动要少。,程序的生命周期,(Life Cycle),服务的整个生命周期(,Entire Lifetime,),服务的整个生命周期是在,onCreate(),开始,于,onDestroy(),结束。,类似活动(,Activity,),服务在,onCreate(),方法中进行初始化,在,onDestroy(),方法中释放所有系统资源。,例如,音乐播放服务可能在,onCreate(),方法中建立音乐播放线程,在,onDestroy(),方法中停止线程。,程序的生命周期,(Life Cycle),服务,的,Active Lifetime,在,调用,startService(),方法后,此方法被,Intent,对象指示去调用,onStart(),方法。,音乐服務将分析这个,Intent,来确定播放什么音乐,并开始播放,程序的生命周期,(Life Cycle),广播,接收器,(Broadcast Receiver,),广播接收器只有一个生命周期方法,:,void onReceive(ContextcurContext, IntentbroadcastMsg),当广播消息到达接收者时,,Android,调用,onReceive(),方法,并传递保存着讯息的,Intent,对象。,当调用该方法时,广播接收者被认为是,active,的。当,onReceive(),结束时,它就是,inactive,的。,拥有活动的广播接收者进程,会被保护不被清除。但是只拥有,inactive,的广播组件时,当系统认为内存应该被其他进程使用时,可以在任何时间被系统清除。,程序的生命周期,(Life Cycle),广播接收器,(Broadcast Receiver),当与广播组件频繁互动时,会产生一些问题,因此,某些任务在独立的线程中操作,与管理其他的用户组件的主线程是分开的。,如果,onReceive(),产生线程然后返回,这个完整的进程,包括新产生的线程,将被判断为,inactive,的,会被标记为将被清除的进程。,解决这个问题的办法是为,onReceive(),启动一个,Service,,让,Service,接手这工作,因此系统会认为在进程中仍然有,active,的工作在进行。,程序的生命周期,(Life Cycle),进程与,生命周期,(,Process,and,Lifecycle,),Android,系统会尽可能保存,各个应用程序,进程,但当内存不够用时,系统需要删除较旧的,进程;,为了判断哪些进程该被保留,哪些进程该被清除,,Android,把每一个进程放到一个,优先级,列表,组件的运行和状态是基于这个,优先级,列表,程序的生命周期,(Life Cycle),进程与生命周期,(,Process and Lifecycle),该,优先权分五,层。下面的列表显示优先权,层次顺序:,前台进程,可视进程,服务进程,后台进程,空,进程,程序的生命周期,(Life Cycle),前台进程,前台进程是,Android,系统中最重要的进程,进程中的,Activity,正在与用户进行交互;,Service,被,Activity,调用,而且这个,Activity,正在与用户进行交互;,Service,正在执行声明周期中的回调函数,如,onCreate(),、,onStart(),或,onDestroy(),;,进程的,BroadcastReceiver,正在执行,onReceive(),函数;,程序的生命周期,(Life Cycle),可见进程,可见进程指部分程序界面能够被用户看见,却不在前台与用户交互,不响应界面事件的进程,如果一个进程包含,Service,,且这个,Service,正在被用户可见的,Activity,调用,此进程同样被视为可见进程,服务进程,包含已启动服务的进程,Android,系统除非不能保证前台进程或可视进程所必要的资源,否则不强行清除服务进程,程序的生命周期,(Life Cycle),后台进程,指不包含任何已经启动的服务,而且没有任何用户可见的,Activity,的进程,Android,系统中一般存在数量较多的后台进程,空进程,空进程是不包含任何活跃组件的进程,程序的生命周期,(Life Cycle),优先级决定与变化规则,进程的优先级取决于所有组件中的优先级最高的部分,进程的优先级会根据与其他进程的依赖关系而变化,程序的生命周期,(Life Cycle),Android,会基于拥有着当前活动的进程中,各组件重要性,尽量给予它最高级别。,运行服务,的,进,程,比运行背景活动的进程级别要高,一个活动需要开始执行一个长时间操作时,应启动一个服务,而不是自行建立一,个,进,程,。,同样的原因,广播接收器也应该调用服务而不是将一个长时间操作放到自行建立,的,进,程,中处理,。,Android,应用程序项目结构,AndroidManifest,定义,AndroidManifest,定义,AndroidManifest,定义文件是一个用来描述应用程序整体信息的配置文件。,每个应用程序都需要,AndroidManifest.xml,,它提供了应用程序的必要信息给,Android,系统使用。,AndroidManifest,定义,AndroidManifest,定义,此定义文件的重点就是其中的目标过滤器,(Intent Filters),,这些过滤器描述了什么时间及情况下让,Activity,启动。,除了描述应用程序的活动、内容提供者、服务和,Intent,接收器,也可以在,AndroidManifest.xml,档中指定权限和安全控制测试。,AndroidManifest,定义,为文件根节点,描述了程序的所有内容,在其节点下面内可放置各种标签:,1. ,请求一个安全授权,你的程序必须被授予该权限才能正确的操作。一个,manifest,可以包含零个或多个这样的节点。,2. ,声明一个安全授权,它用来限制哪些应用可以使用程序的组件和功能。一个,manifest,可以包含零个或多个这样的节点。,3. ,声明一个,instrumentation,组件可用于测试这一个或别的包的代码。一个,manifest,可以包含零个或多个这样的节点,。,AndroidManifest,定义,4. ,声明应用程序内应用级别组件的根节点。该节点能够描述应用程序的全局属性,例如标签、图标、主题、需要的权限等等。一个,manifest,可以包含零个或一个这样的节点(多个,application,节点是不允许的,),AndroidManifest,定义,在,节点,下,可以包含下列零个或多个以下每个,组件:,:活动,(Activity),是应用程序与用户互动的最主要机制,当一个应用程序运行的时候,用户看到的第一个画面就是,Activity,。,:一个,BroadcastReceiver,可以使应用程序接收数据变化和行为发生的通知,即使这个应用程序没有在运行也同样可以。与,Activity,标签一样,你可以选择包含一个或多个该,receiver,支持元素或值。,:服务,(Service),是一个在后台可以运行任意长时间的组件。同,activity,标签一样,你可以选择包含一个或多个该服务支持元素或值。,:组件管理器,(ContentProvider),用来管理持久数据和向其它应用发布数据的组件。你也可以按照活动的,(activitys),中描述附加一个或多個,值。,AndroidManifest,定义,在,中,可以包含如下组件:,:以,一個,IntentFilter,的形式声明组件所支持的特定,Intent,值。除了可以在此元素下指定的各种值,也可以在此对属性设定以支持标签,(label),、图标,(icon),和所描述动作,(action),的其它,信息,;,:该,组件支持的,Intent,action;,:该,组件支持的,Intent,目录,(Intent category,),:该,组件支持的,Intent data MIME type,、,Intent data URI scheme,、,Intent data URI authority,或,Intent data URIpath,。你也可把一个或多個,meta-data,与活动,(activity),关联,其它使用者可以通过这些,meta-dada,取得关于这,个,活动的任意,讯息,;,:向,Activity,增加新的,metadata,,使用者可以通过,ComponentInfo.metaData,获取该数据。,AndroidManifest,定义,中的组件,结构,:,Android,资源文件设计,Android,资源文件设计,文字资源文件,- strings.xml,颜色设置资源文件,- colors.xml,尺寸定义资源文件,- dimens.xml,样式资源文件,- styles.xml,窗口布局资源文件,- layoutmain.xml,动画资源文件,- anim.xml,图文件资源目录,-,drawable,文字资源文件,文字资源文件,( strings.xml),开始从最常使用的文字资源文件,strings.xml,学习,Hello World, Main!,HelloWorld,文字资源文件,可以在,JAVA,原始文件中使用这些变量:,用法:,R.string.,字符串名称,范例,:,String hello = this.getString(R.string.hello,);,package,hello.world;,import,android.app.Activity;,import,android.os.Bundle;,public,class,Main,extends,Activity ,/* Called when the activity is first created. */,Override,public,void,onCreate(Bundle savedInstanceState) ,super,.onCreate(savedInstanceState);,setContentView(R.layout.,main,);,String,hello = getString(R.string.,hello,);,文字资源文件,也可以让,XML,资源文件使用字符串资源,:,用法:,string/,字符串名称,范例,:,android:app_name=”string/hello,”,LinearLayout,xmlns:android,=, blueColor = getResources.getDrawable(R.drawable.grey);,在,XML,文件中使用,用法:,drawable/,颜色变量名称,范例,:,android:background=”drawable/blue”,尺寸定义资源文件,尺寸定义资源文件,- dimens.xml,首先于,res/values,中新增,dimens.xml,,此文件可针对字符串个别设定字号,像是,px,、,in,、,mm,、,pt,、,dp,、,dip,、,sp,等等尺寸。,px(Pixel),以画面真实的像素做为单位,mm(Millimeter),以画面的毫米为单位,in(inches),以画面的英吋作为单位,pt(Points),一点的单位为,1/72,英吋,dp&dip,相对于,160dpi,的屏幕中的一个像素,sp,随着屏幕大小改变的一个像素,尺寸定义资源文件,在,JAVA,源文件中使用,用法:,R.dimen.,尺寸变量名称,范例,:,float dimen = getResource().getDiemnsion(R.dimne.px);,在,XML,文件中使用,用法:,dimen/,尺寸变量名称,范例,:,android:textSize=”dimen/px”,样式资源文件,样式资源文件,- styles.xml,Style,资源文件是类似一般手机上可套用的主题,它可以整合许多属性,并提供给系统使用。,在此文件中主要是使用,定义手机程序布局,并加入,标签作细项设定。,#ffff0000,#ff00ff00,样式资源文件,在,JAVA,源文件中使用,用法:,R.style,.,样式变量名称,范例,:,setTheme(R.style.,music_s,tyle,);,/* Called when the activity is first created. */,Override,public,void,onCreate(Bundle savedInstanceState) ,super,.onCreate(savedInstanceState);,setContentView(R.layout.,main,);,setTheme(R.style.,music_style,);,样式资源文件,在,XML,文件中使用,用法:,style,/,样式变量名称,范例,:,android:theme=”,style/music_style,”,窗口布局资源文件,窗口布局资源文件,- layout,xxx,.xml,在,Android,平台里,用户界面都是通过,ViewGroup,或,View,类别来显示,,ViewGroup,和,View,是,Android,平台上最基本的用户界面组件。,我们可以通过程序直接调用的方法,或是使用,XML,文件,来描述用户界面。,窗口布局资源文件,LinearLayout,xmlns:android,=, Called when the activity is first created. */,Override,public,void,onCreate(Bundle savedInstanceState) ,super,.onCreate(savedInstanceState);,setContentView(R.layout.,main);,setTheme(R.style.,music_style,);,动画资源文件,动画资源文件,- anim.xml,首先在,res,底下建立,anim,文件夹,并在文件夹中建立,xxx,.xml,,通过这个资源文件可以达成程序里面的一些动画效果,Animation,主要有两种动画模式:一种是补间动画,另一种是帧动画。,补间动画又分为,Alpha Animation,(透明度转换)、,RotateAnimation,(旋转转换)、,ScaleAnimation,(缩放转换)、,TranslateAnimation,(位置转换)。,动画资源文件定义,set,xmlns:android,=, ani = AnimationUtils.loadAnimation(this, R.anim.anim,);,View.startAnimation(ani);,this.overridePendingTransition(R.anim.anim2, R.anim.anim1); /,淡入淡出,图文件资源目录,图文件资源目录,(drawable),所有程序的图标、背景图片等等,皆需放在,drawable,目录底下,Android,会为每个放置在,res/drawable,目录下的图片文件产生,ID,,,ID,就是这个图片的文件名,(,不包含扩展名,),,可在,R.java,文件中的,drawable,中查询。,图文件资源目录,在,JAVA,源文件中使用,用法:,R.drawable.,图片,名称,范例,:,Drawable bitmap = getResources().getDrawable(R.drawable.icon);,图文件资源目录,在,XML,文件中使用,用法:,drawable,/,图片,名称,范例,:,android:background=drawable/icon,
展开阅读全文