《android_学习笔记》由会员分享,可在线阅读,更多相关《android_学习笔记(50页珍藏版)》请在金锄头文库上搜索。
1、Android Activity 和 Intent 机制学习笔记ActivityAndroid 中,Activity 是所有程序的根本,所有程序的流程都运行在 Activity 之中,Activity 具有自己的生命周期(见 http:/ onSaveInstanceState 保存其状态)。对于 Activity,关键是其生命周期的把握(如下图),其次就是状态的保存和恢复(onSaveInstanceState onRestoreInstanceState),以及 Activity 之间的跳转和数据传输(intent)。Activity 中常用的函数有 SetContentView() fi
2、ndViewById() finish() startActivity(),其生命周期涉及的函数有:void onCreate(Bundle savedInstanceState)void onStart()void onRestart()void onResume()void onPause()void onStop()void onDestroy()注意的是,Activity 的使用需要在 Manifest 文件中添加相应的,并设置其属性和intent-filter。IntentAndroid 中提供了 Intent 机制来协助应用间的交互与通讯,Intent 负责对应用中一次操作的动作、
3、动作涉及数据、附加数据进行描述,Android 则根据此 Intent 的描述,负责找到对应的组件,将 Intent 传递给调用的组件,并完成组件的调用。Intent 不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service 之间的交互。因此,Intent 在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。在 SDK 中给出了 Intent 作用的表现形式为: 通过 Context.startActivity() orActivity.startActivityForResult() 启动一个Activity; 通过 Conte
4、xt.startService() 启动一个服务,或者通过 Context.bindService() 和后台服务交互; 通过广播方法(比如 Context.sendBroadcast(),Context.sendOrderedBroadcast(),Context.sendStickyBroadcast() 发给 broadcast receivers。Intent 属性的设置 ,包括以下几点:(以下为 XML 中定义,当然也可以通过 Intent 类的方法来获取和设置)(1)Action,也就是要执行的动作SDk 中定义了一些标准的动作,包括onstantTarget componentA
5、ctionACTION_CALL activity Initiate a phone call.ACTION_EDIT activity Display data for the user to edit.ACTION_MAIN activityStart up as the initial activity of a task, with no data input and no returned output.ACTION_SYNC activitySynchronize data on a server with data on the mobile device.ACTION_BATT
6、ERY_LOWbroadcast receiverA warning that the battery is low.ACTION_HEADSET_PLUGbroadcast receiverA headset has been plugged into the device, or unplugged from it.ACTION_SCREEN_ON broadcast The screen has been turned on.receiverACTION_TIMEZONE_CHANGEDbroadcast receiverThe setting for the time zone has
7、 changed.当然,也可以自定义动作(自定义的动作在使用时,需要加上包名作为前缀,如com.example.project.SHOW_COLOR”),并可定义相应的 Activity 来处理我们的自定义动作。(2)Data,也就是执行动作要操作的数据Android 中采用指向数据的一个 URI 来表示,如在联系人应用中,一个指向某联系人的 URI 可能为:content:/contacts/1。对于不同的动作,其 URI 数据的类型是不同的(可以设置 type 属性指定特定类型数据),如 ACTION_EDIT 指定 Data 为文件 URI,打电话为 tel:URI,访问网络为 http
8、:URI,而由 content provider 提供的数据则为 content: URIs。(3)type(数据类型),显式指定 Intent 的数据类型(MIME)。一般 Intent 的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。(4)category(类别),被执行动作的附加信息。例如 LAUNCHER_CATEGORY 表示 Intent 的接受者应该在 Launcher 中作为顶级应用出现;而 ALTERNATIVE_CATEGORY 表示当前的 Intent 是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。还有其他
9、的为Constant MeaningCATEGORY_BROWSABLEThe target activity can be safely invoked by the browser to display data referenced by a link for example, an image or an e-mail message.CATEGORY_GADGETThe activity can be embedded inside of another activity that hosts gadgets.CATEGORY_HOMEThe activity displays th
10、e home screen, the first screen the user sees when the device is turned on or when the HOME key is pressed.CATEGORY_LAUNCHERThe activity can be the initial activity of a task and is listed in the top-level application launcher.CATEGORY_PREFERENCE The target activity is a preference panel.(5)componen
11、t(组件),指定 Intent 的的目标组件的类名称。通常 Android 会根据 Intent 中包含的其它属性的信息,比如 action、data/type、category 进行查找,最终找到一个与之匹配的目标组件。但是,如果 component 这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent 的其它所有属性都是可选的。(6)extras(附加信息),是其它所有附加信息的集合。使用 extras 可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在 extras 里,传给电子邮件发送组件
12、。理解 Intent 的关键之一是理解清楚 Intent 的两种基本用法:一种是 显式的 Intent,即在构造Intent 对象时就指定接收者;另一种是隐式的 Intent,即 Intent 的发送者在构造 Intent 对象时,并不知道也不关心接收者是谁,有利于降低发送者和接收者之间的耦合。对于显式 Intent,Android 不需要去做解析,因为目标组件已经很明确,Android 需要解析的是那些隐式 Intent,通过解析,将 Intent 映射给可以处理此 Intent 的 Activity、IntentReceiver 或Service。 Intent 解析机制主要是通过查找已注
13、册在 AndroidManifest.xml 中的所有 IntentFilter 及其中定义的 Intent,最终找到匹配的 Intent。在这个解析过程中,Android 是通过 Intent 的action、 type、category 这三个属性来进行判断的,判断方法如下: 如果 Intent 指明定了 action,则目标组件的 IntentFilter 的 action 列表中就必须包含有这个 action,否则不能匹配; 如果 Intent 没有提供 type,系统将从 data 中得到数据类型。和 action 一样,目标组件的数据类型列表中必须包含 Intent 的数据类型,否
14、则不能匹配。 如果 Intent 中的数据不是 content: 类型的 URI,而且 Intent 也没有明确指定它的type,将根据 Intent 中数据的 scheme (比如 http: 或者 mailto:) 进行匹配。同上,Intent 的 scheme 必须出现在目标组件的 scheme 列表中。 如果 Intent 指定了一个或多个 category,这些类别必须全部出现在组建的类别列表中。比如 Intent 中包含了两个类别: LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。Intent-Filter
15、 的定义一些属性设置的例子:完整的实例 Intent 用法实例1.无参数 Activity 跳转Intent it = new Intent(Activity.Main.this, Activity2.class);startActivity(it); 2.向下一个 Activity 传递数据(使用 Bundle 和 Intent.putExtras)Intent it = new Intent(Activity.Main.this, Activity2.class);Bundle bundle=new Bundle();bundle.putString(name, This is from
16、MainActivity!);it.putExtras(bundle); / it.putExtra(“test”, shuju”);startActivity(it); / startActivityForResult(it,REQUEST_CODE);对于数据的获取可以采用:Bundle bundle=getIntent().getExtras();String name=bundle.getString(name);3.向上一个 Activity 返回结果(使用 setResult,针对startActivityForResult(it,REQUEST_CODE)启动的 Activity)Intent intent=getIntent()