【译】Android四大组件之Activity
Activity定义
Activity是一种提供了屏幕并能让用户做一些交互的应用组件,就像拨号,拍照,发送电子邮件或者浏览地图,每一个activity被给与了用于绘制用户界面的窗口,一般窗口都是充满屏幕的,但可能比屏幕小一点并且浮在其他窗口之上。
一个应用通常由多个相互紧密联系的Activies组成,典型的一个activity在应用中被指定成“主”activity,用户第一次运行应用所显现的。为了能执行不同的行为每个activity可以运行另一个activity。每次一个新的Activity开启,上一个activity被停止,系统保留activity在栈中(回退栈),当一个新activity运行,它被推入栈顶并让用户得到焦点。回退栈遵守“后进,先出”的栈机制,所以,当用户在当前的activity上按了返回按钮,它从栈顶弹出(被销毁)并且上一个activity恢复到当前。
两个重要的回调方法
onCreate()
在创建你的activity时,你必须实现这个方法,在这个实现体中,你应该初始化必要的组件,这里也是你调用setContentView()方法来定义你界面布局的地方。
onPause()
系统调用此方法说明了用户已经离开了你的activity(虽然不能总是理解为activity被销毁),在这里通常需要你提交任何变更来保留当前用户的session(因为用户可能不再回来)。
在manifest中声明activity
你必须在manifest中声明你的activity来关联你的系统,打开你的manifest文件,添加一个<activity>元素作为<application>元素子元素。比如:
<manifest ... > <application ... > <activity android:name=".ExampleActivity" /> ... </application ... > ... </manifest >
在acitivity元素中你还可以包含其他几个属性,具体参考 <activity>
运行一个activity
你可以调用startActivity()来运行另一个activity,传递一个
Intent来描述你想运行的activity。
在你的应用程序中,你经常会运行一个已知的activity,你可以创建换一个intent来准确的定义你希望运行的activity。比如:
Intent intent = new Intent(this, SignInActivity.class); startActivity(intent);
然而,你的应用程序可能也想执行一些action,比如发送一封邮件,文本信息或者状态更新,在这样的情况,你的应用程序可能没有自己的activities来执行这类actions。所以,你可以通过一些方法来运行其他应用已经提供的activities,这就是intent的真正价值所在。比如你想发送一封电子邮件,你可以创建如下intent。
Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_EMAIL, recipientArray); startActivity(intent);
运行一个有返回结果的activity
有时,你想要从你运行的activity获取结果。这样的情况,调用startActivityForResult()来运行activity(而不是startActivity())。从后续的activity中获取结果,实现
onActivityResult()回调方法。当后续的activity完成操作,它返回一个结果在Intent中到你的
onActivityResult()方法中。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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,这里,代码通过在Intent中查询activity返回的数据。
关闭一个activity
你可以通过调用finish()方法来关闭一个activity,你也可以通过调用finishActivity()方法来关闭你之前运行的独立activity。
管理activity生命周期
一个activity存在三个必要的状态:
Resumed
activity在屏幕的前端并且并且获取焦点。
Paused
另一个activity在前台并获取焦点,但之前的activity依然可见。也就是,另外一个activity在某个activity之上并且那个activity部分透明或者没有完全覆盖整个屏幕。一个暂停的activity是完全存活的(Activity对象被保留在内存中,维护所有的状态和成员信息,并且附属于窗口管理),但是,在极低内存的情况下可以被系统杀掉。
Stopped
activity被另一个activity完全覆盖(activity在“后台”)。一个停止的activity也是存活的(Activity对象被保留在内存中,维护所有的状态和成员信息,但不附属于窗口管理),然而,它不再被用户可见并且在系统需要内存时将被杀掉。
如果一个activity是暂停或者停止,系统都可以将内存中销毁通过finish(调用finish()方法),或者杀掉它的进程。当activity再次打开(在finished和killed之后),它必定完全被创建。
生命周期的回调方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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的整个生命周期发生在调用
onCreate()和
onDestroy()之间,你的activity应该执行“全局”状态的设立(setup of "global" state)(比如定义布局)在onCreate()中,释放所有保留的资源在onDestroy()。
- 一个activity的可见生命周期发生在调用
onStart()和
onStop()。在这个过程中,用户可以在界面上看见activity并操作它。在这两个方法之间,你可以保留那些需要在activity展现给用户的资源。比如,你可以注册一个
BroadcastReceiver在
onStart()中去监听影响你UI的变更,并且在
onStop()中执行注销当用户不再看见你所显示的内容。系统可能会在整个生命周期中多次调用
onStart()和
onStop()方法,当activity在可见和隐藏这两个状态之间交替。
- 一个activity的前景生命周期发生在调用
onResume()和
onPause()之间,在这个过程中,activity在屏幕中其他所有activities前面并且有用户输入焦点。因为这个状态可以经常传递,在这两个方法中的代码尽可能的轻量级为了能够避免用户等待。
下图展示了整个activity的生命周期。
Method | Description | Killable after? | Next | ||
---|---|---|---|---|---|
|
在activity第一次被创建时调用。这里一般是你用来做配置的——创建视图,绑定数据到列表中等等。这个方法被传递一个Bundle对象,它包含了上一次activity的状态,如果状态被捕获(查看 Saving Activity State)。接下来总是会调用onStart()。 |
No | onStart() |
||
|
activity已经被停止之后被调用,被再次运行。接下来总是会调用onStart()。 |
No | onStart() |
||
|
在activity对用户可见之前被调用。接下来会调用onResume()如果activity在前景,或者onStop()acitvity被隐藏。
|
No | onResume() or onStop() |
||
|
activity开始能和用户进行交互之前被调用。在这点上activity在activity栈顶,用户可以输入。接下来总是会调用 |
No | onPause() |
||
|
当系统正开始恢复另一个activity时被调用。该方法通常用户提交未保存的变动来保持数据持久,停止可能消耗CPU的动画和其他事情等等。无论什么处理都应该非常快,因为下一个activity将恢复直到它返回。 接下来要么调用onResume()如果activity返回到前面,或者onStop()如果它对用户不可见。 |
Yes | onResume() or onStop() |
||
|
当activity对用户不再可见时被调用。可能发生在因为它被销毁了,或者因为另一个activity(无论是存在的还是新的一个activity)已经被恢复并且覆盖它。 接下来要么调用 |
Yes | onRestart() or onDestroy() |
||
|
在activity被销毁前调用。这个是activity将会接收到的最后一个调用,它可以被调用要么因为activity结束(调用了finish()),要么因为系统临时销毁了activity的实例去释放空间。你可以使用 |
Yes | nothing |
这里不保证onSaveInstanceState()会在你的activity销毁前被调用,因为这里有一种情况是没有必要保存状态(比如用户使用回退键离开你的activity,因为用户明确想关闭该activity)。如果系统调用onSaveInstanceState(),它会在
onStop()之前和可能在
onPause()之前。
因为onSaveInstanceState()不保证会被调用,你应该使用它来保存activity之间传递的状态(UI状态)——你应该永远都不要使用它来保存持久数据,相反的,你应该使用onPause()来保存持久数据(比如将数据保存到数据库中)当用户离开activity。
处理配置(configuration)变更
一些设备配置在运行时可以改变(比如屏幕方向(orientation),键盘可用性,和语言)。当这样的改变发生时,Android重新创建正在运行的activity(系统调用 onDestroy(),然后立刻调用onCreate()
)。这个被设计的行为能够帮助你的应用程序通过你所提供的可选资源自动加载到你的应用程序中来达到程序适应新的配置(比如不同的布局针对不同的屏幕方向和尺寸)。更多信息请查看 Handling Runtime Changes。
只是让自己能看懂,如有意思表达不清楚,请指出。
原文:http://developer.android.com/guide/topics/fundamentals/activities.html