探究活动Activity(2)界面跳转及生命周期

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 探究活动Activity(2)界面跳转及生命周期

1.使用Intent在活动中跳转

首先我们新建一个名为MyActivityTest的项目,其中我们将活动命名为FirstActivity,布局命名为first_layout.xml,记得勾选Generate Layout File ,如下图所示20190226225655742.png

Finish创建然后我们右键点击res→layout→activity_main.xml,打开这个文件,代码如下:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/first_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.myactivitytest.FirstActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
</RelativeLayout>


然后我们对它进行修改,修改完之后如下图所示:


20190226230202689.png


我们给它里面放了一个Buttonkong控件,并创建了标识id。现在我们再创建一个活动,右键点击com.example.myactivitytest→New→Activity→Empty Activity,会弹出一个对话框,我们将这个活动命名为SecondActivity,并勾选Generate Layout File,给布局文件命名为second_layout,如下图所示:


20190226230746543.jpg


还是老样子,打开second_layout.xml,修改里面的布局,如下图所示


20190226231139478.jpg


我们也给它一个Button控件,并给了标识id。接下来打开FirstActivity,来写按钮响应事件及跳转方法


Button button_1 = (Button)findViewById(R.id.button_1);//实例化按钮
        button_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //实例化Intent
                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });


我们在onCreate()方法里面实例化一个按钮,通过按钮的点击响应事件启动监听,在监听方法onClick()里面实例化Intent。


Intent是Android程序各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一般可被用来启动活动、启动服务以及发送广播等场景,我们来看启动活动。


首先构建出一个Intent,传入FirstActivity.this,作为上下文参数,传入SecondActivity.class作为目标活动,意思就是我们在FirstActivity这个活动的基础上打开SecondActivity这个活动,然后通过startActivity()方法来执行这个Intent。就可以实现页面的跳转。


20190227092004120.gif


可以看到已经成功跳转了,接着我们来看activity的生命周期。


2.Activity生命周期


活动的生命周期对任何Android开发者来说都非常重要。


2.1活动状态


活动有四种状态:运行状态、暂停状态、停止状态、销毁状态。


Activity类中定义了7个回调方法,覆盖了活动生命周期的每一个环节,下面详细介绍一下这7个方法。


onCreate() 这个方法会在活动第一次被创建的时候调用,我们可以在这个方法中完成活动的初始化操作,比如加载布局、绑定事件等。


onStart() 这个方法在活动有不可见变为可见的时候调用。


onResume() 这个方法在活动准备好和用户进行交互的时候调用。此时活动处于运行状态。


onPause() 这个方法在系统准备去启动或恢复另一个活动的时候调用。此时活动处于暂停状态

onStop() 这个在活动完全不可见的时候调用,他和**onPause()**的区别在于,如果启动的新活动是一个对话框式的活动,那么onPause()方法会得到执行,而onStop()方法不会执行(因为活动并不是完全不可见),此时活动处于停止状态。

onDestroy() 这个方法在活动被销毁之前调用,之后的活动将变为销毁状态,此时活动处于销毁状态。


活动又分为3种生存期:


完整生存期:活动在onCreate()方法和onDestroy()方法之间所经历的,就是完整生存期。


可见生存期:活动在onStart()方法和onStop()方法之间所经历的的,就是可见生存期。

前台生存期:活动在onResume()方法和onPause()方法之间所经历的就是前台生存期。

下面我们来实际体验一下活动的生命周期。


右键点击com.example.myactivitytest→New→Activity→Empty Activity,会弹出一个对话框,我们将这个活动命名为ThirdActivity,并勾选Generate Layout File,给布局文件命名为third_layout,如下图所示:


20190227102318123.png


然后我们进入AndroidManifest.xml文件,修改一下这个ThirdActivity的配置,如下图所示:


201902271026197.png


我们给它使用了一个android:theme属性,这是用于给当前活动指定主题的,我们用了@style/Theme.AppCompat.Dialog就是让这个活动使用对话框。

