Android基础——四大组件之Activity

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/salmon_zhang/article/details/72567783

这几天继续回顾了一些Android基础方面的知识,今天跟大家一起回顾下Android四大组件中的Activity。虽然很基础,但工欲善其事,必先利其器。我们只有打好夯实的基础,才能在技术开发这条道路上越走越远、越走越好。

1. Activity的定义、创建和销毁

学习Activity我们首先应该知道何为Activity?如何在我们在工程中创建一个Activity?以及如何销毁一个Activity?

1.1 Activity的定义
An Activity is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map. Each activity is given a window in which to draw its user interface. The window typically fills the screen,but may be smaller than the screen and float on top of other windows.
这是Google原生的解释,这里我就不翻译了,相信大家都能看懂。
1.2 Activity的创建步骤:
1. 自定义FirstActivity 继承 Activity
2. 覆写onCreate方法
3. 在onCreate方法中调用setContentView()方法
4. 给setContentView()传入布局文件(每个Activity都应有个布局文件)
5. 在AndroidManifest.xml中注册该Activity

当然如果用Android Studio创建Activity时,可以选择自动帮我们生成布局文件和在AndroidManifest进行注册。

1.3 Activity的销毁
1. 点击back按键
2. 通过代码销毁:finish()

2. Android中各组件间交互的桥梁——Intent

Intent是Android中四大组件进行交互的一种重要方式,不仅可以指明想要执行的动作,还可以进行数据的传递。Intent一般用于启动活动、启动服务和发送广播等。Intent一般分为显式Intent和隐式Intent。

2.1 使用显式Intent实现Activity之间的跳转:

1. 适用的场景:同一个app中不同Activity之间的跳转。
        Intent intent = new Intent(MainActivity.this,FirstActivity.class);
        startActivity(intent);
2. 跳转时携带数据(在MainActivity中给Intent绑定数据)
        intent.putExtra("name", "zhangsan");
        intent.putExtra("age", 18);
3. 在FirstActivity中获取Intent上的数据
        /**
         * 1.获取MainActivity发送过来的Intent
         * 2. 从Intent上获取绑定的数据
         */
        Intent intent = getIntent();
        String name = intent.getStringExtra("name");
        int age = intent.getIntExtra("age", 0);

2.2 使用隐式Intent实现Activity之间的跳转:

1. 适用的场景:不同App之间不同Activity之间的跳转。
2. 匹配规则
    1. 如果目标Activity有多个intent-filter,则只有匹配上一个意图就可以启动
    2. intent-filter中的action category data标签,必须严格的跟Inentent上的参数匹配,才能启动这个Activity,其中如果category是DEFAULT,那么可以不用匹配这个参数。
    3. 每个Intent中只能有一个action,可以有多个category和data
    4. 如果intent-filter中有多个category标签,只需要让我们的Intent随便匹配一个即可
    5. 如果intent-filter中有多个data标签,只需要让我们的Intent随便匹配一个即可

2.3 Intent可以携带的数据类型有哪些

1. 八种基本数据类型以及数组形式
2. 字符串类型以及数组形式
3. 实现了序列化接口的对象(Serializable和Parcelable)

3. Activity中数据传递和返回数据

1: 启动另一个Activity需要返回结果时的启动方式是:

    Intent intent = new Intent(this, SecondActivity.class);
    //参数1:是Intent,参数2:请求码
    startActivityForResult(intent, 1);

2:使用startActivityForResult(intent, requestCode)启动另外一个Activity时,需要接受返回的值,那么就需要在当前Activity中重写onActivityResult()方法:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    }

3:在另一个Activity中返回数据给另一个Activity时,需要调用setResult(RESULT_OK, data)方法:

    Intent data = new Intent();
    data.putExtra("contents", value);
    setResult(RESULT_OK, data);

4:Activity的生命周期

每个应用一般都包含很多个Activity,在不同的阶段Activity会呈现不同的状态。很好的掌握Activity的生命周期对每个Android开发者来说都是必备技能。

4.1 Activity的管理机制

通过前面的学习我们会发现Android中的Activity是可以层叠的,那么这就需要一种机制来对这些Activity进行管理。Android中是使用任务来管理的,一个任务就是一组存放在栈里的Activity的集合,这个栈也称作为返回栈。栈是一种先进后出的数据结构。每当新建一个Activity,它就会进入返回栈,并处于栈顶位置。每当按下Back键或调用finish()时,处于栈顶的Activity就会弹栈,这时前一个入栈的Activity就会处于栈顶的位置。系统总是会显示处于栈顶的活动给用户。

4.2 Activity的活动状态

每个Activity在生命周期中最多可能会有四种状态

