Android活动生命周期 您所在的位置:网站首页 onclickstop Android活动生命周期

Android活动生命周期

2023-05-18 19:31| 来源: 网络整理| 查看: 265

GitHub:https://github.com/MADMAX110/Stopwatch

活动的生命不只是有创建和撤销,onCreate和onDestroy方法用来处理整个生命周期,除了这两个方法,另外还有一些处理活动可见性的生命周期方法。 具体来讲,有三个关键的生命周期方法,可以用来处理活动对用户可见或不可见时的工作。这些方法分别是onStart, onStop, onRestart。 活动对用户可见时会调用onStart。 活动对用户不再可见时会调用onStop。若活动将被撤销而调用onStop,则调用onStop之前就会调用onSaveInstanceState()。 若活动不再可见,在它置为可见之前,会调用onRestart。

可以在之前的秒表应用中添加onStop方法让应用不可见时让秒表停止运行,onStart方法应用可见时让秒表再次启动。

@Override protected void onStop() { //覆盖一个活动生命周期方法时,需要调用相应的Activity超类方法 //否则将会得到一个异常 super.onStop(); running = false; }

下面修改StopwatchActivity,注意增加了onStop, onRestart和wasRunning变量。

package com.hfad.stopwatch; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import java.util.Locale; import android.os.Handler; import androidx.annotation.NonNull; public class StopwatchActivity extends Activity { private int seconds = 0;//记录已经过去的秒数 private boolean running;//秒表是否正常运行 //记录onStop之前秒表是否在运行,这样就知道是否需要恢复运行 private boolean wasRunning; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_stopwatch); if (savedInstanceState != null) { seconds = savedInstanceState.getInt("seconds"); running = savedInstanceState.getBoolean("running"); //保存wasRunning变量的状态 wasRunning = savedInstanceState.getBoolean("wasRunning"); } runTimer();//使用单独的方法更新秒表。创建活动会调用这个方法 } @Override protected void onSaveInstanceState(@NonNull Bundle savedInstanceState) { savedInstanceState.putInt("seconds", seconds); savedInstanceState.putBoolean("running", running); } @Override protected void onStop() { super.onStop(); wasRunning = running; running = false; } @Override protected void onStart() { super.onStart(); if (wasRunning) { running = true; } } //......与之前相同 }

运行应用时会发生什么? 1、用户启动应用时,单击Start按钮让秒表运行 runTimer方法开始递增time_view文本视图中显示的秒数 2、用户导航到设备主屏幕,所以秒表应用不再可见 调用onStop方法,wasRunning设置为true,running设置为false,秒数停止递增。 3、用户再回到秒表应用 调用onStart方法,running设置为true,秒数又开始递增。

如果应用只是部分可见会怎么样? 到目前为止,你已经了解了活动创建和撤销时会发生什么,另外也了解了活动变为可见以及不可见时会发生什么。但是还有一种比较特殊的情况:活动可见但是没有获得焦点,此时活动时暂停的,它上面的活动获得了焦点,下面的活动任然可见,所以会暂停。此时可以用onPause和onResume方法来对应活动暂停和再次启动时的情况 在这里插入图片描述 之前已经通过实现秒表不可见就停止,可见时再开始运行了解了onStop和onStart。这里我们希望活动暂停时停止,活动恢复时再让秒表开始计时,上图是一个Android的完整生命周期。 1、活动启动,运行onCreate和onStart方法 在这里,活动是可见的,不过它还没有得到焦点 2、onResume方法运行。火哦的那个要移到前台时会调用这个方法。 运行onResume方法之后,这个活动得到焦点,用户可以与它交互。 3、用户不再处于前台时会运行onPause方法。 运行onPause方法后,活动仍然可见,但是没有焦点。 4、如果活动再次移入前台,会调用onResume方法。 如果活动反复失去再次得到焦点,活动可能多次进入这个循环。 5、如果用户不再对用户可见,会调用onStop方法. 运行onStop方法后,活动不再可见 6、如果用户再次对用户可见,会调用onRestart方法,接下来会调用onStart和onResume。 活动可能多次进入这个循环 7、最后,活动撤销 活动从运行状态移至撤销状态时,在活动撤销前会调用onPause和onStop方法。

所以综上,我们可以将之前的onStart中的内容移到OnResume,将onStop中的内容移入onPause。 下面是最终版的完整代码:

package com.hfad.stopwatch; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import java.util.Locale; import android.os.Handler; import androidx.annotation.NonNull; public class StopwatchActivity extends Activity { private int seconds = 0;//记录已经过去的秒数 private boolean running;//秒表是否正常运行 //记录onStop之前秒表是否在运行,这样就知道是否需要恢复运行 private boolean wasRunning; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_stopwatch); if (savedInstanceState != null) { seconds = savedInstanceState.getInt("seconds"); running = savedInstanceState.getBoolean("running"); //保存wasRunning变量的状态 wasRunning = savedInstanceState.getBoolean("wasRunning"); } runTimer();//使用单独的方法更新秒表。创建活动会调用这个方法 } @Override protected void onSaveInstanceState(@NonNull Bundle savedInstanceState) { savedInstanceState.putInt("seconds", seconds); savedInstanceState.putBoolean("running", running); } @Override protected void onResume() { super.onResume(); if (wasRunning) { running = true; } } @Override protected void onPause() { super.onPause(); wasRunning = running; running = false; } //启动秒表 public void onClickStart(View view) { running = true; } //停止秒表 public void onClickStop(View view) { running = false; } //单击reset按钮时会调用这个方法 public void onClickReset(View view) { running = false; seconds = 0; } private void runTimer() { //得到文本视图 final TextView timeView = (TextView) findViewById(R.id.time_view); //创建一个新地Handler final Handler handler = new Handler(); //调用post()方法,传入一个新的Runnable。post()方法会立即运行代码 handler.post(new Runnable() { public void run() { int hours = seconds / 3600; int minutes = (seconds%3600)/60; int secs = seconds % 60; //设置显示格式 String time = String.format(Locale.getDefault(), "%d:%02d%02d", hours, minutes, secs); //设置文本视图 timeView.setText(time); if (running) { ++seconds; } //在1000ms后再次提交并运行Runnable中的代码,会反复调用 handler.postDelayed(this, 1000); } }); } }

在这里插入图片描述

生命周期方法快速指南 onCreate():活动第一次创建时调用这个方法,用于正常的静态设置,如创建视图。它还可以传递一个Bundle,其中包含之前保存的活动状态。 onRestart():活动停止并再次启动之前会调用这个方法。 onStart(): 活动变得可见时调用这个方法。如果活动进入前台,接下来会调用onResume,如果活动变得不可见,接下来会调用onStop()。 **onResume()😗*活动在前台时调用这个方法。 onPause():由于另一个活动恢复运行而导致这个活动不再前台时调用这个方法,在这个方法完成之前,不会恢复继续运行下一个活动,所以这个方法中的所有代码需要很快地运行。如果活动返回到前台,接下来会调用onResume方法,如果活动变得不可见,接下来会调用onStop。 onStop():活动不再可见时调用这个方法。这可能是因为另一个活动把它盖住了,或者是因为这个活动被撤销。如果活动再次可见,接下来会调用onRestart,或者如果活动将被撤销,接下来会调用onDestroy。 onDestroy():活动将被撤销或者活动完成时会调用这个方法。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有