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 实例。