Activity详解

本文详细介绍了Android中的Activity概念,包括其作用、生命周期、状态变化及启动模式等内容。了解这些可以帮助开发者更好地管理和控制应用行为。

一、简介

Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。

在一个android应用中,一个Activity通常就是一个单独的屏幕,,但也可小于屏幕并浮动在其他窗口之上。

它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。

Android 是通过一种 Activity 栈的方式来管理 Activity 的,一个 Activity 的实例的状态决定它在栈中的位置。

一个应用通常由多个彼此松散联系的 Activity 组成。每次新 Activity 启动时,前一 Activity 便会停止,但系统会在堆栈(“返回栈”)中保留该 Activity。 当新 Activity 启动时,系统会将其推送到返回栈顶,并取得用户焦点。 返回栈遵循“后进先出”堆栈机制,因此,当用户完成当前 Activity 并按“返回”按钮时,系统会从栈顶将其弹出(并销毁),然后恢复前一 Activity。

二、Activity生命周期

  1. 基本状态

    • Active/Running
      一个新 Activity 启动入栈后,它显示在屏幕最前端,处理是处于栈的最顶端(Activity栈顶),此时它处于可见并可和用户交互的激活状态,叫做活动状态或者运行状态(active or running)。
    • Paused
      当 Activity失去焦点, 被一个新的非全屏的Activity 或者一个透明的Activity 被放置在栈顶,此时的状态叫做暂停状态(Paused)。此时它依然与窗口管理器保持连接,Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被强行终止掉。所以它仍然可见,但已经失去了焦点故不可与用户进行交互。
    • Stopped
      如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被强行终止掉。
  2. 生命周期方法

    onCreate(), 当Activity被创建时调用。可以在此方法里做一些初始化的工作,加载布局,绑定事件等。
    onStart(), 当Activity可见但是还不能交互时调用
    onResume(), 当Activity已获取焦点,用户既可见又可交互时调用
    onPause(),当Activity失去焦点,用户不能交互但是仍可见,此方法会停留时间很短,所以不要在此方法中做耗时的清理工作。
    onStop(), 当Activity不可见也不可交互时,
    onDestroy(), Activity被销毁,可在此方法里做一些最终的回收和资源释放的工作。
    onRestart(),当Activity没有被销毁,重新创建时。

  3. 不同情况下生命周期方法的调用

    最简单的创建过程: onCreate(),onStart(), onResume().打开一个Activity
    最简单的销毁过程 : onPause(), onStop(), onDestroy(). 按Back键关闭刚打开的这个Activity
    按Home键退出:onPause(), onStop().
    跳转到新的Activity: onPause(), onCreate(), onResume(),onStop() .

4.Activity保存状态和创建时获取状态

当我们的程序Activity异常销毁时,那么savaInstanceState()就会调用。我们需要在此方法中,将需要重新创建时恢复的数据存入参数Bundle中。

  • 保存状态
protected void onSaveInstanceState(Bundle outState) {  
       super.onSaveInstanceState(outState);  
       String SaveData = "We must save the info";  
       String key = "SaveInfo";  
       outState.putString(key, SaveData);  
   } 
  • 获取状态
    与之相对应的是onRestoreInstanceState()方法,不过onCreate()中也可以获取保存的Bundle,不过onCreate()使用时需要进行参数Bundle的非空判断.

5.针对横竖屏切换

在AndroidManifests.xml文件,的Activity属性中添加如下代码,横竖屏切换时不会重新调用生命周期方法。只会执行onConfigurationChanged方法,横屏一次,竖屏两次。

android:configChanges="orientation | keyboardHidden | screenSize"

三、任务栈/Activity的启动模式

任务栈后进先出,先进后出。正常情况,打开一个Activity,放到栈顶。

1.四种启动模式

  • standard 标准模式,默认的启动模式。 在这种模式下启动的Activity可以被多次实例化,即在同一个任务栈中可以存在多个同一个Activity实例。
  • singleTop 单一顶部模式,顶部Activity不会重复。如果Activity的实例已经在任务栈的栈顶,那么再启动这个Activity的时候,不会再创建新的实例,而是重用位于栈顶的那个实例。
  • singleTask 单一任务栈模式,干掉头上的其他Activity。在一个任务栈中只能有一个该Activity的实例,如果已经存在Activity,系统会销毁处在改Activity之上的所有Activity,最终让改Activity实例处于栈顶。
  • singleInstance 单一实例(单例),任务栈里面自已一个人。设置了改模式的Activity会在一个独立的任务中开启,并且这个新的任务中有且只有这一个实例,也就是说改实例启动的其他Activity会自动运行在另一个任务中。当再次启动该Activity实例时,会重用已存在的任务和实例。

