zoukankan      html  css  js  c++  java
  • Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期


    上图



    1. Activity状态

    激活状态 : Activity出于前台 , 栈顶位置;

    暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , 后面的Activity出于暂停状态;

    停止状态 : 被其它的Activity覆盖 , 用户不可见 , 但是仍然存在;

    2.Activity操作生命周期的方法

    onCreate() : 初始化一些成员变量 , 如View等 , 此时进入停止状态;

    onStart() : 被用户可见之前调用 , 调用之后进入暂停状态 , 如果不满足条件我们不想让用户进入应用 , 可以在这里进行限制 , finish掉该Activity;

    onResume() : 在与用户交互之前调用 , 调用之后进入激活状态;

    onPause() : 激活另一个Activity时调用 , 调用之后进入暂停状态 , 界面可见 , 失去焦点; 该操作用来保存当前Activity数据;

    onStop() : Activity被覆盖前调用 , 调用之后该Activity不可见; 该方法用来关闭旧的Activity , 注意是完全不可见的时候才会调用这个方法;

    onDestroy() : Activity被销毁前调用 ;


    注意 : 在暂停状态 和 停止状态 , 如果内存紧张 , 该Activity会被系统回收;


    3.Activity运作流程

    (1)第一次启动Activity A  

    首先调用onCreate()方法创建Activity进入停止状态 -> 调用onStart()方法进入暂停状态 -> 调用onResume()方法进入激活状态; 

    (2)从Activity A 跳转到 Activity B 

    A先执行onPause()方法进入暂停状态 -> B执行onCreate()方法进入停止状态 -> B执行onStart()方法进入暂停状态 -> B执行onResume()方法进入激活状态 -> A被完全覆盖执行onStop()方法进入停止状态;

    (3)从ActivityB 回到 Activity A

    B执行onPause()方法进入暂停状态 -> A调用onRestart()方法进入停止状态 -> A调用onStart()方法进入暂停状态 -> A调用onResume()方法进入激活状态 -> B被覆盖调用onStop()方法进入停止状态 -> B执行onDestroy()方法销毁

    这里注意Activity的栈是不可逆的 , 只能后退 , 不能前进 , 回退后 , 原来的栈顶的Activity就马上销毁了.



    二. Activity之间的通信


    1. Intent传递参数的方式

    intent传递参数有两种方式 : 

    注意 : 在onCreate()方法中创建Intent的时候 , 上下文参数不能使用this , 要使用getApplicationContext();

    (1)通过Bundle对象传递参数

    Bundle对象是一个HashMap<String, Object>, 我们将数据存到这个Bundle对象中 , 然后将Bundle对象放入到Intent中去.

    eg:

    				Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
    				Bundle bundle = new Bundle();
    				bundle.putString("name", "MainActivity");
    				intent.putExtra("bundle", bundle);
    				startActivity(intent);
    注意 : 

    向bundle中存放数据的时候 , 对于不用的数据类型要调用不同的方法 , String类型就要调用putString()方法 ...

    向Intent对象中存放bundle对象的时候 , 直接调用Intent的putExtra()方法即可;

    从Intent对象取出数据 : 

    取出Bundle对象 : Bundle bundle = intent.getBundleExtra("bundle")方法.

    从Bundle中取出数据 : 

    String string = bundle.getString("string")获取字符串数据.

    Boolean boolean = bundle.getBoolean("boolean")获取布尔变量.

    (2)直接将数据放入Intent对象

    存放时直接调用Intent的putExtra()方法 , 无论什么类型都是这个方法 , 但是取出的时候要调用相应类型的方法 , 如果是boolean类型就调用getBooleanExtra()方法 , 如果是字符串类型就调用getStringExtra()方法 .

    				Intent intent = new Intent(getApplicationContext(), MainActivity.class);
    				intent.putExtra("name", et_second.getText().toString());
    				startActivity(intent);

    (3)在跳转的Activity获取数据

    在Activity中想要取出跳转之前放入的数据 , 调用Activity的getIntent()方法 , 获取Intent对象 , 在调用Intent对象的方法获取数据;

    ①获取Bundle对象 , 并从Bundle对象中获取数据 : 

    		Bundle bundle = this.getIntent().getBundleExtra("bundle");
    		String name = bundle.getString("name");
    		tv_second.setText(name);

    注意 : 获取Bundle对象的方法 : getBundleExtra("key");从Bundle中获取数据的方法 : bundle.getString("key")调用相应数据类型的方法;

    ②获取Intent对象中的数据 : 

    String name = this.getIntent().getStringExtra("name");
            tv_main.setText(name);

    2. startActivityForResult()方法解析

    在创建了Intent之后 , 一般情况下是使用startActivity()启动另一个Activity , 如果我们需要启动另外一个Activity , 并且需要将这个Activity中的数据返回的时候 , 就需要调用startActivityForResult()方法启动Activity;

    在Activity A 中启动另外一个Activity , 需要重写 A 中的 onActivityResult()方法 , 这个方法是用来处理返回的数据的.

    在Activity B 中需要调用setResult()方法 , 设置返回的Intent , 同时注意要finish()掉这个Activity;

    相关参数 : 

    startActivityForResult(Intent intent, int requestCode) : 第二个参数是请求码 , 请求码在 A 中的onActivityResult()方法中识别intent用的;

    onActivityResult(int requestCode, int resultCode, Intent intent) : 第一个参数是请求码 , 第二个参数是结果码 , 这里我们只需要识别一种就可以 , 也可以两个都进行识别;

    setResult(int resultCode, Intent intent) : 第一个参数是结果码 , 用于 A 中的onActivityResult()中的Intent对象识别.

    注意 : startActivityForResult()方法与setResult()方法的参数顺义不一致;

  • 相关阅读:
    HUST 1372 marshmallow
    HUST 1371 Emergency relief
    CodeForces 629D Babaei and Birthday Cake
    CodeForces 629C Famil Door and Brackets
    ZOJ 3872 Beauty of Array
    ZOJ 3870 Team Formation
    HDU 5631 Rikka with Graph
    HDU 5630 Rikka with Chess
    CodeForces 626D Jerry's Protest
    【POJ 1964】 City Game
  • 原文地址:https://www.cnblogs.com/hanshuliang/p/4215472.html
Copyright © 2011-2022 走看看