自学Android开发 Activity的学习

目录

一、什么是activity?

1.1、activity概念

1.2、声明和配置

二、初步了解activity

2.1、生命周期原理图

2.2、生命周期的运用

2.2.1、onCreate()

2.2.2、onStart()

2.2.3、onResume()

2.2.4、onPause()

2.2.5、onStop()

2.2.6、onRestart()

2.2.7、onDestroy()

三、近一步了解

3.1 activity状态更改

3.2特殊activity状态更改

四、推荐的三方工具助力开发

4.1、ButterKnife(黄油刀)

4.2、ARouter


一、什么是activity?

1.1、activity概念

大多数应用包含多个界面,这意味着它们可能包含多个 Activity。通常,应用中的一个 Activity 会被指定为主 Activity,这是用户启动应用时出现的第一个界面。然后,每个 Activity 可以启动另一个 Activity,以执行不同的操作。例如,一个简单的电子邮件应用中的主 Activity 可能会提供显示电子邮件收件箱的界面。主 Activity 可能会从该界面启动其他 Activity,以提供执行写邮件和打开邮件这类任务的界面。

虽然应用中的各个 Activity 协同工作形成统一的用户体验,但每个 Activity 与其他 Activity 之间只存在松散的关联,应用内不同 Activity 之间的依赖关系通常很小。事实上,Activity 经常会启动属于其他应用的 Activity。例如,浏览器应用可能会启动社交媒体应用的“分享”Activity。

要在应用中使用 Activity,您必须在应用的清单文件(AndroidMainifest.xml)中注册关于 Activity 的信息,并且必须适当地管理 Activity 的生命周期。

1.2、声明和配置

要声明 Activity,需注册到清单文件(AndroidMainifest.xml),并添加 <activity> 元素作为 <application> 元素的子元素。

application是每一个APP的唯一实例,可以理解它就是APP的实例。(通俗一点就是APP活着它就在 APP被销毁了它就销毁了)

activity是Android的四大组件。

通过两个的关系就能理解 <activity>是注册在 <application> 下的,也可以猜出其他组件也是注册在

清单文件下注册activity:

<activity android:name = “.activity类名”>
<!-- 如果当前activity是主activity就是第一个启动的activity,反之去掉   -->
    <intent-filter>
        <action android:name = “android.intent.action.MAIN”/>
        <category android:name = “android.intent.category.LAUNCHER”/>
  </intent-filter>
</activity>

二、初步了解activity

2.1、生命周期原理图

 

2.2、生命周期的运用

2.2.1、onCreate()

必须实现此回调,它会在系统创建您的 Activity 时触发。实现应该初始化 Activity 的基本组件:例如,应用应该在此处创建视图并将数据绑定到列表。最重要的是,必须在此处调用setContentView()  来定义 Activity 界面的布局。

onCreate() 完成后,下一个回调将是onStart() 。

2.2.2、onStart()

 onCreate() 退出后,Activity 将进入“已启动”状态,并对用户可见。此回调包含 Activity 进入前台与用户进行互动之前的最后准备工作。

2.2.3、onResume()

系统会在 Activity 开始与用户互动之前调用此回调。此时,该 Activity 位于 Activity 堆栈的顶部,并会捕获所有用户输入。应用的大部分核心功能都是在 onResume()  方法中实现的。

onResume()回调后面总是跟着 onPause() 回调。

2.2.4、onPause()

当 Activity 失去焦点并进入“已暂停”状态时,系统就会调用 onPause()。例如,当用户点按“返回”或“最近使用的应用”按钮时,就会出现此状态。当系统为您的 Activity 调用 onPause() 时,从技术上来说,这意味着您的 Activity 仍然部分可见,但大多数情况下,这表明用户正在离开该 Activity,该 Activity 很快将进入“已停止”或“已恢复”状态。

如果用户希望界面继续更新,则处于“已暂停”状态的 Activity 也可以继续更新界面。例如,显示导航地图屏幕或播放媒体播放器的 Activity 就属于此类 Activity。即使此类 Activity 失去了焦点,用户仍希望其界面继续更新。

不要使用 onPause() 来保存应用或用户数据、进行网络呼叫或执行数据库事务。有关保存数据的信息。

onPause() 执行完毕后,下一个回调为onStop()或 onResume(),具体取决于 Activity 进入“已暂停”状态后发生的情况。

2.2.5、onStop()

当 Activity 对用户不再可见时,系统会调用 onStop()。出现这种情况的原因可能是 Activity 被销毁,新的 Activity 启动,或者现有的 Activity 正在进入“已恢复”状态并覆盖了已停止的 Activity。在所有这些情况下,停止的 Activity 都将完全不再可见。

