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()方法的参数顺义不一致;

  • 相关阅读:
    POJ 2503 Babelfish
    POJ 2528 Mayor's posters
    203C Photographer
    190A Vasya and the Bus
    POJ 3630 Trie树 TLE
    ThinkPHP验证码的使用
    mysql_fetch_row、mysql_fetch_array、mysql_fetch_assoc、mysql_fetch_object
    ThinkPHP模版布局方式
    Windows 下使用Git管理Github项目
    浅析mysql、mysqli、PDO
  • 原文地址:https://www.cnblogs.com/hanshuliang/p/4215472.html
Copyright © 2011-2022 走看看