2.如何指定任务栈的启动模式

2.1 manifest指定
比如我们要指定为singleTask模式
manifest里面的Activity有个 launchMode属性来制定启动模式:

<activity android:name=".SecondActivity"

            android:launchMode="singleTask"

            />

2.2 代码指定 intent.addFlag
比如我们要指定为singleTop模式

Intent intent  = new Intent();
intent.setClass(FirstActivity.this,SecondActivity.class);
// 通过Intent的addFlag指定
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

2.3、两种方式的对比
1、从优先级来说,代码指定优先于manifest指定
2、两者各有局限,
manifest无法设定 FLAG_ACTIVITY_CLEAR_TOP 标识
代码指定无法指定为 singleInstance启动模式

参考网址:http://www.jianshu.com/p/33d0a0abd990,阿敏其人(简书作者)

在 Java 中,ActivityAndroid 应用程序的核心组件之一。它代表了用户与应用程序交互的一个屏幕,类似于 Windows 中的窗口。Activity 提供了一个用户界面,用于显示应用程序的内容,并处理用户输入。在本文中,我们将详细介绍 Java 中的 Activity。 1. Activity 的生命周期 Activity 的生命周期是指从创建到销毁的整个过程。Activity 的生命周期可以分为以下几个部分: 1.1. 创建阶段 在创建阶段,Activity 将完成以下几个步骤: 1.1.1. onCreate():当 Activity 被创建时,系统会调用 onCreate() 方法。在此方法中,开发者可以初始化 Activity 的布局、绑定事件等。 1.1.2. onStart():当 Activity 准备好与用户进行交互时,系统会调用 onStart() 方法。在此方法中,开发者可以完成一些初始化工作,例如开始动画。 1.1.3. onResume():当 Activity 成为用户焦点并可以与用户进行交互时,系统会调用 onResume() 方法。在此方法中,开发者可以开始处理用户输入事件。 1.2. 运行阶段 在运行阶段,Activity 将完成以下几个步骤: 1.2.1. onPause():当 Activity 失去焦点并不再与用户进行交互时,系统会调用 onPause() 方法。在此方法中,开发者可以停止处理用户输入事件。 1.2.2. onStop():当 Activity 不再可见时,系统会调用 onStop() 方法。在此方法中,开发者可以完成一些清理工作,例如停止动画。 1.3. 销毁阶段 在销毁阶段,Activity 将完成以下几个步骤: 1.3.1. onDestroy():当 Activity 被销毁时,系统会调用 onDestroy() 方法。在此方法中,开发者可以完成一些清理工作,例如释放资源。 2. Activity 的启动方式 在 Java 中,可以通过以下方式启动一个 Activity: 2.1. 显式启动 显式启动是指通过明确指定要启动的 Activity 的类名来启动 Activity。例如: ```java Intent intent = new Intent(this, AnotherActivity.class); startActivity(intent); ``` 2.2. 隐式启动 隐式启动是指通过指定 Action、Category、Data 等信息来启动 Activity,系统将根据这些信息匹配合适的 Activity。例如: ```java Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.example.com")); startActivity(intent); ``` 3. Activity 的传值 在 Java 中,可以通过 Intent 对象来传递数据到另一个 Activity。具体步骤如下: 3.1. 在发送 Intent 时,通过 putExtra() 方法来添加数据: ```java Intent intent = new Intent(this, AnotherActivity.class); intent.putExtra("name", "张三"); intent.putExtra("age", 18); startActivity(intent); ``` 3.2. 在接收 Intent 时,通过 getIntent() 方法获取 Intent 对象,并通过 getXXXExtra() 方法获取数据: ```java Intent intent = getIntent(); String name = intent.getStringExtra("name"); int age = intent.getIntExtra("age", 0); ``` 4. Activity 的返回值 在 Java 中,可以通过 startActivityForResult() 方法启动一个 Activity,并在该 Activity 中设置 setResult() 方法来返回数据。具体步骤如下: 4.1. 在发送 Intent 时,通过 startActivityForResult() 方法启动另一个 Activity: ```java Intent intent = new Intent(this, AnotherActivity.class); startActivityForResult(intent, REQUEST_CODE); ``` 4.2. 在接收 Intent 时,通过 onActivityResult() 方法获取返回的数据: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) { String result = data.getStringExtra("result"); } } ``` 4.3. 在被返回的 Activity 中,通过 setResult() 方法设置返回的数据: ```java Intent intent = new Intent(); intent.putExtra("result", "返回数据"); setResult(RESULT_OK, intent); finish(); ``` 以上就是 Java 中 Activity详解,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值