Activity开发详情(生命周期)

本文详细解析了Android中Activity的生命周期,包括onCreate、onStart、onResume等关键方法的作用及调用时机,并介绍了如何在实际开发中合理运用这些生命周期方法。

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

Activity定义:

Activity是Android四大组件之一,是Android开发必不可少的组件,是一个界面的载体,可以将它与html页面进行类比,html页面由各种标签组成,而Activity则可以有各种控件组成,但查看Activity的源码可以看出,这个类有六千多行代码,说明Android对Activty的处理是比较复杂的。在开发过程中,我们需要着重了解Activity的生命周期。

Activity的生命周期:

Android官方文档给出的Activity生命周期图

 

 当打开一个Activity的时候,会调用这个Activity的onCreate()方法,接着调用onStart()方法,然后调用onResume()方法执行后,就可以看到Activity这个界面了。由以下代码可见:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lift);

        Log.e(Constants.LOG_TAG,"Activity onCreate() method.");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.e(Constants.LOG_TAG, "Activity onStart() method." );
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e(Constants.LOG_TAG, "Activity onResume() mrthod");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.e(Constants.LOG_TAG, "Activity onRestart() method." );
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.e(Constants.LOG_TAG, "onPause() method.");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.e(Constants.LOG_TAG, "Activity onStop() method.");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e(Constants.LOG_TAG, "Activity onDestroy() method. " );

    }

运行后log输出:

03-25 11:19:17.933 9898-9898/com.asmpt.testappone E/TestTag: Activity onCreate() method.
03-25 11:19:17.934 9898-9898/com.asmpt.testappone E/TestTag: Activity onStart() method.
03-25 11:19:17.936 9898-9898/com.asmpt.testappone E/TestTag: Activity onResume() mrthod

点击返回键,log输出:

03-25 11:19:42.141 9898-9898/com.asmpt.testappone E/TestTag: Activity onStop() method.
03-25 11:19:42.141 9898-9898/com.asmpt.testappone E/TestTag: Activity onDestroy() method.

下面简单讲一下Activity生命周期中每个函数的作用:

onCreate() : 

当Activity第一次被创建的时候调用此方法.一般在此方法中进行控件的声明,添加事件等初始化工作.

onStart():

当Activity被显示到屏幕上的时候调用此方法.

onResume():

当此Activity能够被操作之前,也就是能够获得用户的焦点之前调用此方法.

onRestart():

当Activity被停止后又被再次启动之前调用此方法.接着将调用onStart()方法.

onPause():

当第一个Activity通过Intent启动第二个Activity的时候,将调用第一个Activity的onPause()方法.然后调用第二个Activity的onCreate(),onStart(),onResume()方法,接着调用第一个Activity的onStop()方法.如果Activity重新获得焦点,则将调用onResume()方法;如果此Activity进入用户不可见状态,那么将调用onStop()方法.

onStop():

当第一个Activity被第二个Activity完全覆盖,或者被销毁的时候回调用此方法.如果此Activity还会与用户进行交互,将调用onRestart方法();如果此Activity将被销毁,那么将调用onDestroy()方法.

onDestroy():

Activity被销毁之前调用此方法.或者是调用finish()方法结束Activity的时候调用此方法.可以在此方法中进行收尾工作,比如释放资源等.

(注意:重写某个Activity的这些回调方法的时候需要首先在第一行调用基类Activity的相应的回调方法.比如super.onCreate(),super.onStart()等等.)

Activity生命周期交互设计思想

到这里,大家可能会有些疑问,谷歌为什么要这样设计呢?如:

1.当从第一个Activity启动第二个Activity的时候,为什么先调用第一个Activity的onPause()方法,然后再调用第二个Activity的onCreate()等方法呢?

解释:假如有这样一个情况,你正在使用APP听音乐,突然来了一个电话,那么当然需要先暂停音乐,然后进行电话的处理。所以这就是onPause()方法的作用:可以用来保存当前的各种信息.可以在这个APP的onPause()方法中实现暂停音乐的逻辑,然后再处理电话的业务处理.

2.当从第一个Activity启动第二个Activity的时候,为什么第一个Activity的onStop()方法是调用完第二个Activity的系列方法后才调用呢,为什么不在第一个Activity的onPause()方法之后就调用呢? 

