Activity生命周期

Activity的生命周期方法:
onCreate()--->onStart()--->onResume()--->onPause()--->onStop()--->onDestory()
        //几种情况下Activity的生命周期:
        //1)新开启一个页面A:onCreate----->onStart----->onResume----->onAttachedToWindow;
        //2)点击Home键回到桌面:onPause----->onSaveInstanceState----->onStop,此时Activity并没有被销毁
        //3)点击桌面图标回到A:onRestart----->onStart----->onResume;
        //4)按返回键退出A:onPause----->onStop----->onDestroy----->onDetachedFromWindow(销毁View之后调用)
        //5)A跳转到B两者的生命周期:onPause-----> onCreate onStart onResume onAttachedToWindow----->onSaveInstanceState----->onStop

单个Activity的三种状态:显示状态,不可见状态,销毁状态。
1,activity创建到显示要调用前三个方法.
2,点击后退键,做了两件事:1)当前activity被销毁,调用后面三个周期方法。2)栈中位于最顶部的Activity显示出来。
3,onDestory()方法主要是当Activity被销毁的时候,释放资源,防止内存泄露。
4,重写生命周期方法很有用,有时候能够实现特殊需求。比如onResume()方法,获取购物车中商品的数量;onPause()保存当前音乐的播放位置。
Activity生命周期_第1张图片

Activity生命周期_第2张图片
5,activity看不见不一定被销毁。不可见状态和销毁状态。

多个Activity交互的生命周期:
1,从一个Activity跳转到另一个Activity经历的生命周期方法:(红色表示第二个activity的生命周期方法)
onCreate()--->onStart()--->onResume()--->onPause()--->onCreate()--->onStart()--->onResume()--->onStop()
2,单击后退键,从第二个Activity到第一个Activity,调用了哪些生命周期方法?(红色表示第一个activity的生命周期方法,不用重新创建,已经在栈中,直接重新启动就好了,第二个Activity则被销毁掉)
onPause()--->onRestart()--->onStart()--->onResume()--->onStop()---> onDestory()
点击后退键对当前的activity是销毁操作
3,为什么Activity的生命周期方法设计成这样?为什么不是一个Activity的生命周期走完,再创建另外一个Activity呢?为什么要先暂停正在显示的Activity呢?
正在听歌的时候,电话来了;如果音乐不停止播放,电话还在响,肯定不合理。在onPause()方法中进行判断,如果当前音乐正处于播放状态,就让音乐暂停播放。onPause()主要用于保存Activity的状态信息
为什么跳转到第二个Activity时,第一个Activity最后调用onStop()方法?
防止第二个activity启动不正常、闪退,导致什么都不显示。(防止在创建第二个Activity的时候,发生意外)

横竖屏切换,Activity的生命周期
1,从竖屏到横屏的切换,activity调用了哪些生命周期方法?
如果不进行处理,就会销毁当前的Activity,然后创建新的Activity。
2,横竖屏切换的时候,如果重写了onSaveInstanceState(Bundle bundle),Activity生命周期方法的调用顺序:
onResume()--->onPause()--->onSaveInstanceState(Bundle bundle)--->onStop()--->onDestory()
在onCreate()方法中取出保存的状态信息。
3,实际上横竖屏切换的时候不应该重新创建activity,而应该保存当前的activity的状态数据。
onSaveInstanceState(Bundle bundle) Activity中的方法
4,一般的应用都不支持横竖屏切换的,因为横屏界面需要重新设计,开发周期比较长。

Activity生命周期应用场景
案例:在当前的Activity中播放音乐。raw文件夹在res文件夹下,资源文件。
关键是MediaPlayer的api使用

Activity的两种启动方式:直接启动和匿名启动(使用Intent-filter启动,intent.setAction(""))
category:属性用于指定当前动作(Action)的执行环境,至少写一个category
action:要指定这两个元素。给定一个动作,动作保持一致。就可以激活activity
清单文件中,activity中action可以配置一个也可以配置多个。

启动系统常见的Activity:
浏览器、相册、短信、电话、setting界面等,找到对应的activity。

Activity数据交换:基本数据类型,引用数据类型都可以使用Bundle进行传递,很简单的
1)Activity传递大数据时,遇到的问题。使用Bundle传递数据,不能超过1M。如果超过,新的activity无法激活,数据传递不过去。
2)为了节省流量,数据都是从前一个页面传递过来的,避免了跟服务器的再次交互,这样对用户来说就是比较省流量的。

Activity的任务栈:
一个应用对应一个任务栈。一个应用中,所有的激活的activity都处于一个任务栈当中
每个activity都对应一个id存储到任务栈中。
任务就是activity的序列集合.
finish方法的调用,把当前的activity从任务栈中关掉。
activity之间允许夸进程的交互。
查看Activity任务栈的命令:
adb shell dumpsys activity  该命令可以看到当前运行的是哪个activity,运行的一些进程等.
Activity生命周期_第3张图片

Activity的启动模式:四种。
任务栈中可能有多个相同的Activity。不指定启动模式,默认情况下,Activity是重新创建的。默认情况下是标准模式。
singleTo模式,如果不在栈中,就重新创建;如果在栈中,就调用onNewIntent() 到栈顶。

代码如下:
package com.crs.demo.ui;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaPlayer;
import android.os.Bundle;

import com.crs.demo.R;
import com.crs.demo.base.BaseActivity;
import com.crs.demo.bean.StudentEntity;

/**
 * Created on 2016/8/23.
 * Author:crs
 * Description:Activity的生命周期方法
 * 音乐的播放与暂停
 */
public class LifeActivity extends BaseActivity {

    private MediaPlayer player;
    //用于记录播放器播放到的位置
    private int position;

    /**
     * 参数表示保存的状态信息
     *
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState != null) {
            //就可以获取到数据。
        }

        Intent intent = getIntent();
        if (intent != null) {
            //获取intent对象后,判断是否为非空
        }

        //播放器对象
        player = MediaPlayer.create(this, R.raw.music);
        //开始播放
        player.start();

        Bundle bundle = new Bundle();
        bundle.putInt("sum", 100);
        //使用Bundle传递引用类型
        bundle.putSerializable("学生对象", new StudentEntity("陈如水", 22));
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
        bundle.putParcelable("图片", bitmap);
        bundle.getParcelable("");

        int taskId = getTaskId();
    }

    @Override
    protected void onStart() {
        super.onStart();
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 当界面显示的时候调用这个方法。
        // 1)后退栈中重新显示,获取购物车中商品的数量。
        // 2)回到当前页面,让音乐继续播放。
        if (position != 0) {
            //让播放器对象跳转到上次播放的位置
            player.seekTo(position);
            //让播放器继续播放
            player.start();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        //如果此时要跳转到另一个页面,音乐应该处于暂停状态
        if (player.isPlaying()) {
            //让播放器处于暂停状态
            player.pause();
            //获取当前播放到的位置
            position = player.getCurrentPosition();
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
    }

    //Activity的收尾工作,用于解决内存泄露的问题。 比如销毁广播、销毁EventBus
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (player != null) {
            //释放播放器所消耗的资源
            player.release();
            player = null;
        }
    }
    
    //横竖屏切换时,调用此方法保存Activity的状态信息。
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        //可以把Bundle看成map集合
    }
}

你可能感兴趣的:(Activity生命周期)