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的生命周期的经典的图:
读懂这张图,相信你对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的使用我也在个人的另一份博客文章中进行了阐述,有兴趣的可以去了解一下。