在讲Activity的其他例子前,我先翻译下Android Activity文章。
概述
一般一个应用程序中有好几个Activity,但是会有一个被指定为“main”的Activity,这个Activity会作为程序入口,在程序运行时第一个被执行,然后它可以开启其他Activity。当启动其他Activity后,先前的Activity就暂停并被系统压栈了。这就涉及到Activity的生命周期了,接下来就来讲解如何去创建和启动一个Activity,并管理它的生命周期。
创建Activity
首先你必须创建一个子类去继承Activity,然后实现Activity的一些回调函数,其中最主要的有两个:
你必须实现这个函数。这个函数在系统创建Activity时调用,你可以在这里做些初始化工作,但一定要记住,你必须得调用setContentView()函数来告诉系统你这个Activity使用的布局是什么。
当用户要离开这个Activity时,第一个会调用这个函数,所以在这里你可以做保存工作了,因为用户可能再也不会回到这个Activity了,但并不代表这个Activity被销毁了,后面我们会详述。
在manifest中声明Activity
为了让系统能访问我们创建的Activity,我们必须要在manifest文件中声明这个Activity为application的子元素。例如:
<manifest ... >
<application ... >
<activity android:name=".ExampleActivity" />
...
</application ... >
...
</manifest >
你可以给Activity添加属性,详细请参见<Activity>。
使用intent filters
使用 <intent-filter>
可以告诉程序其他组件如何激活这个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>
<action>
节点指定了这个Activity是“main”入口, <category>指定这个Activity应该在系统的launcher组里,即允许用户运行它。详细请参见 Intents and Intent Filter。
启动Activity
你可以调用startActivity()来启动一个Activity,传递一个用来描述你要启动的Activity的Intent参数进去。例如启动一个名为SignInActivity的Activity:
Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);
然而,你可能想要执行一些动作,比如发邮件等。这种情况下,你的程序可能没有自己的activities去执行这些动作,所以你就需要用其他程序的activity来帮你执行这些事。如果系统有多个activities可以运行,用户可以选择用哪个activity去执行。比如,你想让用户可以发email,你可以创建如下intent:
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
startActivity(intent);
EXTRA_EMAIL是一个字符串,指定目的地email地址。当email应用程序响应这个intent时,会读取这个email地址,等用户结束发送email,你自个的activity会重新启动。
<待续。。。>
为一个结果启动activity
有时,你希望从你启动的activity中获得一个结果。这种情况下,你需要调用startActivityForResult()
(取代 startActivity()
)来启动activity。为了能接收到接下来要启动的activity的结果,你需要执行 onActivityResult()
回调函数。当你要启动的activity完成后,就会给 onActivityResult()
返回一个Intent。比如,你也许想要让用户去选择一个联系人,然后你的activity可以用这个联系人信息去做些事。看下面代码:
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
你可以调用finish()或 finishActivity()
来结束一个activity。
管理Activity生命周期
Activity是每个开发者都要熟练掌握的,不然就别想做Android开发了!
一个activity存活时有三种基本状态:
Resumed
正在运行的状态,这时activity在屏幕前,并且用户可以交换。
Paused
暂停的状态,这时另外一个activity在屏幕前,并且具有焦点,但是这个activity并没有结束,并且依然是可见的。也就是说另外一个activity显示在这个activity上面但并没有占据整个屏幕。这个activity是完全活着的,但是当内存很低时可能会被系统杀掉。
Stopped
停止的状态,这时这个activity被另一个activity完全覆盖了,但它依然存活着,只是运行在后台,用户不可见了。同样,当内存很低时系统可能会主动杀掉它。
Activity的回调函数
生命周期中有如下的回调函数:
public class ExampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// The activity is being created.
}
@Override
protected void onStart() {
super.onStart();
// The activity is about to become visible.
}
@Override
protected void onResume() {
super.onResume();
// The activity has become visible (it is now "resumed").
}
@Override
protected void onPause() {
super.onPause();
// Another activity is taking focus (this activity is about to be "paused").
}
@Override
protected void onStop() {
super.onStop();
// The activity is no longer visible (it is now "stopped")
}
@Override
protected void onDestroy() {
super.onDestroy();
// The activity is about to be destroyed.
}
}
上个著名的描述activity生命周期的图,描述了各个状态以及切换时调用的函数:
主要提下onPause(),当系统要启动另外一个activity时调用,这里可以做些停止消耗CPU的事,但是这里一定要速战速决,因为这会影响下个activity的启动时间,太长就影响用户体验了!
保存Activity的状态
如上节所说,activity被暂停或停止时,它依然存活着,所以用户做的一些改变啊依然存在系统内存中。但是当系统为了回收内存时就会销毁activity,因此当系统重新启动这个activity时不能简单地resume就能恢复完整的activity,当系统按back导航键时系统必须重新创建这个activity。当然用户并不知道系统销毁它了然后又重新创建了它。因此你要确保你通过其他的方法保存了重要的数据,然后等系统重建了activity后你能再恢复你保存的数据。
你可以重写onSaveInstanceState()来保存你的数据,系统会在销毁activity前调用它保存状态,然后在重建时将这些状态传回activity。
当设备的配置改变时,比如横竖屏切换,语言切换,这时系统会销毁并立马重新创建这个activity以适应这个改变,用户要处理好这种情况,详细请参考 Handling Runtime Changes。
协调Activities
当两个activity交接时,它们各自的生命周期都在变化,此时一定要处理好,下面是activity A启动activity B时的系统操作顺序:
1. 执行A的onPause()
2. 然后执行B的onCreate()
, onStart()
, 和 onResume()
3. 然后,如果A不在被用户可见了,就会调用A的 onStop()
知道这个顺序后,当两个activity交替时你就不会乱了。比如,你有个硬性的要求,希望在第一个activity停止前要往一个数据库里写数据好让第二个activity能够访问这个数据,那么你应该在第一个activity的onPause()里完成这个操作,而不是在onStop()里。
好了,这篇关于Activity的文档算是翻译完了吧~~~ 作为一个小公司的产品经理,实在太忙太忙,但还得必须坚持,再坚持!