【笔记】Android 四大组件之 Activity
Activity (活动) 是一个应用组件,用户可与其提供的屏幕进行交互,总的来说就是连接用户和应用的一个窗口,用于展示数据给用户并响应用户操作
要注意的是一般来说每个 Activity 都是要在应用清单文件(AndroidManifest.xml)里注册的,当然一般来说其他三大组件(服务)(广播接收)(内容提供)也是需要在应用清单中注册的,Activity 注册大致如下
<manifest ... >
<application ... >
<activity android:name=".ExampleActivity" />
...
</application ... >
...
</manifest >
Activity 标签还可以加入几个其他特性,以定义 Activity 标签、Activity 图标或风格主题等用于设置 Activity UI 风格的属性。 android:name
属性是唯一必需的属性—它指定 Activity 的类名。应用一旦发布,即不应更改此类名,否则,可能会破坏诸如应用快捷方式等一些功能,关于其他一些详细的属性可以参考 <activity>
官方文档,了解有关在应用清单文件中声明 Activity 的信息。
Activity 指定 Intent 过滤器,下面看看如何使用 Intent 过滤器定义应用主入口 Activity
<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>
如何启动 Activity ,通过调用 startActivity()
,并将其传递给描述您想启动的 Activity 的 Intent
来启动另一个 Activity。Intent 对象会指定您想启动的具体 Activity 或描述您想执行的操作类型(系统会为您选择合适的 Activity,甚至是来自其他应用的 Activity)。 Intent 对象还可能携带少量供所启动 Activity 使用的数据。( 下面代码启动了一个 SignInActivity 活动,当然先要确保其已经创建并在应用清单中注册过了 )
Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);
怎么启动其他 APP 提供的一些 Activity ,例如调用系统电子邮件程序
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
startActivity(intent);
启动 Activity 以获得结果,通过调用 startActivityForResult()
( 而非 startActivity()
)来启动 Activity。 要想在随后收到后续 Activity 的结果,请实现 onActivityResult()
回调方法。 当后续 Activity 完成时,它会使用 Intent
向 onActivityResult()
方法返回结果。
例如可能希望用户选取其中一位联系人,以便 Activity 对该联系人中的信息执行某项操作。 可以通过以下代码创建此类 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...
}
}
}
在处理 Activity 结果时应该在 onActivityResult()
方法中使用的基本逻辑。 第一个条件检查请求是否成功(如果成功,则resultCode
将为 RESULT_OK
)以及此结果响应的请求是否已知 — 在此情况下,requestCode
与随 startActivityForResult()
发送的第二个参数匹配。 代码通过查询 Intent
中返回的数据(data
参数)从该处开始处理 Activity 结果。
实际情况是,ContentResolver
对一个内容提供程序执行查询,后者返回一个 Cursor
,让查询的数据能够被读取。