首页 > 移动平台 > 详细

Android四大组件之Activity详解

时间:2015-11-28 18:21:05      阅读:313      评论:0      收藏:0      [点我收藏+]

.Activity的本质

Activity是Android提供的四大组件之一,是进行Android开发必不可少的组件.Activity是一个界面的载体,可以把它与html页面进行类比,html页面由各种各样的标签组成,而Activity则可以由各种控件组成.然而Activity也并不是那么简单.查看Activity类的源码我们就可以看到,这个类大概有六千多行代码,说明Android对Activity的处理是相当复杂的.不过我们平时进行开发的时候不需要了解到那么深入的地步,因为我们可以根据Activity中提供的方法快速的开发,Activity生命周期中涉及到七个回调方法.

.Activity的生命周期

Android官方文档给出的Activity生命周期图

 技术分享

当打开一个Activity的时候,会调用这个Activity的onCreate()方法,接着调用onStart()方法,然后调用onResume()方法.当onStart()方法执行之后,我们就可以看到这个Activity界面了.下面通过代码对单个Activity生命周期做进一步的解释.

MainActivity.java

技术分享
package com.example.caobotao.activitylifecircle;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("info","MainActivity onCreate()");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i("info","MainActivity onStart()");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("info","MainActivity onResume()");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("info", "MainActivity onPause()");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("info", "MainActivity onStop()");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("info","MainActivity onDestroy()");
    }


    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("info","MainActivity onRestart()");
    }

}
View Code

 

 运行项目后,Logcat输出:

11-24 20:00:49.160 20104-20104/com.example.caobotao.activitylifecircle I/info: MainActivity onCreate()
11-24 20:00:49.170 20104-20104/com.example.caobotao.activitylifecircle I/info: MainActivity onStart()
11-24 20:00:49.170 20104-20104/com.example.caobotao.activitylifecircle I/info: MainActivity onResume()

 

点击返回键,Logcat输出:

11-24 20:05:15.370 20104-20104/com.example.caobotao.activitylifecircle I/info: MainActivity onStop()
11-24 20:05:15.370 20104-20104/com.example.caobotao.activitylifecircle I/info: MainActivity onDestroy()

 

下面简单讲一下Activity生命周期中每个函数的作用:

onCreate() : 

当Activity第一次被创建的时候调用此方法.一般在此方法中进行控件的声明,添加事件等初始化工作.

onStart():

当Activity被显示到屏幕上的时候调用此方法.

onResume():

当此Activity能够被操作之前,也就是能够获得用户的焦点之前调用此方法.

onRestart():

当Activity被停止后又被再次启动之前调用此方法.接着将调用onStart()方法.

onPause():

当第一个Activity通过Intent启动第二个Activity的时候,将调用第一个Activity的onPause()方法.然后调用第二个Activity的onCreate(),onStart(),onResume()方法,接着调用第一个Activity的onStop()方法.如果Activity重新获得焦点,则将调用onResume()方法;如果此Activity进入用户不可见状态,那么将调用onStop()方法.

onStop():

当第一个Activity被第二个Activity完全覆盖,或者被销毁的时候回调用此方法.如果此Activity还会与用户进行交互,将调用onRestart方法();如果此Activity将被销毁,那么将调用onDestroy()方法.

onDestroy():

Activity被销毁之前调用此方法.或者是调用finish()方法结束Activity的时候调用此方法.可以在此方法中进行收尾工作,比如释放资源等.

(注意:重写某个Activity的这些回调方法的时候需要首先在第一行调用基类Activity的相应的回调方法.比如super.onCreate(),super.onStart()等等.)

 

接下来了解一下多个Activity交互中的生命周期.在第一个Activity中添加一个按钮,用于启动第二个Activity.

AActivity.java

技术分享
package com.example.caobotao.activitylifecircle;

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

public class AActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("info","AActivity onCreate()");
        findViewById(R.id.btnStartBAty).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(AActivity.this,BActivity.class));
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i("info","AActivity onStart()");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("info","AActivity onResume()");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("info", "AActivity onPause()");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("info", "AActivity onStop()");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("info","AActivity onDestroy()");
    }


    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("info","AActivity onRestart()");
    }

}
View Code

 

BActivity.java

技术分享
package com.example.caobotao.activitylifecircle;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

public class BActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_baty);
        Log.i("info","BActivity oncreate()");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i("info","BActivity onStart()");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("info","BActivity onResume()");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("info","BActivity onStop()");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("info", "BActivity onDestroy()");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("info","BActivity onRestart()");
    }

}
View Code

 

 

运行项目后,Logcat输出:

11-26 21:14:38.960 6208-6208/com.example.caobotao.activitylifecircle I/info: AActivity onCreate()
11-26 21:14:38.970 6208-6208/com.example.caobotao.activitylifecircle I/info: AActivity onStart()
11-26 21:14:38.970 6208-6208/com.example.caobotao.activitylifecircle I/info: AActivity onResume()

 

点击按钮打开BActivity后,Logcat输出:

11-26 21:14:42.050 6208-6208/com.example.caobotao.activitylifecircle I/info: AActivity onPause()
11-26 21:14:42.080 6208-6208/com.example.caobotao.activitylifecircle I/info: BActivity oncreate()
11-26 21:14:42.090 6208-6208/com.example.caobotao.activitylifecircle I/info: BActivity onstart()
11-26 21:14:42.090 6208-6208/com.example.caobotao.activitylifecircle I/info: BActivity onresume()
11-26 21:14:45.750 6208-6208/com.example.caobotao.activitylifecircle I/info: AActivity onstop()

 

