Android Activity的生命周期以及用法建议

Posted WindAndHorse

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Activity的生命周期以及用法建议相关的知识,希望对你有一定的参考价值。

说到android开发,首先要讲就是android的生命周期。因为无论什么类型的app,只要启动也就意味着开始了这个应用的生命周期。

谷歌的大神们已经帮我们把这个生命周期分成了好几个过程,而我们要做的就是了解这些过程以及在这些过程里都是适合做些什么。话不多说,请看大屏幕:


图一

我不知道你懂不懂英语,也不知道你是否能看懂这个张图。为了能匹配你的情况,我分出了以下几种情况:

1.你能看懂图:请看下一段落。

2.你不能看懂图:建议你去学英语,如果你不学会的话感觉以后会有点忧伤,例如看英文文献的时候你也许会说这是什么梗?WTF!妈的,我看不懂。如果你说我不看英文文献了,我看中文文献还不行吗?这不还有CSDN吗?好吧,你果然是个聪明的孩子,然而你还是too young,too simple。单从代码是用英文写的而不是中文,你就应该明白做程序员是离不开英语了。还有就是请看以下解释:

这张图首先说明了一个Activity有六个主要的生命过程,分别是onCreate() , onStart() , onResume() , onPause() ,onStop() , onDestroy().

onCreate():创建基本的UI元素。

onStart():即将成为可见,就是说在后台要走向前台了。

onResume():可见,也就是可以被用户看到也能和用户交互。

onPause():可见,但是失去了焦点,也就是不能和用户交互了,但是保存着所有状态信息和成员变量。

onStop():不可见并转移到了后台,因为被完全覆盖了,如跳转到另一个Activity,但是保存着所有状态信息和成员变量。

onDestroy():销毁,清空所有资源。

更多详细介绍看这里:点击打开链接

说了那么多,我们来实际演示一下,先来段代码:

package com.androidlifecycle;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity 
    private String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate");
    

    @Override
    protected void onRestart() 
        super.onRestart();
        Log.d(TAG, "onRestart");
    

    @Override
    protected void onStart() 
        super.onStart();
        Log.d(TAG, "onStart");
        // The activity is about to become visible.
    

    @Override
    protected void onResume() 
        super.onResume();
        Log.d(TAG, "onResume");
        // The activity has become visible (it is now "resumed").
    

    @Override
    protected void onPause() 
        super.onPause();
        Log.d(TAG, "onPause");
        // Another activity is taking focus (this activity is about to be "paused").
    

    @Override
    protected void onStop() 
        super.onStop();
        Log.d(TAG, "onStop");
        // The activity is no longer visible (it is now "stopped")
    

    @Override
    protected void onDestroy() 
        super.onDestroy();
        Log.d(TAG, "onDestroy");
        // The activity is about to be destroyed.
    


运行结果请看大屏幕:



从图中可以看出一切运行结果正如图一所示那样,如果你是个细心的小伙,你也许会问,我的代码里不是还有个onRestart()回调方法吗?怎么没见出现呢,你是不是耍我?

其实真不是我耍你,如果你能看懂图一的英文你应该就能明白onRestart()这个回调方法是在一个Activity不可见后再恢复可见时调用的。如果你是个初学者,你可能会说:“你在说什么,你写的是梗?什么叫做不可见后又恢复可见,我读书少你不要骗我!!”。好吧,遇到这种情况,我只能弱弱的打个比方了,比如你手里有一张牌,这张牌现在是可见的,然后你又拿了一张牌盖上去了,现在第一张牌不可见了,因为被覆盖了。第二张牌是可见的。接着你把第二张牌拿走了,你又见到了第一张牌。这个时候第一张牌就从不可见状态变回了可见状态。我想我打完这个比方你应该能懂什么叫做可见与不可见了。如果你还是不懂,我只能说:”咳咳,你TM什么智商,你已经不适合学下去了,我已经看不到希望了。“

接下来言归正传,我们来模拟一下这个可见到不可见再到可见的过程,并且来看看这个过程的生命周期。请看代码:

以下是第一个Activity的代码:

package com.androidlifecycle;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity 
    private String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate");
        Button btn = (Button)findViewById(R.id.btn_jump);
        btn.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                startActivity(intent);
            
        );
    

    @Override
    protected void onRestart() 
        super.onRestart();
        Log.d(TAG, "onRestart");
    

    @Override
    protected void onStart() 
        super.onStart();
        Log.d(TAG, "onStart");
        // The activity is about to become visible.
    

    @Override
    protected void onResume() 
        super.onResume();
        Log.d(TAG, "onResume");
        // The activity has become visible (it is now "resumed").
    

    @Override
    protected void onPause() 
        super.onPause();
        Log.d(TAG, "onPause");
        // Another activity is taking focus (this activity is about to be "paused").
    

    @Override
    protected void onStop() 
        super.onStop();
        Log.d(TAG, "onStop");
        // The activity is no longer visible (it is now "stopped")
    

    @Override
    protected void onDestroy() 
        super.onDestroy();
        Log.d(TAG, "onDestroy");
        // The activity is about to be destroyed.
    

