148

android开发笔记 | 日志跟踪理解 activity 生命周期

乐果   发表于   2024 年 04 月 07 日 标签:android

因公司技术应用的需要,今年准备为自己增加一门技能:安卓开发。

今天在ubuntu系统环境下,把 Android Studio 编辑器安装好了, 同时也安装了java sdk 8 ……

开发环境

ide 安装: Android Studio 下载

jdk8 安装:华为镜像 可以选择去 Orical 官网下载,但官网下载实在是太慢了,所以选择用华为镜像。

sudo tar -xvzf ./jdk-8u151-linux-x64.tar.gz -C /opt/java

添加环境变量,把下面两行添加到 /etc/profile

export JAVA_HOME=/opt/java/jdk1.8.0_151
export PATH=$JAVA_HOME/bin:$PATH

kotlin

现在的 android 开发跟十年前已经有很大区别,2017年谷歌公司将 kotlin 语言作为 android 开发的主要语言,现在越来越多的应用开始转向 kotlinkotlinjava混合模式开发。

作为新手,建议买一本书籍熟悉一下,例如我买了人民邮电出版社(图灵)的这本:Android编程权威指南(第4版) ,有需要电子版的可以私下向我索要。

activity 生命周期

这几天学习过程中,发现安卓的开发跟现在的前端开发比较像,组件化、事件驱动等。

android 的每个 Activity 实例都有其生命周期。在其生命周期内,activity运行、暂停、停止和不存 在这四种状态间转换。每次状态转换时,都有相应的 Activity 函数发消息通知 activity

上图显示了 activity 的生命周期、状态以及状态切换时系统调用的函数。 内存中是否有 activity 实例、用户是否可见、是否活跃在前台(等待或接受用户输入中),看图中的各种状态就知道了。

不存在(Nonexistent) 表示某个 activity 还没启动或已销毁(例如,用户按了回退键)。因为已销毁这个可能状态,所以不存在状态有时被称为已销毁状态。此时,内存里没有这个 activity 实例,也没有用户可见或可交互的关联视图。

停止(Stopped) 表示某个 activity 实例在内存里,但用户在屏幕上看不到关联视图。在某个 activity 刚开始出现前作为瞬间状态存在,但在 activity 的关联视图被完全遮挡时又重现该状态(例如,用户启动另一个用户可见的全屏 activity,点击 Home 键,或者使用预览界面切换任务)。

暂停(Paused) 表示某个 activity 处于前台非活动状态,关联视图可见或部分可见。如果用户启动一个新的对话框形式,或者透明的 activity 在某个 activity 之上,我们就说该 activity 处于部分可见状态。一个 activity 也可能完全可见,但并不处于前台,比如用户在多窗口模式(又叫分屏模式)下同时查看两个 activity

运行(Resumed) 表示某个 activity 实例在内存里,用户完全可见,且处于前台。用户当前正与之交互。设备上有很多应用,但是,任何时候只能有一个 activity 处于能与用户交互的运行状态。这也意味着,如果某个 activity 进入继续运行状态,那么其他 activity 可能正在退出运行状态。

Activity 的子类可以在 activity 的生命周期状态发生关键性转换时完成某些工作。

这些函数通常被称为生命周期回调函数

我们已熟悉这些生命周期回调函数中的 onCreate(Bundle?)。 在创建 activity 实例后,但在此实例出现在屏幕上之前,Android 操作系统会调用该函数。通常,通过覆盖 onCreate(Bundle?) 函数,activity 可以预处理以下 UI 相关工作:

  • 实例化部件并将它们放置在屏幕上(调用 setContentView(Int));
  • 引用已实例化的部件;
  • 为部件设置监听器以处理用户交互;
  • 访问外部模型数据。

切记,千万不要自己去调用 onCreate(Bundle?) 函数或任何其他 activity 生命周期函数。

为通知 activity 状态变化,你只需在 Activity 子类里覆盖这些函数,Android 会适时调用它们(看当前用户状态以及系统运行情况)。

日志跟踪理解 activity 生命周期

Androidandroid.util.Log 类能够向系统级共享日志中心发送日志信息。 Log 类有好几个日志记录函数。 本书用得最多的是以下函数:

public static Int d(String tag, String msg) - d 代表“debug”,用来表示日志信息的级别。 - 第一个参数是日志的来源; - 第二个参数是日志的具体内容。

该函数的第一个参数值通常以类名传入。

这样,就很容易看出日志信息的来源。

MainActivity.kt 中,为 MainActivity 类新增一个 TAG 常量,如代码:

import ...
private const val TAG = "MainActivity"
class MainActivity : AppCompatActivity() {
...
}

接下来,在 MainActivity 类的 onCreate(Bundle?) 之后,覆盖其他五个生命周期函数,如代码:

class MainActivity : AppCompatActivity() {
  ...
  override fun onCreate(savedInstanceState: Bundle?) {
     ...
  }
  
  override fun onStart() {
    super.onStart()
    Log.d(TAG, "onStart() called")
  }
  
  override fun onResume() {
    super.onResume()
    Log.d(TAG, "onResume() called")
  }
  
  override fun onPause() {
    super.onPause()
    Log.d(TAG, "onPause() called")
  }
  
  override fun onStop() {
    super.onStop()
    Log.d(TAG, "onStop() called")
  }
  
  override fun onDestroy() {
    super.onDestroy()
    Log.d(TAG, "onDestroy() called")
  }
  
  private fun updateQuestion() {
  ...
  }
  ...
}

乐果   发表于   2024 年 04 月 07 日 标签:android

0

文章评论