现在我们打开first_layout.xml,它里面只有一个按钮,用跳转到SecondActivity的,我们再创建一个按钮,并给上标识id。


<Button
        android:id="@+id/button_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Start ThirdActivity"/>

然后我们在FirstActivity对这个按钮进行相关的监听事件编辑。

代码如下:

Button button_3 = (Button)findViewById(R.id.button_3);
        button_3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(FirstActivity.this,ThirdActivity.class);
                startActivity(intent);
            }
        });


和之前的代码没有什么出入,就是指定的按钮不同,及跳转的页面不同而已,现在我们在FirstActivity中添加那些回调方法,然后Log日志打印,来看看它的生命活动:

打开FirstActivity,图片如下:


20190227104358178.png

@Override
    protected void onStart(){
        super.onStart();
        Log.d(TAG,"onStart");
    }
    @Override
    protected void onResume(){
        super.onResume();
        Log.d(TAG,"onResume");
    }
    @Override
    protected void onPause(){
        super.onPause();
        Log.d(TAG,"onPause");
    }
    @Override
    protected void onStop(){
        super.onStop();
        Log.d(TAG,"onStop");
    }
    @Override
    protected void onDestroy(){
        super.onDestroy();
        Log.d(TAG,"onDestroy");
    }
    @Override
    protected void onRestart(){
        super.onRestart();
        Log.d(TAG,"onRestart");
    }

图片中日志打印在FirstAcvtivity这个活动中,然后在回调方法里面加了日志打印,onCreate()是已经重写了的,所以我们只需要打印就可以了,下面的代码部分有六个回调方法,我们在上面介绍的时候提到过。下面我们来运行一下这个项目,然后会进入到主界面:如下图所示


20190227105835270.png

那么这个时候回使用那些方法呢?


点击Android Studio最下方的Android Monitor


20190227110032658.png


可以看到方法是依次onCreate()、onStart()、onResume()。

现在我们点击第一个按钮Start SecondActivity跳转到第二个页面,然后看这个下面会执行那个回调方法。


20190227110703505.png



我们现在在SecondActivity的布局页面,可以看到先执行onPause(),再执行onStop()。我们这个时候再按返回键BACK返回到第一个界面,再看一下会执行那些回调方法。


20190227111005255.png


可以看到先执行onRestart(),然后onStart(),最后onResume()。

这时候我们点击Start ThirdActivty按钮会弹出一个对话框,


20190227113510971.jpg

此时会执行什么方法呢?


20190227113422284.jpg


执行onPause()方法,因为FirstActivity没有被完全覆盖所以不会执行onStart()方法。

这个时候我们点一下BACK返回到FirstActivity界面,会执行那些方法呢?


20190227113952657.jpg


只会执行onResume()方法。

如果我们这个时候按home键会怎么样呢?


20190227111235126.jpg


按home键返回手机主桌面,此时程序只是被挂起来在后台执行,并没有销毁,所以会执行onPause()和onStop()方法。之后再按一次返回程序才会被销毁,我们从手机桌面回到这个FirstActivity的主界面会执行那些方法呢。看一下


2019022711155144.jpg


有没有发现很熟悉,没错,这个和我们在SecondActivity界面返回到FirstActivty界面时执行的方法一样,不信你回头去看。那么现在我们再点一下返回,程序就会被销毁,真正意思上的退出。


20190227111856902.jpg



程序先执行onPause(),然后onStop(),最后onDestroy()。销毁退出程序。

现在只是一个活动的声明周期,如果我们给SecondActivity也加上打印来看看,会是怎么执行的,SecondActivity代码如下。