这是第二个Activity的代码:

package com.androidlifecycle;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

/**
 * Created by windbreaker on 16/3/13.
 */
public class SecondActivity extends Activity 
    private String TAG = "SecondActivity";

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Log.d(TAG, "onCreate");
    


    @Override
    protected void onStart() 
        super.onStart();
        Log.d(TAG, "onStart");
        // The activity is about to become visible.
    

    @Override
    protected void onResume() 
        super.onResume();
        Log.d(TAG, "onResume");
        // The activity has become visible (it is now "resumed").
    

    @Override
    protected void onPause() 
        super.onPause();
        Log.d(TAG, "onPause");
        // Another activity is taking focus (this activity is about to be "paused").
    

    @Override
    protected void onStop() 
        super.onStop();
        Log.d(TAG, "onStop");
        // The activity is no longer visible (it is now "stopped")
    

    @Override
    protected void onDestroy() 
        super.onDestroy();
        Log.d(TAG, "onDestroy");
        // The activity is about to be destroyed.
    

运行后,点击跳转按钮调转到第二个Activity,然后按手机自带的返回键会到第一个Activity,再按自带的返回按钮结束应用。运行结果请看大屏幕:


从运行结果可以看出当一个Activity从不可见到可见才会调用onRestart()的回调方法。同时对两个Activity的生命周期调用过程有了大概的了解。

那么了解了这些生命周期能实现什么功能,开发文档是这么介绍的(我只介绍其中比较常用的方法):

onCreate():activity第一次被创建时调用。在这里你应该完成所有常见的静态设置工作——创建view、绑定list数据等等。 本方法传入一个包含了该activity前一个状态的Bundle对象(如果之前已捕获了状态的话,详见后面的保存Activity状态)。

onResume():activity开始与用户交互之前调用。

onPause():当系统准备启动另一个正在恢复的activity时调用。这个方法通常用于把未保存的改动提交为永久数据、停止动画播放、以及其它可能消耗CPU的工作等等。 它应该非常迅速地完成工作,因为下一个activity在本方法返回前是不会被恢复运行的。

如果你看得云里雾里,那么让我们看个例子来增加理解:

以下是java代码:

package com.androidlifecycle;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity 
    private String TAG = "MainActivity";
    private Button btn;
    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate");
        btn = (Button) findViewById(R.id.btn_jump);
        tv = (TextView)findViewById(R.id.tv_content);
        btn.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent);
            
        );
    


    @Override
    protected void onResume() 
        super.onResume();
        Log.d(TAG, "onResume");
        tv.setText(Variable.content);
        // The activity has become visible (it is now "resumed").
    



package com.androidlifecycle;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;

/**
 * Created by windbreaker on 16/3/13.
 */
public class SecondActivity extends Activity 
    private String TAG = "SecondActivity";
    private EditText et;

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Log.d(TAG, "onCreate");
        et = (EditText) findViewById(R.id.et);
    


    @Override
    protected void onPause() 
        super.onPause();
        Log.d(TAG, "onPause");
        Variable.content = et.getText().toString();
        // Another activity is taking focus (this activity is about to be "paused").
    



package com.androidlifecycle;

/**
 * Created by windbreaker on 16/3/13.
 */
public class Variable 
    public static String content = "HelloWorld";


以下是布局文件:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.androidlifecycle.MainActivity">

    <TextView
        android:id="@+id/tv_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:layout_marginTop="40dp"
        android:id="@+id/btn_jump"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="跳转" />
</RelativeLayout>

activity_second.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
<EditText
    android:id="@+id/et"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />
</LinearLayout>

运行结果请看大屏幕:




这就是利用生命周期做的数据刷新功能了,相信你们看完之后应该对生命周期有了理论和认识上的理解了吧。

对了,可能有的哥们会说,菜逼你这个功能其实可以用startActivityForResult()配合onActivityResult()来实现。我肯定会说:“大哥!我讲解的是生命周期啊!!!你还让不让我活了???我容易吗?????”



以上是关于Android Activity的生命周期以及用法建议的主要内容,如果未能解决你的问题,请参考以下文章

android Activity 的生命周期 以及横屏竖屏切换时 Activity 的状态变化

android 没有main函数,怎么找到程序执行入口呢?以及activity主要生命周期的方法说明

Android Activity的生命周期简单总结

深入剖析Android四大组件——Activity生命周期具体解释

跟着Google学Android —— 3.1 管好Activity的生命周期

Activity生命周期以及启动模式对生命周期的影响