解释:这是谷歌对安全方面的一个考虑.假如先调用第一个Activity的onStop()方法,那么此时第一个Activity将不可见,如果接下来调用第二个Activity的一系列创建方法失败了,那么就会导致这两个Activity都没显示在屏幕上,就会出现黑屏等不友好界面.如果是调用完第二个Activity一系列创建方法后,再调用第一个Activity的onStop()方法,就会避免这种情况的发生.

Activity生命周期的应用场景

讲了这么多,大家可能会问,Activity生命周期到底实际中怎么使用.下面通过实例来做简单的运用.在AActivity中进行音乐的播放,当点击按钮打开BActivity后,音乐需要暂停,然后点击BACK键返回到AActivity后音乐继续播放.这就需要在AActivity中的onPause()方法中进行音乐的暂停操作,以及暂停时音乐播放位置的记录.在AActivity中的onResume()方法中实现重新返回前台时继续音乐的播放.

.其他应用程序中的Activity

我们可以通过ComponentName启动其他应用程序中的Activity,比如启动相机等.

用法:

Intent intent=new Intent();  
intent.setComponent(new ComponentName(String packageName,String activityName ));  
startActivity(intent); 

.启动系统中常见的Activity

系统给我们提供了很多常用的Activity,可以用来打开浏览器,打开发短信界面,打开相册界面,打开拨号界面等等.

打开浏览器网页:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com")); 
startActivity(intent);

打开相册:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivity(intent);

打开发送短信界面:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT,"Hello World !");
startActivity(intent);

打开拨号界面:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("tel:110"));
startActivity(intent);

Activity启动模式(引自官方文档)

在 manifest 文件中声明 activity 时,你可以利用activity元素的launchMode属性来设定 activity 与 task 的关系。

launchMode 属性指明了 activity 启动 task 的方式。 launchMode 属性可设为四种启动模式:

standard(默认模式):

默认值。系统在启动 activity 的 task 中创建一个新的 activity 实例,并把 intent 传送路径指向它。该 activity 可以被实例化多次,各个实例可以属于不同的 task,一个 task 中也可以存在多个实例。

 singleTop:

如果 activity 已经存在一个实例并位于当前 task 的栈顶,则系统会调用已有实例的onNewIntent()方法把 intent 传递给已有实例,而不是创建一个新的 activity 实例。activity 可以被实例化多次,各个实例可以属于不同的 task,一个 task 中可以存在多个实例(但仅当 back stack 顶的 activity 实例不是该 activity 的)。

比如,假定 task 的 back stack 中包含了根 activity A 和 activities B、C、D(顺序是 A-B-C-D;D 在栈顶)。

这时过来一个启动 D 的 intent。如果 D 的启动模式是默认的"standard",则会启动一个新的实例,栈内容变为 A-B-C-D-D。

但是,如果 D 的启动模式是"singleTop",则已有的 D 实例会通过onNewIntent():接收这个 intent,因为该实例位于栈顶——栈中内容仍然维持 A-B-C-D 不变。当然,如果 intent 是要启动 B 的,则 B 的一个新实例还是会加入栈中,即使 B 的启动模式是"singleTop"也是如此。 

注意: 一个 activity 的新实例创建完毕后,用户可以按回退键返回前一个 activity。 但是当 activity 已有实例正在处理刚到达的 intent 时,用户无法用回退键回到 onNewIntent() 中 intent 到来之前的 activity 状态。

singleTask:

系统将创建一个新的 task,并把 activity 实例作为根放入其中。但是,如果 activity 已经在其它 task 中存在实例,则系统会通过调用其实例的onNewIntent() 方法把 intent 传给已有实例,而不是再创建一个新实例。 此 activity 同一时刻只能存在一个实例。

注意: 虽然 activity 启动了一个新的 task,但用户仍然可以用回退键返回前一个 activity。

singleInstance:

除了系统不会把其它 activity 放入当前实例所在的 task 之外,其它均与"singleTask"相同。activity 总是它所在 task 的唯一成员;它所启动的任何 activity 都会放入其它 task 中。

举个例子,Android 的浏览器应用就把 web 浏览器 activity 声明为总是在它自己独立的 task 中打开——把 activity设为singleTask模式。 这意味着,如果你的应用提交 intent 来打开 Android 的浏览器,则其 activity 不会被放入你的应用所在的 task 中。 取而代之的是,或是为浏览器启动一个新的 task;或是浏览器已经在后台运行,只要把 task 调入前台来处理新 intent 即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值