《Android Dev Guide》系列教程3:应用基bu础之组件篇2
懒骨头(http://blog.csdn.com/iamlazybone)
激活组件: intents
当ContentResolver接收到一个请求时,运行content providers。其他三个组件activities、services、broadcast receiver被Intents异步消息启动。intent 里包含着所传递消息的内容。对于activity和services来说,intents定义了请求,指定了目标数据的URI。例如,可以让发送一个请求让用户接受或者输入一些文本信息。对broadcast receivers来说,intents定义了一些声明的事件(?),例如:他可以在相机的按钮被按下时发出一些信息。
下面是每个组件类型对应的启动方法
@ Context.startActivity() 和 Activity.startActivityForResult()方法可以启动一个activity。activity可以查看启动他的的intent,通过调用getIntent()方法。Android 系统调用onNewIntent()方法来传递intents。
一个activity经常会启动下一个activity。使用startActivityForResult() 代替 startActivity()方法可以从启动的activity获取一些返回值。例如,可以启动一个activity让用户选择一张图片并且返回所选的图片,被传递回来的数据被送到前一个activity的onActivityResult()方法里。
@ Context.startService()可已启动一个service。Android通过service的onStart()方法传递intent对象。类似的,intent可以传递至Context.bindService()来获取一个正在运行的服务的句柄,这个服务可通过onBind()方法获取这个intent对象(如果服务没有启动可以通过bindService()来启动服务)。例如,一个activity可以很容易的建立一个到音乐播放服务的连接,他可以提供给用户一些控制音乐播放器的借口。activity可以调用bindService()方法来建立连接,然后调用已经定义的关于播放器的一些方法。
@ 应用程序可以通过传递intent来初始化一个Broadcast广播,相关方法:Context.sendBroadcast()、Context.sendOrderedBroadcast()、Context.sendStickyBroadcast() ,activity会调用所有对此广播关注的广播接收器,然后将intent传递给这些方法。
关闭组件
只有当内容提供商从内容接收者接收到一个请求时才会启动。广播消息接受者只有当接收到一个广播消息时才会被启动。所以他们不需要手动关闭。
activity则另当别论,他们提供给用户界面,他们和用户保持长时间的对话并且保持活跃状态,甚至空闲时,仍然保持联系。类似的,services也会运行很长一段时间。所以Android提供关闭activity和services的一些方法:
@ finish()会关闭activity,那些被startActivityForResult()方法启动的activity可以通过finishActivity()关闭。
@ services 可以通过 stopSelf()和Context.stopService() 方法被关闭。
当系统不再使用他们或者没有足够内存世,系统可以自行关闭一些组件,后面的章节会讨论这种情况。
manifest 文件
在Android启动一个应用组件前,必须让activity知道那些组件的存在,所以应用程序必须在manifest文件里声明自己的组件,并把manifest文件打包到Android 包里。apk文件包含程序的代码、文件和资源。
manifest是一个结构化的xml文件,被命名为AndroidManifest.xml,里面声明了应用的组件、一些除了系统默认库的用户自定义库和程序希望被授予的一些权限。
manifest主要任务是告诉Android应用程序的部件。例如,activity可以这样声明:
<activity>元素的name属性是继承自activity基类的activity的类名,icon和label指向了资源文件。
别的组件声明起来就简单的多了。服务的标签:<service>,广播接受者标签:<receiver>,内容提供商标签:<provider>。
activity、services和内容提供商不在这里声明的话是不能运行的。然而,广播可以在manifest文件里声明或者动态的在代码里创建并且调用Context.registerReceiver()方法声明。
Intent filters
Intent对象可以显示的定义一个目标组件。那样的话,Android就可以找到并运行它。如果目标组件没有明确的定义出来,Android会相应最佳的组件来响应这个Intent,这是通过比较<intent filters>标签里的所有组件来选择相应的。intent filters (Intent过滤器)告诉Android所有可以处理的组件。和组件的其他重要信息一样,在manifest文件里声明。
下面是一个添加了两个Intents过滤器的例子:
例子中的第一个过滤器是常见的。他标记了所有显示给用户让用户选择启动的组件。换句话说就是程序的入口点。是用户启动程序后最先见到的。
第二个过滤器声明了可以提供(perform)的特殊数据类型。(对否?呵呵)
一个组件可以有数个Intent过滤器。每一个都可以声明不同的权限。如果没有添加过滤器的话,只能使用Intent方式被启动。
对于广播接受者来说,如果在代码中被创建和注册,那么直接被实例化成一个IntentFilters对象,其他的过滤器都在manifest文件里被声明。
后记:
自己都觉得语句不通~原谅骨头吧~给大家个找错的机会~哈哈~