一文带你精通Android中的Activity

本文将会从活动的生命周期、启动模式、Intent数据传输、最佳实践等多维度来讲解Activity,希望对你有用

生命周期

  • 深入理解活动的生命周期,可以帮助我们更加流畅地编程,并在管理系统资源方面更加游刃有余

活动状态

每个活动在生命周期中最多有运行、暂停、停止、销毁四种状态

  • 1)运行状态:当一个活动在返回栈的栈顶时,该活动就处于运行状态,如果回收处于运行状态的活动,会带来极差的用户体验
  • 2)暂停状态:当活动不再处于栈顶,但仍然可见时,则活动进入了暂停状态(并非每个活动都会占满屏幕);处于暂停状态的活动属于完全存活;只有在内存非常紧张的情况下,系统才会考虑回收该状态的活动
  • 3)停止状态:当活动不再处于栈顶,且完全不可见时,会进入停止状态;系统仍然会为该状态的活动保存相应的状态和成员变量;当其他地方需要内存时,系统可能会回收该状态的活动
  • 4)销毁状态:当活动从返回栈中移除后就变成了销毁状态,系统会最为倾向于回收处于该状态的活动,以保证系统的内存充足

生存期 & 回调方法

Activity有如下7个回调函数,覆盖活动生命周期的每个环节:

  • onCreate()在活动第一次被创建时调用,用于完成活动的初始化操作,如:布局加载、绑定事件
  • onStart():在活动由不可见变为可见时调用

  • onResume():在活动准备好和用户交互时调用,该活动会处于返回栈的栈顶,且活动处于运行状态
  • onPause()在系统准备去启动或恢复其他活动时调用,通常会在该方法中释放比较消耗CPU的资源,以及某些关键数据

  • onStop()在活动完全不可见时调用,和onPause()方法的主要区别在于:如果启动的新活动是对话框类的活动,onPause()方法会执行,而onStop()方法并不会执行
  • onDestory()在活动被销毁前调用,之后活动的状态将变为销毁状态,常用于完成内存释放等操作

  • onRestart():在活动由停止变为运行状态前调用,即让活动重新启动

以上,除了onRestart(),其他方法都是两两相对的,所以,活动可分为三种生存期:

  • 完整生存期:活动在onCreate()方法和onDestory()方法之间所经历的,即为完整的生存期
  • 可见生存期:活动在onStart()方法和onStop()方法之间所经历的,为可见生存期,即活动对用户总是可见的,即便可能无法和用户交互;可通过onStart()和onStop()方法来合理地管理对用户可见的资源以保证处于停止状态的活动不会占用过多内存
  • 前台生存期:活动在onResume()方法和onPause()方法之间所经历的,即为前台生存期 =》活动总是处于运行状态,活动可以和用户交互

代码验证

  • 在LifecycleActivity、NormalActivity的生命周期的回调方法中输出日志以便于查看:
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.example.myapplication1.R;

public class LifecycleActivity extends AppCompatActivity {
   
   

    public static final String TAG = "LifecycleActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lifecycle);

        Log.d(TAG, "--- onCreate ---");

        Button startNormalBtn = (Button) findViewById(R.id.start_normal_btn);
        startNormalBtn.setOnClickListener(new View.OnClickListener() {
   
   
            @Override
            public void onClick(View v) {
   
   
                startActivity(new Intent(LifecycleActivity.this, NormalActivity.class));
            }
        });
    }

    @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
    public void onRestart() {
   
   
        super.onRestart();
        Log.d(TAG, "--- onRestart ---");
    }
}
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import com.example.myapplication1.R;

public class NormalActivity extends AppCompatActivity {
   
   

    public static final String TAG = "NormalActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_normal);

        Log.d(TAG, "--- onCreate ---");
    }

    @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
    public void onRestart() {
   
   
        super.onRestart();
        Log.d(TAG, "--- on
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值