Android基础系列-Activity的生命周期和启动模式

Activity作为android四大组件之一,基本每一个app都会有它的存在,Activity作为用户与系统交互的中介,深入了解Activity,对于开发高质量应用程序是自然是很有帮助的。

  Activity理解起来不难,其实就相当于我们app对外的一个窗口,当我们在开发中创建Activity后,通过调用setContentView(View)方法来给该Activity指定一个布局界面,而这个界面就是提供给用户交互的窗口界面。Android系统中是通过Activity栈的方式来管理Activity的,而Activity自身则是通过生命周期的方法来管理自己的创建与销毁,我们先看看Activity生命周期是如何运作的:

 Activity的生命周期根据activity的行为分为一共有6个阶段-app启动之后分别是-onCreate-这个时候,用户其实是没有看到app界面的;接下来调用onStart方法,这个时候界面其实已经初始化好了,但是还没有渲染到前台,所以我们还是看不到,然后继续调用onResume方法,这个时候我们就可以正常看到界面效果了,当用户启动其他页面或者退出当前页面的时候,会调用-onPause,这个是暂停状态,表示activity暂时退居后台,不在前台显示了;如果用户没有立刻返回原页面,那么紧接着就会调用onStop;前一个activity就彻底处于后台了,如果这个时候用户不再打开之前的activity,那么紧接着就会调用onDestory方法。activity就此销毁但是如果用户在onStop方法之后立马又打开原activity,那么这个时候会调用onResatrt方法,然后继续从onStart方法开始,如下图所示;

有大神总结了一下:

  • 启动 Activiy:onCreate => onStart() => onResume(), Activity 进入运行状态.
  • Activity 退居后台 ( Home 或启动新 Activity ): onPause() => onStop().
  • Activity 返回前台: onRestart() => onStart() => onResume().
  • Activity 后台期间内存不足情况下当再次启动会重新执行启动流程。
  • 锁屏: onPause() => onStop().
  • 解锁: onStart() => onResume().

验证几个主要的生命周期情况

package com.example.app;

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.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView tvNext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvNext = (TextView) findViewById(R.id.tvNext);
        tvNext.setEnabled(true);
        tvNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this, Main2Activity.class));
            }
        });
        Log.d("admin", "onCreate: ");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d("admin", "onStart: ");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("admin", "onResume: ");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d("admin", "onPause: ");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d("admin", "onStop: ");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("admin", "onDestroy: ");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d("admin", "onRestart: ");
    }

}

1、正常启动:

08-28 16:26:47.091 30121-30121/com.example.app D/admin: onCreate: 
08-28 16:26:47.093 30121-30121/com.example.app D/admin: onStart: 
08-28 16:26:47.103 30121-30121/com.example.app D/admin: onResume: 

2、按返回键退出app

08-28 16:33:11.937 30121-30121/com.example.app D/admin: onPause: 
08-28 16:33:12.404 30121-30121/com.example.app D/admin: onStop: 
08-28 16:33:12.405 30121-30121/com.example.app D/admin: onDestroy: 

3、按home键退出

08-28 16:33:50.103 30806-30806/com.example.app D/admin: onPause: 
08-28 16:33:50.156 30806-30806/com.example.app D/admin: onStop: 

4、在3.的基础上再次打开app

08-28 16:33:59.539 30806-30806/com.example.app D/admin: onRestart: 
08-28 16:33:59.540 30806-30806/com.example.app D/admin: onStart: 
08-28 16:33:59.541 30806-30806/com.example.app D/admin: onResume: 

5、正常启动app后在app内跳转另一个页面;

08-28 16:36:15.947 31287-31287/com.example.app D/admin: onCreate: 
08-28 16:36:15.949 31287-31287/com.example.app D/admin: onStart: 
08-28 16:36:15.959 31287-31287/com.example.app D/admin: onResume: 
08-28 16:36:18.099 31287-31287/com.example.app D/admin: onPause: 
08-28 16:36:18.491 31287-31287/com.example.app D/admin: onStop: 

6、在5的基础点返回键

08-28 16:37:28.267 31287-31287/com.example.app D/admin: onRestart: 
08-28 16:37:28.268 31287-31287/com.example.app D/admin: onStart: 
08-28 16:37:28.269 31287-31287/com.example.app D/admin: onResume: 

7、还有很多其他场景,就不列举了,建议多试试;

 

说完Activity的生命周期,再来看看,activity的四种启动模式;

Activity的启动模式分为四种。(standard、singleTop、singTask、singleInstance);
启动模式可在AndroidManifest.xml中,通过<activity>标签的android:launchMode属性设置。

csdn有篇博客讲的很细,很好,有配图,可以看下:https://blog.csdn.net/zy_jibai/article/details/80587083

一、standard模式
    特点:1.Activity的默认启动模式
              2.每启动一个Activity就会在栈顶创建一个新的实例。例如:闹钟程序
    缺点:当Activity已经位于栈顶时,而再次启动Activity时还需要在创建一个新的实例,不能直接复用。

二、singleTop模式
    特点:该模式会判断要启动的Activity实例是否位于栈顶,如果位于栈顶直接复用,否则创建新的实例。 例如:浏览器的书签
    缺点:如果Activity并未处于栈顶位置,则可能还会创建多个实例。

三、singleTask模式
    特点:使Activity在整个应用程序中只有一个实例。每次启动Activity时系统首先检查栈中是否存在当前Activity实例,如果存在
              则直接复用,并把当前Activity之上所有实例全部出栈。例如:浏览器主界面

四、singleInstance模式
    特点:该模式的Activity会启动一个新的任务栈来管理Activity实例,并且该势力在整个系统中只有一个。无论从那个任务栈中    启动该Activity,都会是该Activity所在的任务栈转移到前台,从而使Activity显示。主要作用是为了在不同程序中共享一个Activity 实例。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值