今天我们一起来学习Google官方文档中的Activity部分,梳理一下你可能不知道的Activity。
要创建一个activity,你必须创建一个Activity(或者它存在的子类)的子类。 在你的子类里,你需要实现系统调用的回调方法,这些方法用于activity在生命周期中进行事务处理。例如创建,停止,恢复,销毁。其中两个最重要的回调方法分别为:
-
onCreate()
- 你必须实现这个方法。系统会在创建activity的时候调用这个方法。 在实现这个方法的同时,你需要实现你activity的重要组件。 最重要的是,你必须在这里调用 setContentView() 来定义你activity用于用户交互的布局。 onPause()
- 系统将会调用这个方法作为用户离开activity的首先提示(虽然这并不意味着activity正在被销毁)。这通常是你应该在用户会话之前提交并保存任何更改的时机。 (因为用户可能不会再回到这个activity).
定义布局最常用的方式是使用XML布局文件,它保存在你程序的资源中。这种方式可以保证你的业务逻辑代码和用户交互界面分开。你可以通过setContentView()传递布局文件的ID来设置程序UI。 当然,你也可以在activity代码里自己新建View,并通过插入子View到ViewGroup。 然后把这些视图的根视图传入到setContentView()。
在配置文件中声明activity
为了可以访问activity,你必须把它配置到配置文件中。 首先打开配置文件,在<application>中增加一个<activity>元素。例如:
<manifest ... >
<application ... >
<activity android:name=".ExampleActivity" />
...
</application ... >
...
</manifest >
你可以给这个元素加入很多其他的属性。 例如名称,图标,或者activity的主题风格。 android:name 属性是唯一用来指定acitivity名称的属性。 一旦你发布了程序,就不能改变它的名字,否则将破坏一些功能,例如程序图标。 (阅读博文查看你不能改变的属性
查阅 <activity> 来获得更多关于如何配置activity
使用filter
<activity> 也可以用很多<intent-filter> 来指定其他的组件怎样激活它。
当你使用Android SDK tools来创建一个程序,主activity将会自动包含一个被分类为"launcher"的intent filter,如下:
<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<action> 元素指定程序的入口。 <category> 指出该activity应该被列如系统的启动器(launcher)(允许用户启动它)
如果你想要你的程序更加独立,并不想让其他程序访问你的activity,那么你就不必声明intent filter,只有一个activity 应该有"main"action和"launcher"分类,例如上述例子。你不想公开的activity应该不包含任何intent filter.但你可以使用明确 的intent来启动它们。(下文将详述)。
然而,如果你想要你的activity响应其他程序(或当前程序)的隐式intent,你必须为activity定义额外的intent filter。 每一个你想响应的intent,都必须包含一个 <intent-filter> ,并包含一个 <action> 元素,另外,可以包含一个<category> 也可以包含一个 <data> 元素。 这些元素指定了intent 的类型。
启动一个带返回结果的activity
有时候,你想要启动一个activity,并从这个activty获得一个结果。 这时,要通过 startActivityForResult() (取代startActivity()) 来启动activity。 然后通过实现onActivityResult()回调方法来获得返回后的结果。 当这个后续的activity被关闭,它将发送一个 Intent 给 onActivityResult() 方法。
例如,你可能想要取一个联系人的信息。下面介绍怎么创建intent并处理结果:
private void pickContact() {
// Create an intent to "pick" a contact, as defined by the content provider URI
Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
startActivityForResult(intent, PICK_CONTACT_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// If the request went well (OK) and the request was PICK_CONTACT_REQUEST
if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) {
// Perform a query to the contact's content provider for the contact's name
Cursor cursor = getContentResolver().query(data.getData(),
new String[] {Contacts.DISPLAY_NAME}, null, null, null);
if (cursor.moveToFirst()) { // True if the cursor is not empty
int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);
String name = cursor.getString(columnIndex);
// Do something with the selected contact's name...
}
}
}
这个例子展示了使用onActivityResult() 来获取结果的基本方法。 第一步要判断请求是否被成功响应,通过判断resultCode 是不是RESULT_OK—, 然后判断这个响应是不是针对相应的请求— ,此时只要判断requestCode 和发送时提供的第二个参数 startActivityForResult() 是否相匹配。 最后,查询 Intent中的data信息。 (data 参数)。
这个过程中,ContentResolver 开启了一个查询而不是content provider, 它返回一个 Cursor ,这将允许数据被读取。更多content provider相关信息,请查阅Content Providers 文档。
关于intent的更多信息, 查看 Intents and Intent Filters 文档。
参考:http://www.android-doc.com/guide/components/activities.html