Android Studio教程03-Activtiy生命周期的理解

android studio 下载 | 2019-01-17 12:22

一个Activity就是一个屏幕页面

一个APP中有很多个Activity(打开邮件app,打开具体邮件)

APP一般从MainActivity中启动的,当然了,这个也可以修改的

APP内的Activity可以通过一些方法(Intent...)进行切换(打开邮件app -> 打开具体邮件)

APP之间的Activity也可以互相切换(从浏览器页面 -> facebook页面)

进入 AndroidManifest.xml在 application下添加一个 activity元素

Intentfilters可以显示或者隐式的启动activity,我们可以利用这个属性来扩展activity功能

<activity

android:name=".MainActivity"

android:label="FirstPage"

android:icon="@drawable/app_icon">

<!--intent-filter放在哪个activity,这个actiivty就是默认启动的activity-->

<intent-filter>

<!--action:这个activity可以发送数据-->

<action android:name="android.intent.action.SEND" />

<!--category:这个activity可以接收请求-->

<category android:name="android.intent.category.DEFAULT" />

<!--data:这个activity可以接收数据类型-->

<data android:mimeType="text/plain" />

</intent-filter>

</activity>

<activity

android:name=".SecondActivity"

android:label="SecondPage"

></activity>

程序调用过程

// Create the text message with a string

Intent sendIntent = new Intent();

sendIntent.setAction(Intent.ACTION_SEND);

sendIntent.setType("text/plain");

sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);

// Start the activity

startActivity(sendIntent);

插入activity01.md插入activity02.md

通过代表控件的对象来更改控件内容

首先我们来看一下谷歌官网发布的图

作用: 初始化 + 进入启动阶段

在Activity对象第一次被创建时调用,必须重写

那么在 onCreate() 应该执行一些什么操作呢?

在整个生命周期只需要执行一次的操作

初始化 Activity 的必需组件

调用 setContentView()来定义用户界面的布局

接收的参数为 savedInstanceState:表示活动前所保存的状态,如果这个活动之前没有启动过,那么 Bundle的值为 null

onCreate() 之后:进入启动阶段

TextView mTextView;

// some transient state for the activity instance

String mGameState;