1.运行状态

当一个Activity处于返回栈的栈顶时,此时的Activity就是处于运行状态,也就是正在显示给用户的Activity。这种情况下的Activity系统是最不愿意回收的,否则会造成很差的用户体验。

2:暂停状态

当一个Activity不处于栈顶,当仍然可见时(处于栈顶位置的Activity没有占满整个屏幕),此时的Activity就是处于暂停状态。这种情况下的Activity系统也是不愿意回收的,只有在内存极低的时候,系统才会考虑去回收这种Activity。

3:停止状态

当一个Activity不处于栈顶,且完全不可见时,此时的Activity就是处于停止状态。当系统很缺内存时,处于停止状态的Activity是有可能会被回收的。

4:销毁状态

当一个Activity从返回栈中移除后,此时的Activity就变成了销毁状态。系统最喜欢回收处于这种状态的Activity,从而保证手机的内存充足。

4.3 Activity的生存期

Android通过定义7个回调方法来表述Activity生命周期中的每一个环节。下面我将对这7个方法进行简述,方便大家对Activity的生命周期有更一步的理解。

1:onCreate()

该方法会在Activity第一次创建的时候调用。主要完成Activity中一些初始化的工作。例如:加载布局、绑定点击事件等。

2:onStart()

该方法在onCreate()或onRestart()之后调用,让Activity由不可见状态变为可见状态的时候调用。

3:onResume()

该方法在与用户进行交互时调用,此时的Activity处于可见状态,处于返回栈的栈顶位置。

4:onPause()

该方法在系统要跳转到另一个Activity时调用。如果跳转的Activity没有占满整个屏幕则不会执行下面的onStop()方法。

5:onStop()

该方法在系统要跳转到另一个Activity时,且新的Activity占满整个屏幕是调用。

6:onDestroy()

该方法在Activity被销毁之前调用。完成释放内存的操作。

7:onRestart()

该方法在Activity由停止状态变为运行状态之前调用,此时的Activity被重新启动了。

如果想要更好的掌握Activity的生命周期,最好还是要写个Demo自己去体会下。为了帮助我们更好的理解Activity的生命周期,Android提供了一张Activity生命周期的示意图:
这里写图片描述

5:Activity的四种启动模式

在实际项目开发中,我们会根据需求为每个Activity指定恰当的启动模式。启动模式一共有四种,分别是:standard、singleTop、singleTask和singleInstance。我们可以在AndroidManifest.xml中进行设定:

    <activity
        android:launchMode="singleInstance"
        android:name=".MainActivity"
        android:label="@string/app_name" >
    </activity>
5.1 standard(标准启动模式)

standard是Activity默认的启动模式,在standard模式下,每启动一个新的Activity,它都会进入返回栈,并且处于栈顶的位置。不管返回栈中有没有Activity,都会创建该Activity的一个新的实例。

5.2 singleTop(栈顶复用模式)

如果一个Activity是以singleTop模式启动的,并且处于返回栈的栈顶位置时,如果想再次启动该Activity,此时系统不会创建新的实例,而是直接使用栈顶位置的Activity。

5.3 singleTask(栈内复用式)

如果一个Activity的启动模式是singleTask,以后每次启动该Activity时,系统都会先去返回栈中看看有没有该活动的实例,(注:是到整个返回栈中去检查,并不是单单看栈顶位置),如果返回栈中已经有了该活动的实例,那么就会直接使用该实例,并且会把该Activity上面所有的Activity全部弹栈。如果整个返回栈中都没有检查到该活动的实例,那么系统就会创建一个新的Activity实例。

5.4 singleInstance(单例模式)

如果一个Activity的启动模式是singleInstance,那么系统会单独启用一个新的返回栈来管理该Activity,同一时刻系统中只会存在一个这样的Activity,当需要再次启动该Activity时,系统不会创建新的Activity,而是直接复用已经存在的Activity。其他启动的Activity会运行在另一个任务栈中。使用这种模式的Activity达到了与其他程序共享同一个Activity的目的。

6. Activity中的常见问题

6.1 横竖屏切换时对Activity生命周期的影响
1. 默认情况下 先完全杀死,然后再重新创建
2. 如何不让横竖屏切换时影响当前Activity的生命周期?
   android:configChanges="screenSize|orientation|keyboardHidden"
6.2 如何固定Activity的方向
1. 通过修改配置文件
   android:screenOrientation="landscape"
2. 通过编写代码
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

好了,本文到此就写完了,希望能够帮助到大家对Activity的理解。让我们共同学习,一起进步吧!

猜你喜欢

转载自blog.csdn.net/salmon_zhang/article/details/72567783