首页 > 其他分享 >Android生命周期继续踩坑

Android生命周期继续踩坑

时间:2023-04-18 15:14:18浏览次数:58  
标签:生命周期 调用 应用 activity onRestart Android onCreate 继续

  1. android.overridePathCheck=true“覆盖路径检查” as出现问题 connect time out 

  2. 在多个窗口中使用 Logcat

    标签页可帮助您在不同的设备或查询之间轻松切换。您可以点击 New Tab 图标 “New Tab”图标 创建多个 Logcat 标签页。 右键点击标签页可对其重命名和重新排列。

    此外,您还可以在标签页中拆分视图,以便更轻松地比较两组日志。如需创建分屏,请右键点击日志视图,或点击工具栏中的 Split Panels 选项,然后选择 Split Right 或 Split Down。如需取消分屏,请右键点击并选择 Close。每个分屏都允许您设置自己的设备连接、视图选项和查询。

    多个 Logcat 窗口 图 2. 在 Android Studio Electric Eel 中拆分 Logcat 窗口。

    在 Logcat 工具栏中,您可以滚动到日志的末尾,也可以点击特定行以使该行保持可见。

  3. 您可使用 onCreate() 方法为 activity 执行所有一次性初始化。例如,在 onCreate() 中,您可以膨胀布局、定义点击监听器或设置数据绑定。

    9be2255ff49e0af8.png

    系统会在初始化 activity 之后(在内存中创建新的 Activity 对象后)立即调用一次 onCreate() 生命周期方法。执行 onCreate() 后,相应 activity 会被视为已创建。

    注意:onCreate() 方法是替换方法。如果您替换了任何生命周期方法,则必须立即调用 super.onCreate()

    您可使用 onCreate() 方法为 activity 执行所有一次性初始化。例如,在 onCreate() 中,您可以膨胀布局、定义点击监听器或设置数据绑定。

    9be2255ff49e0af8.png

    系统会在初始化 activity 之后(在内存中创建新的 Activity 对象后)立即调用一次 onCreate() 生命周期方法。执行 onCreate() 后,相应 activity 会被视为已创建。

    注意:onCreate() 方法是替换方法。如果您替换了任何生命周期方法,则必须立即调用 super.onCreate()

  4. Log.i("MainActivity", "onCreate Called")

    Log 类会将消息写入 Logcat。此命令包含三个部分:

    • 日志消息的严重程度,即消息的重要性。在本示例中,Log.i() 方法会写入一条信息性消息。Log 类中的其他方法包括 Log.e()(表示错误)或 Log.w()(表示警告)。
    • 日志标签,在本示例中为 "MainActivity"。该标签是一个字符串,可让您更轻松地在 Logcat 中找到自己的日志消息。该标签通常是类的名称。
    • 实际的日志消息,即一个简短的字符串,在本示例中为 "onCreate called"
      Log.i("MainActivity", "onCreate Called")

      Log 类会将消息写入 Logcat。此命令包含三个部分:

      • 日志消息的严重程度,即消息的重要性。在本示例中,Log.i() 方法会写入一条信息性消息。Log 类中的其他方法包括 Log.e()(表示错误)或 Log.w()(表示警告)。
      • 日志标签,在本示例中为 "MainActivity"。该标签是一个字符串,可让您更轻松地在 Logcat 中找到自己的日志消息。该标签通常是类的名称。
      • 实际的日志消息,即一个简短的字符串,在本示例中为 "onCreate called"

 

 

 

  1. 系统会在调用 onCreate() 生命周期方法之后立即调用 onStart()onStart() 运行后,您的 activity 会显示在屏幕上。与为初始化 activity 而仅调用一次的 onCreate() 不同,onStart() 可在 activity 的生命周期内多次调用。
  2. 385df4ce82ae2de9.png
  3. 请注意,onStart() 需要与相应的 onStop() 生命周期方法配对使用。如果用户启动您的应用后又返回设备的主屏幕,相应 activity 会停止,并且不会再在屏幕上显示。
  4. 系统会在调用 onCreate() 生命周期方法之后立即调用 onStart()onStart() 运行后,您的 activity 会显示在屏幕上。与为初始化 activity 而仅调用一次的 onCreate() 不同,onStart() 可在 activity 的生命周期内多次调用。
  5. 385df4ce82ae2de9.png
  6. 请注意,onStart() 需要与相应的 onStop() 生命周期方法配对使用。如果用户启动您的应用后又返回设备的主屏幕,相应 activity 会停止,并且不会再在屏幕上显示。
  7.  Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.5.1, expected version is 1.1.16.
  8. build gradle ext-versoin  

 

  1. Invoke-customs are only supported starting with Android O (--min-api 26)]Invoke-customs are only supported starting with Android O (--min-api 26)]
  2. 当 activity 从头开始启动时,您会看到系统按顺序调用以下三个生命周期回调:

    • onCreate():用于创建应用。
    • onStart():用于启动相应 activity,并让其在屏幕上显示。
    • onResume():用于使相应 activity 成为焦点,并让用户能够与其互动。

    onResume() 方法尽管名称是这样,但会在启动时调用,即使没有要恢复的 activity 也是如此。

    当 activity 从头开始启动时,您会看到系统按顺序调用以下三个生命周期回调:

    • onCreate():用于创建应用。
    • onStart():用于启动相应 activity,并让其在屏幕上显示。
    • onResume():用于使相应 activity 成为焦点,并让用户能够与其互动。

    onResume() 方法尽管名称是这样,但会在启动时调用,即使没有要恢复的 activity 也是如此。

  3. 每次用户离开您的 activity 时,它都不会关闭:

    • 当 activity 不再在屏幕上可见时,就说明该 activity 已置于后台(与之相反的是 activity 位于前台或屏幕上)。
    • 当用户返回您的应用时,相应 activity 会重启并再次可见。这部分生命周期称为应用的可见生命周期。

    当您的应用位于后台时,为保留系统资源和延长电池续航时间,应用不应活跃运行。您可以使用 Activity 生命周期及其回调来了解应用何时切换到后台,以便您暂停任何正在进行的操作。然后,在您的应用进入前台时重启这些操作。

    例如,假设某个应用需要大量使用计算资源。此应用可能会使用设备的 CPU 进行许多计算。移动设备的处理能力和电池续航时间通常受到限制,因此 Android 运行时系统需要均衡资源。由于后台进程可能会降低性能或过早耗尽手机电量,因此 Android 可能会阻止未在前台运行的应用使用资源。

    每次用户离开您的 activity 时,它都不会关闭:

    • 当 activity 不再在屏幕上可见时,就说明该 activity 已置于后台(与之相反的是 activity 位于前台或屏幕上)。
    • 当用户返回您的应用时,相应 activity 会重启并再次可见。这部分生命周期称为应用的可见生命周期。

    当您的应用位于后台时,为保留系统资源和延长电池续航时间,应用不应活跃运行。您可以使用 Activity 生命周期及其回调来了解应用何时切换到后台,以便您暂停任何正在进行的操作。然后,在您的应用进入前台时重启这些操作。

    例如,假设某个应用需要大量使用计算资源。此应用可能会使用设备的 CPU 进行许多计算。移动设备的处理能力和电池续航时间通常受到限制,因此 Android 运行时系统需要均衡资源。由于后台进程可能会降低性能或过早耗尽手机电量,因此 Android 可能会阻止未在前台运行的应用使用资源。

    1. 请注意,系统会调用 onPause() 方法和 onStop() 方法,但不会调用 onDestroy()。返回主屏幕的操作会将您的应用置于后台,而不是完全关闭应用。38710e0d2c4d1910.png

    在调用 onPause() 后,该应用不会再获得焦点。在 onStop() 之后,该应用将不再显示在屏幕上。虽然该 activity 已停止,但 Activity 对象仍位于内存中(在后台)。该 activity 尚未销毁。用户可能会返回该应用,因此 Android 会保留您的 activity 资源。

    b488b32801220b79.png

    1. 使用“最近”屏幕返回该应用。请注意,在 Logcat 中,该 activity 使用 onRestart() 和 onStart() 重启,然后使用 onResume() 恢复。

    f6275abeaa53abe4.png

    当该 activity 返回前台时,系统不会再次调用 onCreate() 方法。相应 activity 对象未被销毁,因此不需要重新创建。系统会调用 onRestart() 方法,而不是 onCreate()。请注意,这一次该 activity 返回前台时,系统会保留 Desserts Sold 数值。

    1. 除 DessertClicker 以外,至少启动一个应用,这样设备的“最近使用的应用”屏幕中就会有一些应用。
    2. 启动“最近使用的应用”屏幕,然后打开另外一个近期 activity。然后,返回最近用过的应用并让 DessertClicker 返回前台。

    请注意,您在 Logcat 这里看到的回调与按主屏幕按钮后看到的相同。当应用进入后台时,系统会调用 onPause() 和 onStop(),并在应用返回时调用 onRestart()onStart() 和 onResume()

    此处的要点是,当用户导航到该 activity 或离开该 activity 时,系统会多次调用 onStart() 和 onStop()。您应替换这些方法,使应用在进入后台后停止运行,或者在返回前台时重新启动。

    onRestart() 又是什么情况呢?onRestart() 方法与 onCreate() 非常相似。无论是 onCreate() 还是 onRestart(),都会在相应 activity 变得可见之前调用。onCreate() 方法只在第一次被调用,之后会调用 onRestart()onRestart() 方法用于放置仅在 activity 不是首次启动时才需要调用的代码。

    1. 请注意,系统会调用 onPause() 方法和 onStop() 方法,但不会调用 onDestroy()。返回主屏幕的操作会将您的应用置于后台,而不是完全关闭应用。38710e0d2c4d1910.png

    在调用 onPause() 后,该应用不会再获得焦点。在 onStop() 之后,该应用将不再显示在屏幕上。虽然该 activity 已停止,但 Activity 对象仍位于内存中(在后台)。该 activity 尚未销毁。用户可能会返回该应用,因此 Android 会保留您的 activity 资源。

    b488b32801220b79.png

    1. 使用“最近”屏幕返回该应用。请注意,在 Logcat 中,该 activity 使用 onRestart() 和 onStart() 重启,然后使用 onResume() 恢复。

    f6275abeaa53abe4.png

    当该 activity 返回前台时,系统不会再次调用 onCreate() 方法。相应 activity 对象未被销毁,因此不需要重新创建。系统会调用 onRestart() 方法,而不是 onCreate()。请注意,这一次该 activity 返回前台时,系统会保留 Desserts Sold 数值。

    1. 除 DessertClicker 以外,至少启动一个应用,这样设备的“最近使用的应用”屏幕中就会有一些应用。
    2. 启动“最近使用的应用”屏幕,然后打开另外一个近期 activity。然后,返回最近用过的应用并让 DessertClicker 返回前台。

    请注意,您在 Logcat 这里看到的回调与按主屏幕按钮后看到的相同。当应用进入后台时,系统会调用 onPause() 和 onStop(),并在应用返回时调用 onRestart()onStart() 和 onResume()

    此处的要点是,当用户导航到该 activity 或离开该 activity 时,系统会多次调用 onStart() 和 onStop()。您应替换这些方法,使应用在进入后台后停止运行,或者在返回前台时重新启动。

    onRestart() 又是什么情况呢?onRestart() 方法与 onCreate() 非常相似。无论是 onCreate() 还是 onRestart(),都会在相应 activity 变得可见之前调用。onCreate() 方法只在第一次被调用,之后会调用 onRestart()onRestart() 方法用于放置仅在 activity 不是首次启动时才需要调用的代码。

    1. 请注意,系统会调用 onPause() 方法和 onStop() 方法,但不会调用 onDestroy()。返回主屏幕的操作会将您的应用置于后台,而不是完全关闭应用。38710e0d2c4d1910.png

    在调用 onPause() 后,该应用不会再获得焦点。在 onStop() 之后,该应用将不再显示在屏幕上。虽然该 activity 已停止,但 Activity 对象仍位于内存中(在后台)。该 activity 尚未销毁。用户可能会返回该应用,因此 Android 会保留您的 activity 资源。

    b488b32801220b79.png

    1. 使用“最近”屏幕返回该应用。请注意,在 Logcat 中,该 activity 使用 onRestart() 和 onStart() 重启,然后使用 onResume() 恢复。

    f6275abeaa53abe4.png

    当该 activity 返回前台时,系统不会再次调用 onCreate() 方法。相应 activity 对象未被销毁,因此不需要重新创建。系统会调用 onRestart() 方法,而不是 onCreate()。请注意,这一次该 activity 返回前台时,系统会保留 Desserts Sold 数值。

    1. 除 DessertClicker 以外,至少启动一个应用,这样设备的“最近使用的应用”屏幕中就会有一些应用。
    2. 启动“最近使用的应用”屏幕,然后打开另外一个近期 activity。然后,返回最近用过的应用并让 DessertClicker 返回前台。

    请注意,您在 Logcat 这里看到的回调与按主屏幕按钮后看到的相同。当应用进入后台时,系统会调用 onPause() 和 onStop(),并在应用返回时调用 onRestart()onStart() 和 onResume()

    此处的要点是,当用户导航到该 activity 或离开该 activity 时,系统会多次调用 onStart() 和 onStop()。您应替换这些方法,使应用在进入后台后停止运行,或者在返回前台时重新启动。

    onRestart() 又是什么情况呢?onRestart() 方法与 onCreate() 非常相似。无论是 onCreate() 还是 onRestart(),都会在相应 activity 变得可见之前调用。onCreate() 方法只在第一次被调用,之后会调用 onRestart()onRestart() 方法用于放置仅在 activity 不是首次启动时才需要调用的代码。

  4. 共享 activity 出现在屏幕的下半部分,但相应 activity 在上半部分仍然可见。

    1. 检查 Logcat,您会注意到,系统仅调用了 onPause()cf96ef14999a9a3c.png

    在此用例中,系统没有调用 onStop(),因为相应 activity 仍然部分可见。但是,该 activity 没有用户焦点,并且用户无法与之交互。位于前台的“分享”activity 具有用户焦点。

    为什么这种区别至关重要?以之前的计算密集型应用为例。您可能希望该应用在转入后台后停止运行,但在其被部分遮挡时继续运行。在这种情况下,您可以在 onStop() 中终止它。如果您希望该应用在相应 activity 被部分遮挡时也停止运行,则需要在 onPause() 中放置用于终止应用的代码。

    在 onPause() 中运行的任何代码都会阻止其他内容显示,因此请使 onPause() 中的代码保持轻量级。例如,当有来电时,onPause() 中的代码可能会延迟来电通知。

    1. 在共享对话框之外点击一下,返回应用,您会注意到系统调用了 onResume()

    onResume() 和 onPause() 都必须处理焦点。当相应 activity 具有焦点时,系统会调用 onResume() 方法;当该 activity 失去焦点时,系统会调用 onPause()

  5. 在更复杂的 Android 应用中,您可能会在 onStart() 或 onCreate() 中设置许多内容,然后在 onStop() 或 onDestroy() 中将其全部拆解。例如,您可能有动画、音乐、传感器或计时器需要设置和拆解以及启动和停止。如果您忘记了一个,就会导致 bug 和麻烦。

    生命周期库(它是 Android Jetpack 的一部分)可以简化此任务。当您必须跟踪许多可动部分而其中某些部分处于不同的生命周期状态时,该库特别有用。该库反转了生命周期的工作方式:通常,activity 或 fragment 会告知组件(如 DessertTimer)在发生生命周期回调时要执行什么操作。但是,当您使用生命周期库时,组件本身会观察生命周期的变化,然后在发生这些变化时执行所需的操作。

    生命周期库有三个主要部分:

    • 生命周期所有者 - 具有(和“拥有”)生命周期的组件。Activity 和 Fragment 就是生命周期所有者。生命周期所有者会实现 LifecycleOwner 接口。
    • Lifecycle 类 - 保存生命周期所有者的实际状态,并在生命周期发生变化时触发事件。
    • 生命周期观察器 - 观察生命周期状态,并在生命周期发生变化时执行任务。生命周期观察器会实现 LifecycleObserver 接口。
  6. 生命周期库的一个关键部分是生命周期观察的概念。观察可让类(如 DessertTimer)了解 activity 或 fragment 生命周期,并启动和停止它们自己来响应这些生命周期状态的变化。借助生命周期观察器,您可以让 activity 和 fragment 方法摆脱启动和停止对象的责任。

    1. 打开 DesertTimer.kt 类。
    2. 将 DessertTimer 类的类签名更改为如下所示:
     
    class DessertTimer(lifecycle: Lifecycle) : LifecycleObserver {

    这一新类定义起到两个作用:

    • 构造函数接受一个 Lifecycle 对象,该对象是计时器观察的生命周期。
    • 该类定义会实现 LifecycleObserver 接口。
    1. 在 DessertTimer 类中 runnable 变量的声明下面,向该类定义中添加一个 init 代码块。在 init 代码块中,使用 addObserver() 方法将从所有者(即 activity)传入的生命周期对象连接到此类(即观察器)。

标签:生命周期,调用,应用,activity,onRestart,Android,onCreate,继续
From: https://www.cnblogs.com/lvshy/p/17329637.html

相关文章

  • Plugin ‘Android WiFi ADB’ is compatible with IntelliJ IDEA only because it doe
    Plugin‘AndroidWiFiADB’iscompatiblewithIntelliJIDEAonlybecauseitdoesn’tdefineanyexplicitmoduledependenciesAndroidStudio中安装AndroidWiFiADB插件重启时报错怎么解决Plugin‘AndroidWiFiADB’iscompatiblewithIntelliJIDEAonlyb......
  • 一统天下 flutter - widget 基础: 生命周期
    一统天下flutterhttps://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-widget基础:生命周期示例如下:lib\widget\basic\lifecycle.dart/**生命周期*/import'package:flutter/material.dart';import'../../helper.dart';classLifecy......
  • android中软键盘的打开关闭及判断操作
    /**隐藏软键盘**/Viewview=getWindow().peekDecorView();if(view!=null){InputMethodManagerinputmanger=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);inputmanger.hideSoftInputFromWindow(view......
  • Android中架构X64与X32的不同
    1.Android中架构X64与X32的不同。众所周知,安卓支持3类处理器(CPU):ARM,Intel和MIPS。其中ARM无疑被使用得最为广泛。Intel因为普及于台式机和服务器而被人们所熟知,然而对移动行业影响力相对较小。MIPS在32位和64位嵌入式领域中历史悠久,获得了不少的成功,可目前Android的采用率在三者......
  • Android Jar中实现另一个Jar中接口的解决办法
    |加固与逆向是一场永不停息的战争如题,今天在写jar包的时候遇到这样的一个问题,甲方呢想让我的jar包中的接口删除,然后jar包中的类去实现他们jar包中的接口,但是,我的jar包中又不能加载他们的jar包,看官老爷们可以想象一下当时操蛋的场景,没有接口,我的具体实现类就会报错,一报错就打包......
  • Android_关于程序产生 65535 (64K)的解决办法
    随着应用不断迭代,业务线的扩展,应用越来越大(比如集成了各种第三方sdk或者公共支持的jar包,项目耦合性高,重复作用的类越来越多),相信很多人都遇到过如下的错误:UNEXPECTEDTOP-LEVELEXCEPTION:java.lang.IllegalArgumentException:methodIDnotin[0,0xffff]:65536atco......
  • android 抽屉的一些小问题
    1、如果给SlidingDrawer添加android:clickable="true"则在抽屉活动的一块区域屏幕不会响应其他点击事件,即使抽屉式关闭的。 2、android:handle="@+id/handle"里面的handle是SlidingDrawer标签里面你要作为抽屉图标的view的id。android:content="@+id/all_run_app"中的all_run_app......
  • android bitmap oom 处理
    如果activity结束了就  bitmap.recycle(); 如果涉及到重复加载按钮的:if(bitmap!=null&&!bitmap.isRecycled()){bitmap.recycle();bitmap=null;//这里最好加上这一句Log.e("freeBitmap","=============recyclebitmap=======");}......
  • 如何让Android支持GIF图片
    publicclassSampleViewextendsView{privateMoviemMovie;privateBitmapmBitmap;privateCanvasmCanvas;privatelongmMovieStart;privatebyte[]streamToBytes(InputStreamis){ByteArrayOutputStreamos=newByteArrayOutp......
  • 理解Android系统的进程间通信原理(一)----RPC中的代理模式
    理解Android系统的进程间通信原理(一)----RPC中的代理模式Android系统中的进程间通信是通过一个轻量级的RPC(RemoteProcedureCall远程进程调用)和AIDL(AndroidInterfaceDefininationLanguage)规范来生成两个进程之间可以相互访问的代码。其中RPC是以接口方式来实现,客户端与被......