Android开发学习之activity

Android开发学习之activity

了解activity

     activity(活动)是Android组件中最基本也是最为常见用的四大组件之一。它是Android最容易吸引用户的地方,是一种可以包含用户界面的的组件,主要用于和用户进行交互。
    在一个android应用中,一个activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。activity之间通过Intent进行通信。

activity的基本状态

    在android 中,Activity 拥有四种基本状态:

  • Active/Running
        一个新 Activity 启动入栈后,它显示在屏幕最前端,处理是处于栈的最顶端(Activity栈顶),此时它处于可见并可和用户交互的激活状态,叫做活动状态或者运行状态(active or running)。
  • Paused
        当 Activity失去焦点, 被一个新的非全屏的Activity 或者一个透明的Activity 被放置在栈顶,此时的状态叫做暂停状态(Paused)。此时它依然与窗口管理器保持连接,Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被强行终止掉。所以它仍然可见,但已经失去了焦点故不可与用户进行交互。
  • Stopped
        如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被强行终止掉。
  • Killed
        如果一个Activity是Paused或者Stopped状态,系统可以将该Activity从内存中删除,Android系统采用两种方式进行删除,要么要求该Activity结束,要么直接终止它的进程。当该Activity再次显示给用户时,它必须重新开始和重置前面的状态。

activity的生命周期

    在详谈activity的生命周期之前,我们先来看一张有关activity的生命周期的经典的图:
Alt text
    读懂这张图,相信你对activity的生命周期有了个大概的了解了,下面来逐个了解一下。

  • onCreate (): 该方法是在Activity被创建时回调,它是生命周期第一个调用的方法,我们在创建Activity时一般都需要重写该方法,然后在该方法中做一些初始化的操作,如加载布局,通过setContentView设置界面布局的资源,初始化所需要的组件信息等。

  • onStart() : 此方法被回调时表示Activity正在启动,此时Activity已处于可见状态,只是还没有在前台显示,因此无法与用户进行交互。可以简单理解为Activity已显示而我们无法看见摆了。

  • onResume() : 当此方法回调时,则说明Activity已在前台可见,可与用户交互了(处于前面所说的Active/Running形态),onResume方法与onStart的相同点是两者都表示Activity可见,只不过onStart回调时Activity还是后台无法与用户交互,而onResume则已显示在前台,可与用户交互。当然从流程图,我们也可以看出当Activity停止后(onPause方法和onStop方法被调用),重新回到前台时也会调用onResume方法,因此我们也可以在onResume方法中初始化一些资源,比如重新初始化在onPause或者onStop方法中释放的资源。

  • onPause() : 此方法被回调时则表示Activity正在停止(Paused形态),一般情况下onStop方法会紧接着被回调。但通过流程图我们还可以看到一种情况是onPause方法执行后直接执行了onResume方法,这属于比较极端的现象了,这可能是用户操作使当前Activity退居后台后又迅速地再回到到当前的Activity,此时onResume方法就会被回调。当然,在onPause方法中我们可以做一些数据存储或者动画停止或者资源回收的操作,但是不能太耗时,因为这可能会影响到新的Activity的显示——onPause方法执行完成后,新Activity的onResume方法才会被执行。

  • onStop(): 一般在onPause方法执行完成直接执行,表示Activity即将停止或者完全被覆盖(Stopped形态),此时Activity不可见,仅在后台运行。同样地,在onStop方法可以做一些资源释放的操作(不能太耗时)。

  • onRestart() :表示Activity正在重新启动,当Activity由不可见变为可见状态时,该方法被回调。这种情况一般是用户打开了一个新的Activity时,当前的Activity就会被暂停(onPause和onStop被执行了),接着又回到当前Activity页面时,onRestart方法就会被回调。

  • onDestroy() :此时Activity正在被销毁,也是生命周期最后一个执行的方法,一般我们可以在此方法中做一些回收工作和最终的资源释放。

    以上的7个方法中除了onRestart()方法,其他都是两两相对的,所以又可以将活动分成以下三种生存期:
* 完整生存期:activity在onCreate()方法和onDestroy()方法之间所经历的,就是一个完整的生存期。一般情况下,一个activity会在onCreate方法中完成各种初始化操作,而在onDestroy()方法中完成释放内存的操作。
* 可见生存期:activity在onCreate()方法和onStop()方法之间所经历的,就是可见生存期。我们可以通过这两个方法,合理地管理对那些用户可见的资源,比如,在onStart()方法中对资源进行加载,而在onStop()方法中对资源进行释放,从而保证处于停用状态下的活动不会占用过多的内存。
* 前台生存期:activity在onResume()方法和onPause()方法之间所经历的,就是前台生存期。在前台生存期内,activity总是处于运行状态,此时的activity是可以和用户进行交互的,我们用户平时看到和接触最多的也就是这个状态下的activity。

    说了那么多,下面就让我们通过实践来体验一下activity的生命周期。

体验activity的生命周期

    下面我们通过编写一个Android项目来对activity的周期进行更深入的了解。
* MainActivity


package com.example.administrator.activitylifecycletest;

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 MainActivity extends AppCompatActivity {
    public static final String TAG = "MainActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    Log.d(TAG,"onCreate");
    setContentView(R.layout.activity_main);
    Button startNormalActivity = (Button) findViewById(R.id.start_normal_activity);
    Button startDialogActivity = (Button) findViewById(R.id.start_dialog_activity);
    startNormalActivity.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this,NormalActivity.class);
            startActivity(intent);
        }
    });
    startDialogActivity.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            Intent intent = new Intent(MainActivity.this,DialogActivity.class);
            startActivity(intent);
        }
    });
}
@Override
protected void onStart(){
    super.onStart();
    Log.d(TAG,"onStart");
}
@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");
}

}


* NormalActivity

package com.example.administrator.activitylifecycletest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class NormalActivity extends AppCompatActivity {

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

}

  • DialogActivity
     
    package com.example.administrator.activitylifecycletest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class DialogActivity extends AppCompatActivity {

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

}

这里写图片描述

这里写图片描述
    由于在进行真机测试是无法及时打印全部各个不同周期的测试信息,只能是显示一下个别状态的了。另外,关于对Android开发日志log的使用我也在个人的另一份博客文章中进行了阐述,有兴趣的可以去了解一下。

猜你喜欢

转载自blog.csdn.net/weixin_41897234/article/details/80427083
今日推荐