package com.example.myactivitytest;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class SecondActivity extends AppCompatActivity {
    private static final String TAG = "SecondActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG,"Second onCreate");
        setContentView(R.layout.second_layout);
        Button button_2 = (Button)findViewById(R.id.button_2);
        button_2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(SecondActivity.this,FirstActivity.class);
                startActivity(intent);
            }
        });
    }
    @Override
    protected void onStart(){
        super.onStart();
        Log.d(TAG,"Second onStart");
    }
    @Override
    protected void onResume(){
        super.onResume();
        Log.d(TAG,"Second onResume");
    }
    @Override
    protected void onPause(){
        super.onPause();
        Log.d(TAG,"Second onPause");
    }
    @Override
    protected void onStop(){
        super.onStop();
        Log.d(TAG,"Second onStop");
    }
    @Override
    protected void onDestroy(){
        super.onDestroy();
        Log.d(TAG,"Second onDestroy");
    }
    @Override
    protected void onRestart(){
        super.onRestart();
        Log.d(TAG,"Second onRestart");
    }
}

注意到,我在SecondActivity的打印里面加了一个Second,用于和FirstActivity的打印日志区分,然后启动项目,点击Start SecondActivity到第二个页面看看。


20190227195757604.png


可以看到,先执行FirstActivity的onPause()方法,然后跳转到SecondActivity页面,跳转的同时执行SecondActivty的onCreate()、onStart()、onResume()。最后是FirstActivity的onStop()方法(和你想的是不是一样的呢),然后我们点击SecondActivty页面上的Retrun FirstActivity按钮返回,再看看会执行什么方法。


20190227200413348.png


注意看和刚才FirstActivity跳转SecondActivity所执行的方法是一样的,那么我们在SecondActivity页面按BACK键返回到FirstActivity和用页面按钮跳转会是一样的吗?


20190227200722248.png


可以看到我们用BACK键返回会执行SecondActivity的onPause()方法,然后执行FirstActivity的onRestart()、onStart()、onResume()。然后执行SecondActivity的onStop()、onDestroy()。和我们刚才用按钮返回不一样。这个就和活动的启动模式有关了,了解活动的生命周期是为了更好的利用手机的存储空间,优化用户体验,这在实际开发中非常重要,相信通过这个例子,你应该了解了,我是初学者-Study。




相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
前端开发 JavaScript Android开发
《移动互联网技术》第五章 界面开发: 掌握Activity的基本概念,Activity的堆栈管理和生命周期
《移动互联网技术》第五章 界面开发: 掌握Activity的基本概念,Activity的堆栈管理和生命周期
101 0
|
调度 Android开发
深入剖析Android四大组件(八)——结束Activity的4个阶段(二)
深入剖析Android四大组件(八)——结束Activity的4个阶段(二)
221 0
深入剖析Android四大组件(八)——结束Activity的4个阶段(二)
|
XML 数据可视化 Java
探究活动Activity
探究活动Activity
探究活动Activity
|
Android开发
深入剖析Android四大组件(八)——结束Activity的4个阶段(一)
深入剖析Android四大组件(八)——结束Activity的4个阶段(一)
271 0
|
Android开发
Android四大组件之一Activity的生命周期
Activity的生命周期给大家整理好了
96 0
Android四大组件之一Activity的生命周期
|
容器
剖析Fragment的Pause生命周期全过程
之前遇到一个问题,与Fragment的Pause生命周期有关,所以就研究了一下Fragment的Pause生命周期特点。就有关这篇笔记。 我们知道Fragment的生命周期是依赖Activity的,所以想探究Fragment的Pause过程需要从Activity的Pause下手。
143 0
|
Java 数据库 Android开发
从源码看 Activity 生命周期(上篇)
从源码看 Activity 生命周期(上篇)
从源码看 Activity 生命周期(上篇)
|
存储 Android开发
Activity的生命周期-典型情况下的生命周期
Activity的生命周期分为两部分内容,一部分是典型情况下的生命周期,另一部分是异常情况下的生命周期。所谓典型情况下的生命周期,是指在有用户参与的情况下,Activity所经过的生命周期的改变;而异常情况下的生命周期是指Activity被系统回收或者由于当前设备的Configuration发生改变从而导致Activity被销毁重建,异常情况下的生命周期的关注点和典型情况下略有不同。
554 0
Activity的生命周期-典型情况下的生命周期