Android基本组件的介绍
应用程序的生命周期
应用程序进程从创建到结束的全过程便是应用程序的声明周期。与其他系统不同的是,Android应用程序的生命周期是不受进程自身控制的,而是由Android系统来决定的,一般来说,Android系统会根据应用程序对用户的重要性及当前系统的负载来决定声明周期的长短。
Android系统将所有的进程大致分为以下5类进行管理。
1.前台进程:就是当前正在前台运行的进程,说明用户当前正通过该进程与系统进行交互,所以该进程为最重要的进程,除非系统的内存已经到不堪重负的程度,否则系统是不会讲该进程终止的。
2.可见进程;
3.服务进程:服务进程便是拥有Service的进程,该进程一般是在后台为用户服务的,例如音乐播放器的播放、后台的任务管理等。
4.后台进程:该进程一般对用户的作用不大,缺少该进程并不会影响用户对系统的体验。如果系统需要终止某个进程才能保证系统的正常服务时,该进程就有很大几率会被终止。
5.空进程:空进程是对用户没有任何作用的进程,该进程一般是为缓存机制服务的,当系统需要终止某个进程以保证系统的正常服务时,会首先将该进程终止。
使用好生命周期方法有一下几个好处:
1.避免当用户接到电话或者转而使用其他应用程序时正在使用的应用程序崩溃;
2.当用户不是主要使用这个应用程序时,不会消灭重要的系统资源;
3.当用户暂时退出然后返回应用程序时不会丢失用户的进程;
4.在横屏和树屏时不会崩溃,也不会丢失用户的进程。
当进入程序时,Android系统会马上调用onCreat()方法来创建主Activity,然后瞬间调用onStart()方法让主Activity启动,紧接着又会调用onResume()方法来使该Activity进入Resume状态,可以理解为待命状态,然后等待用户的操作,如果用户进行接电话,或者关闭屏幕灯操作,系统就会继续调用生命周期方法,使Activity的生命周期状态发生变化。所以一个Activity永远不会处于onCreat和onStart状态,因为它们都是瞬时就完成的。
onDestroy()方法:这个方法使Activity完全从内存中释放出来,但是大多数的程序都不需要实现这个方法,因为当Activity在pause或者stop状态下的系统资源消耗应该是极小的,如果程序存在后台进程,使程序的在pause和stop状态下的资源消耗也很大的话,就需要实现onDestroy方法,onDestroy方法只会在Activity在pause或者stop状态下被调用,只有一种例外,就是在onCreat中调用了finish()方法,这会使Avtivity直接被destroy,这种情况通常用于过度Activity中,即打开这个Avtivity只是为了打开另一个Activity。
onRestart方法:当程序被destroy后再次被使用就会调用onRestart方法。当手机屏幕在横屏和竖屏之间切换时候也会有这样一个过程,先被Destroy然后被Restart。被Destroy之后的Activity当被重新启动后,会保存它被Destroy时的状态,例如文本中的文字,是通过buudle保存的。但是要实现这个,就必须让Activity中的每个View都有唯一的ID。
Activity简介
Activity是应用程序的表示层,Activity一般通过View来实现应用程序的用户界面,相当于一个屏幕,用户与程序的交互是通过该类实现的。
下面着重介绍Activity的生命周期,它的生命周期主要包括3个状态,各种状态之间的切换时通过各种回调方法实现的。
1.运行态:处于运行态的Activity拥有焦点,只在于用户进行交互,该状态的Avtivity可以为用户提供信息并接收用户的事件响应。
2.暂停态:处于暂停态的Activity失去焦点,一般被运行态的Avtivity代替,当前台显示的Activity不是全屏时,可以看到暂停态的Activity。
3.停止态:处于停止态的Activity没有焦点,并且是不可见的,系统随时可以将其释放。
Activity的显示内容是由View对象提供的,每个View对象管理一个矩形区域。Android已经自带了很多View对象,例如按钮、菜单、文本框等,而除了使用Android自带的View外,还可以自定义View。
创建Activity的要点:
1.一个Activity就是一个类,并且这个类要继承Activity。
2.需要复写onCreate方法
3.每一个Activity都需要在AndroidManifest.xml文件中进行配置
4.为Activity添加必要的控件。
实现点击一个Activity中的Button跳转到另外一个Activity:点击Send按钮
首先在Layout文件中对Activity_main文件进行修改,在Button标签中添加:android:onClick="sendMessage"。其中sendMessage属性用来指定当代点击Send按钮时所要调用的方法,这个方法应该在MainActivity中进行声明,且这个方法的命名有一定的规定如下:
1.方法必须是公用的,即public;
2.方法的返回值必须是void;
3.必须有一个View作为参数,这个View就是被点击的View。
具体的代码如下:
![](https://img-blog.csdn.net/20130729101045328?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGh6ejE1MDQwNDIwMDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
Service简介
Service运行在系统的后台,用户是看不到,它是一些持续运行的程序,比如音乐播放,或者下载等。
Service不生产UI,是不可见的。
所有用户实现的Service必须继承系统的Service类,并在配置文件中进行注册。
Service的启动方式有两种:
1.startService方式启动:Activity调用startService方法启动Service,此时会依次调用onCreat和onStart方法来启动Service,当调用stopService方法结束Service时,又会调用onDestroy方法结束Service。Service同样可以在自身调用stopService或stopSelf方法来结束Service。
2.bindService方式启动:Activity调用bindService方法启动Service,此时会依次调用onCreat和onBind方法启动Service。
Content Provider简介
数据在Android当中是程序私有的。
Content Provider提供了多个程序间数据交互的机制。
Content Provider暴露出许多标准的API来对数据进行操作。
Broadcast Receiver(广播接收)简介
Broadcast Receiver为用户接收广播通知的组件,当系统或某个应用程序发送广播时,可以使用Broadcast组件来接收广播消息并做相应处理。
Broadcast Receiver负责对外部事件进行响应。
Broadcast Receiver不生成UI,是不可见的。
所有用户实现的Broadcast Receiver都必须继承系统的Broadcast Receiver类,并在配置文件中注册。
用户可以通过Context.sendBroadcast()将自己的intent广播出去,其他程序通过自身Receivers截获后进行时间处理。
Intent(意图)和IntentFilter简介
4大组件,3个都需要Intent的支持。它可以理解为一个传递的媒介。
Intent的作用:
1.传递Intent启动一个Activity。startActivity,startActivityForResult。两个Activity可以不再同一个应用程序中,例如启动一个发短信的Activity.
2.传递Intent启动一个Service。startService,bindService(绑定)。
3.通过Intent新加入一个广播。sendBroadcast,sendOrderedBroadcast(),sendStickyBroadcast().
4.执行一个查询,ContentResolver的query().
Intent(意图,可以理解为一个请求)对象包含了一下一组信息:
1.component name:操作的对象,就是指定了需要进行操作的另一个组件
2.Action:对目标组件要进行的操作,官方文档给出了它的一些值
3.Data:传送的数据
4.Catelory:
5.Extras:intent中附加的额外信息
6.Flags:
Manifest配置文件介绍
<uses-sdk>:这里描述了程序可用的最小和最大Android版本。例如:
![](https://img-blog.csdn.net/20130727230906359?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGh6ejE1MDQwNDIwMDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
如下是一个Activity标签,每个Activity必须在Manifest中对应一个标签。
<activity>
……
</activity>
如下是一个主Activity的标签,它作为APP的入口,其中intent-filter标签,是表面这个avtivity是程序的入口。
<activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
如果没有action和category的话,程序就不会在手机中生成图标,就无法进入程序。
Manifest文件时如何解析的:1.系统启动的时候,PackagedManageService读取Manifest文件,将解析得到的信息写入到系统共享内存中。 2.应用程序启动的时候,Launcher进行系统级判断,比如最小SDK等。 3.四大组件在需要的时候实例化。