Android Activity

本文详细介绍了Android中Activity的创建、启动、生命周期管理、保存状态及协调多个Activity之间的操作,包括如何在不同状态间切换,以及如何利用Intent实现跨Activity的操作。重点突出Activity在Android应用中的核心作用及其实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在讲Activity的其他例子前,我先翻译下Android Activity文章。

原文请参见http://developer.android.com/guide/topics/fundamentals/activities.html


概述

Activity 是一个非常重要应用程序组件,它给开发者提供了一个可以与用户 进行交互的窗口,比如打电话,照相啊。这个窗口通常是占据了整个屏幕的大小,但是它也可以比屏幕小,甚至可以浮在 其他窗口之上。

一般一个应用程序中有好几个Activity,但是会有一个被指定为“main”的Activity,这个Activity会作为程序入口,在程序运行时第一个被执行,然后它可以开启其他Activity。当启动其他Activity后,先前的Activity就暂停并被系统压栈了。这就涉及到Activity的生命周期了,接下来就来讲解如何去创建和启动一个Activity,并管理它的生命周期。

创建Activity

首先你必须创建一个子类去继承Activity,然后实现Activity的一些回调函数,其中最主要的有两个:

onCreate()

你必须实现这个函数。这个函数在系统创建Activity时调用,你可以在这里做些初始化工作,但一定要记住,你必须得调用setContentView()函数来告诉系统你这个Activity使用的布局是什么。

onPause()

  当用户要离开这个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的文档算是翻译完了吧~~~ 作为一个小公司的产品经理,实在太忙太忙,但还得必须坚持,再坚持!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值