系统调用的下一个回调将是onRestart()(如果 Activity 重新与用户互动)或者onDestroy()如果 Activity 彻底终止或者用户调用了 finish() )。

2.2.6、onRestart()

当activity处于“已停止”状态的 Activity 即将重启时,系统就会调用此回调。onRestart() 会从 Activity 停止时的状态恢复 Activity。此回调后面总是跟着  onStart()

2.2.7、onDestroy()

系统会在销毁 Activity 之前调用此回调。此回调是 Activity 接收的最后一个回调。通常,实现 onDestroy() 是为了确保在销毁 Activity 或包含该 Activity 的进程时释放该 Activity 的所有资源。

三、近一步了解

3.1 activity状态更改

Activity销毁,原始 Activity 实例将触发 onPause() -> onStop() -> onDestroy() 回调。

系统将创建新的 Activity 实例,触发onCreate() ->onStart() -> onResume() 回调。

如果有新的 Activity 或对话框出现在前台,并且局部覆盖了正在进行的 Activity,则被覆盖的 Activity 会失去焦点并进入“已暂停”状态。然后,系统会调用 onPause()

当被覆盖的 Activity 返回到前台并重新获得焦点时,会调用 onResume() 。

如果有新的 Activity 或对话框出现在前台,夺取了焦点且完全覆盖了正在进行的 Activity,则被覆盖的 Activity 会失去焦点并进入“已停止”状态。然后,系统会快速地接连调用  onPause()  ->onStop()

当被覆盖的 Activity 的同一实例返回到前台时,系统会对该 Activity 调用 onRestart()-> onStart()  ->  onResume()。如果被覆盖的 Activity 的新实例进入后台,则系统不会调用 onRestart(),而只会调用 onStart()  -> onResume() 。

3.2特殊activity状态更改

横屏和竖屏之间的切换。当在横竖屏之间切换时,Activity会依次经过onPause() -> onStop() -> onDestory() -> onCreate() ->onStart() ->onResume() 的过程。即先销毁当前Activity,然后再重新创建Activity。

Android7及以上Android9的版本中,当Activity失去焦点后将会处于onPause()状态。在模拟器中点击下方空白处即会转移到onPause()状态。

在Android10版本的系统中,对这一特性进行了改变,Android10提出了Multi Resume的概念,即可见堆栈中所有可设置为焦点的顶层Activity都处于onResume()状态。

四、推荐的三方工具助力开发

4.1、ButterKnife(黄油刀)

Android 视图的字段和方法绑定,它使用注释处理为您生成样板代码。

  • findViewById通过@BindView在字段上使用来消除调用。
  • 在列表或数组中对多个视图进行分组。使用操作、设置器或属性一次对所有这些进行操作。
  • 通过注释方法@OnClick和其他方法来消除侦听器的匿名内部类。
  • 通过在字段上使用资源注释来消除资源查找。
buildscript {

  repositories {
    mavenCentral()
    google()
  }

  dependencies {
    classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.3'
  }
}
android {
  ...
  // Butterknife requires Java 8.
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

dependencies {
  implementation 'com.jakewharton:butterknife:10.2.3'
  annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'
}

4.2、ARouter

一个用于帮助 Android App 进行组件化改造的框架 —— 支持模块间的路由、通信、解耦

  添加依赖和配置

android {
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }
}

dependencies {
    // 替换成最新版本, 需要注意的是api
    // 要与compiler匹配使用,均使用最新版可以保证兼容
    compile 'com.alibaba:arouter-api:x.x.x'
    annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
    ...
}
// 旧版本gradle插件(< 2.2),可以使用apt插件,配置方法见文末'其他#4'
// Kotlin配置参考文末'其他#5'

初始化SDK

if (isDebug()) {           // 这两行必须写在init之前,否则这些配置在init过程中将无效
    ARouter.openLog();     // 打印日志
    ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(mApplication); // 尽可能早,推荐在Application中初始化

添加注解 

// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = "/test/activity")
public class YourActivity extend Activity {
    ...
}

发起路由操作

// 1. 应用内简单的跳转(通过URL跳转在'进阶用法'中)
ARouter.getInstance().build("/test/activity").navigation();

// 2. 跳转并携带参数
ARouter.getInstance().build("/test/1")
            .withLong("key1", 666L)
            .withString("key3", "888")
            .withObject("key4", new Test("Jack", "Rose"))
            .navigation();

如果感觉对您有意义,就给博主一些鼓励(点赞、关注、收藏),如果有错误欢迎大家评论提出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值