然后点击BACK键,Logcat输出:

11-26 21:20:38.650 6208-6208/com.example.caobotao.activitylifecircle I/info: BActivity onPause()  
11-26 21:20:38.970 6208-6208/com.example.caobotao.activitylifecircle I/info: AActivity onRestart()
11-26 21:20:38.970 6208-6208/com.example.caobotao.activitylifecircle I/info: AActivity onStart()
11-26 21:20:38.970 6208-6208/com.example.caobotao.activitylifecircle I/info: AActivity onResume()
11-26 21:20:41.710 6208-6208/com.example.caobotao.activitylifecircle I/info: BActivity onStop()
11-26 21:20:41.710 6208-6208/com.example.caobotao.activitylifecircle I/info: BActivity onDestroy()

可以看出,当启动第二个Activity时,总是先调用第一个Activity的onPause()方法,然后如果第二个Activity是第一次创建的话,则再调用第二个Activity的onCreate()方法,否则调用第二个Activity的onRestart()方法,接着调用onStart(),onResume()方法.

.Activity生命周期交互设计思想

到这里,大家可能会有些疑问,谷歌为什么要这样设计呢?如:

1.当从第一个Activity启动第二个Activity的时候,为什么先调用第一个Activity的onPause()方法,然后再调用第二个Activity的onCreate()等方法呢?

解释:假如有这样一个情况,你正在使用APP听音乐,突然来了一个电话,那么当然需要先暂停音乐,然后进行电话的处理。所以这就是onPause()方法的作用:可以用来保存当前的各种信息.可以在这个APP的onPause()方法中实现暂停音乐的逻辑,然后再处理电话的业务处理.

2.当从第一个Activity启动第二个Activity的时候,为什么第一个Activity的onStop()方法是调用完第二个Activity的系列方法后才调用呢,为什么不在第一个Activity的onPause()方法之后就调用呢? 

解释:这是谷歌对安全方面的一个考虑.假如先调用第一个Activity的onStop()方法,那么此时第一个Activity将不可见,如果接下来调用第二个Activity的一系列创建方法失败了,那么就会导致这两个Activity都没显示在屏幕上,就会出现黑屏等不友好界面.如果是调用完第二个Activity一系列创建方法后,再调用第一个Activity的onStop()方法,就会避免这种情况的发生.

 

.Activity生命周期的应用场景

讲了这么多,大家可能会问,Activity生命周期到底实际中怎么使用.下面通过实例来做简单的运用.在AActivity中进行音乐的播放,当点击按钮打开BActivity后,音乐需要暂停,然后点击BACK键返回到AActivity后音乐继续播放.这就需要在AActivity中的onPause()方法中进行音乐的暂停操作,以及暂停时音乐播放位置的记录.在AActivity中的onResume()方法中实现重新返回前台时继续音乐的播放.

AActivity.java

技术分享
package com.example.caobotao.activitylifecircle;

import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class AActivity extends Activity {
    private MediaPlayer mediaPlayer;
    private int position;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mediaPlayer = MediaPlayer.create(this,R.raw.song);
        mediaPlayer.start();
        Log.i("info","AActivity onCreate()");
        findViewById(R.id.btnStartBAty).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(AActivity.this,BActivity.class));
            }
        });
    }


    @Override
    protected void onStart() {
        super.onStart();
        Log.i("info","AActivity onStart()");
    }

    @Override
    protected void onResume() {
        super.onResume();
        //如果播放的位置不是0
        if (position != 0){
            mediaPlayer.seekTo(position);//获取播放的位置
            mediaPlayer.start();//开始播放
        }
        Log.i("info","AActivity onResume()");
    }

    @Override
    protected void onPause() {
        super.onPause();
        //如果播放器正在播放
        if (mediaPlayer.isPlaying()){
            mediaPlayer.pause();//暂停播放
            position = mediaPlayer.getCurrentPosition();//获得暂停时播放的位置
        }
        Log.i("info", "AActivity onPause()");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("info", "AActivity onStop()");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("info","AActivity onDestroy()");
    }


    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("info","AActivity onRestart()");
    }

}
View Code

 

BActivity.java

技术分享
package com.example.caobotao.activitylifecircle;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

public class BActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_baty);
        Log.i("info","BActivity onCreate()");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i("info","BActivity onStart()");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("info","BActivity onResume()");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("info","BActivity onPause()");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("info","BActivity onStop()");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("info", "BActivity onDestroy()");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("info","BActivity onRestart()");
    }

}
View Code

 

 

 

.启动系统中常见的Activity

系统给我们提供了很多常用的Activity,可以用来打开浏览器,打开发短信界面,打开相册界面,打开拨号界面等等.

打开浏览器网页:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com")); 
startActivity(intent);

 

 

打开相册:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivity(intent);

 

 

打开发送短信界面:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT,"Hello World !");
startActivity(intent);

 

 

打开拨号界面:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("tel:110"));
startActivity(intent);

 

Android四大组件之Activity详解

原文:http://www.cnblogs.com/caobotao/p/4987015.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!