public void onCreate(Bundle savedInstanceState) {

// 调用父类的onCreate方法

super.onCreate(savedInstanceState);

// recovering the instance state

if (savedInstanceState != null) {

mGameState = savedInstanceState.getString(GAME_STATE_KEY);

// 设置界面布局文件(res/layout/main_activity.xml)

setContentView(R.layout.main_activity);

// 初始化一些部件,这样在下面的方法中可以操作

mTextView = (TextView) findViewById(R.id.text_view);

// This callback is called only when there is a saved instance that is previously saved by using

// onSaveInstanceState(). We restore some state in onCreate(), while we can optionally restore

// other state here, possibly usable after onStart() has completed.

// The savedInstanceState Bundle is same as the one used in onCreate().

public void onRestoreInstanceState(Bundle savedInstanceState) {

mTextView.setText(savedInstanceState.getString(TEXT_VIEW_KEY));

// invoked when the activity may be temporarily destroyed, save the instance state here

public void onSaveInstanceState(Bundle outState) {

outState.putString(GAME_STATE_KEY, mGameState);

outState.putString(TEXT_VIEW_KEY, mTextView.getText());

// call superclass to save any view hierarchy

super.onSaveInstanceState(outState);

作用: 使Activity可见,可视化页面会显示出来 + 进入Resume阶段

完成得特别快

一旦执行完成,直接进入 onResume()阶段

所有生命周期组件会收到 onStart()事件

作用: app可以和用户交互

app会一直停留在这个阶段,直到有什么操作打断他(来电话啦...)

所有生命周期组件会收到 onResume()事件

当有异常时,会进入暂停阶段,处罚 onPause()方法

当异常结束重新进入Resume阶段时,又会重新调用 onResume()

你应该在这段代码中写一些初始化组件的代码

建议: 如果在 onStart()中初始化一些组件后,记得在 onStop()释放

当acitivty不再前端的时候(即使在多窗口模式中,它是visible模式), app进入这个阶段

使用 onPause()方法来停止或者调整操作,当 activity不再主界面的时候

acitivity进入这个阶段的原因如下:

一些中断了app运行

多窗口模式下,一个app启动会自动让另外的app进入onpause状态

有些情况下,即使activity是visible模式,它也会进入这个onPause阶段

所有生命周期组件会收到 onPause()事件,这里我们可以停止一些操作

这个阶段的任务:

可以停止一些你不想运行的操作(关闭camera..)

释放一些系统资源,处理sensors或者其他会影响电源的组件(但是推荐使用onStop()方法)

千万不要在这里保存数据,网络操作,或者数据库操作

注意: 完成这个阶段并不意味着activity离开了onPause阶段,如果acitivty进入Resume阶段,调用 onResume,如果actiivty完全不可见,进入 onStop()阶段,否则一直在 onPause阶段

public class JavaCameraComponent implements LifecycleObserver {

// 一旦收到`onPause`事件。释放camera

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)

public void releaseCamera() {

if (camera != null) {

camera.release();

camera = null;

什么时候发生:activity完全不可见

所有生命周期组件会收到 onStop()事件,这里我们可以停止一些操作

在这个阶段的任务

释放一些heavy的任务

关闭一些CPU重的任务

这是保存到数据库的绝佳位置

protected void onStop() {

// call the superclass method first

super.onStop();

// save the note's current draft, because the activity is stopping

// and we want to be sure the current note progress isn't lost.

ContentValues values = new ContentValues();

values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());

values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());

// do this update in background on an AsyncQueryHandler or equivalent

mAsyncQueryHandler.startUpdate (

mToken,  // int token to correlate calls

null,    // cookie, not used here

mUri,    // The URI for the note to update.

values,  // The map of column names and new values to apply to them.

null,    // No SELECT criteria are used.

null     // No WHERE columns are used.

进入这个阶段的原因:

activity完成(用户取消activity,或者调用了finish()方法)

系统自动删除activity(手机转动,或者多窗口模式下)

所有生命周期组件会收到 onDestroy()事件,这里我们可以所有需要停止的东西

考虑如下两种情况

用户转换屏幕或者切换到多窗口模式时,系统会默认摧毁之前的activity,但是用户希望能够保持原来的activity不变

用户有时候可能一不小心从当前app切换到其他app,系统会默认摧毁之前的activity,当然我们希望用户切换回来的时候还是保持当前的状态

解决方法: 保存UI状态:ViewModel + obSaveInstanceState()

系统用于保存之前状态的过程为 Instancestate--其实是一些保存在 Bundle对象的键值对

系统默认使用 Bundle的 Instancestate来保存每个View的信息(比如EditText中的文本)

当Activity准备停止的时候,系统就会调用 onSaveInstanceState()来保存一些基本的信息,比如edittext中的value..

如果你想要保存更多的内容,需要重写 onSaveInstanceState()方法,添加新的key-value对到 Bundle对象中

如果重写 onSaveInstanceState()方法,一定调用super implmenetaion

static final String STATE_SCORE = "playerScore";

static final String STATE_LEVEL = "playerLevel";

public void onSaveInstanceState(Bundle savedInstanceState) {

// Save the user's current game state

savedInstanceState.putInt(STATE_SCORE, mCurrentScore);

savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

// Always call the superclass so it can save the view hierarchy state

super.onSaveInstanceState(savedInstanceState);

我们可以在 onCreate和 onRestoreInstanceState()中调用 Bundle对象来恢复UI

onCreate:只有当创建一个新的activtiy实例,才会调用这个方法,必须坚持Bundle是否为空,空的话,创建新的实例,不是空的话,恢复之前的UI

onRestoreInstanceState():这个方法在 onStart()方法之后调用,系统只会在Bundle不为空的时候调用,所以你不用检查是否为null

// method 1

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState); // Always call the superclass first

// Check whether we're recreating a previously destroyed instance

if (savedInstanceState != null) {

// Restore value of members from saved state

mCurrentScore = savedInstanceState.getInt(STATE_SCORE);

mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);

// Probably initialize members with default values for a new instance

public void onRestoreInstanceState(Bundle savedInstanceState) {

// Always call the superclass so it can restore the view hierarchy

super.onRestoreInstanceState(savedInstanceState);

// Restore state members from saved instance

mCurrentScore = savedInstanceState.getInt(STATE_SCORE);

mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);

如果不需要返回一个结果,就用这个

Intent intent = new Intent(this, SignInActivity.class);

startActivity(intent);

你也可以通过startActivity启动一些以后的组件来扩展功能(调用Email的app)

Intent intent = new Intent(Intent.ACTION_SEND);

intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);

startActivity(intent);

TheEXTRA_EMAIL extra added to the intent is a string array of email addresses to which the email should be sent. When an email application responds to this intent, it reads the string array provided in the extra and places them in the "to" field of the email composition form. In this situation, the email application's activity starts and when the user is done, your activity resumes.

当你需要从即将结束的Activity中返回一个值的时候用这个,比如你从当前activity的列表中选中一个水果,你想要保存这个选中的水果

当有一个子类Activity的时候,它可以调用 setResult(int)来返回数据给他的父类Activity

父类Activity使用 onActivityResult(int,int,Intent) 来获取信息

public class MyActivity extends Activity {

static final int PICK_CONTACT_REQUEST = 0;

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {

// When the user center presses, let them pick a contact.

startActivityForResult(

new Intent(Intent.ACTION_PICK,

new Uri("content://contacts")),

PICK_CONTACT_REQUEST);

return true;

return false;

protected void onActivityResult(int requestCode, int resultCode,

Intent data) {

if (requestCode == PICK_CONTACT_REQUEST) {

if (resultCode == RESULT_OK) {

// A contact was picked.  Here we will just display it

// to the user.

startActivity(new Intent(Intent.ACTION_VIEW, data));

创建两个activity: mainactivity和otheractivity

public class OtherActivity extends AppCompatActivity {

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_other);

Toolbar toolbar = findViewById(R.id.toolbar);

setSupportActionBar(toolbar);

FloatingActionButton fab = findViewById(R.id.fab);

fab.setOnClickListener(new View.OnClickListener() {

public void onClick(View view) {

Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)

.setAction("Action", null).show();

System.out.println("--OtherActivity: OnCreate--");

protected void onStart() {

super.onStart();

System.out.println("--OtherActivity: OnStart--");

protected void onResume() {

super.onResume();

System.out.println("--OtherActivity: OnResume--");

protected void onPause() {

super.onPause();

System.out.println("--OtherActivity: OnPause--");

protected void onStop() {

super.onStop();

System.out.println("--OtherActivity: OnStop--");

protected void onDestroy() {

super.onDestroy();

System.out.println("--OtherActivity: OnDestroy--");

protected void onRestart() {

super.onRestart();

System.out.println("--MainActivity: OnRestart--");

otherActivity也差不多,然后执行程序