Activity是Android的四大组件之一,本篇将通过Activity的生命周期,Intent的组成部分以及如何使用Intent进行页面之间的消息传递来介绍它的基本用法。

1.activity的生命周期

下面是有关activity生命周期的方法说明:

  · onCreat : 创建页面,把页面上的各个元素加载到内存中

  · onStart : 开始页面,把页面显示在屏幕上

  · onResume : 恢复页面,让页面在屏幕上活动起来,例如开启动画、开始任务等

  · onPause : 暂停页面,让页面在屏幕上的动作停下来

  · onStop : 停止页面,把页面从屏幕上搬下来

  · onDestory : 销毁页面,把页面从内存中清掉

  · onRestart : 重启页面,重新加载内存中的页面数据

下面针对几个常见的业务场景(页面之间的跳转,按HOME与返回APP)探究activity的生命周期

首先是页面的跳转,先看代码:

package com.example.animator.seniortest;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.text.format.DateUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast; import java.util.Date; public class MainActivity extends ActionBarActivity implements View.OnClickListener{
private final static String TAG="MainActivity";
private TextView textView;
private String mStr="";
private void refreshLife(String desc){
Log.d(TAG, desc);
findViewById(R.id.btn).setOnClickListener(MainActivity.this);
Date date=new Date();
mStr=String.format("%s%s %s %s\n",mStr,date.getTime(),TAG,desc);
textView.setText(mStr); } @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); textView= (TextView) findViewById(R.id.tv);
refreshLife("onCreat");
} @Override
protected void onStart() {
refreshLife("onStart");
super.onStart();
} @Override
protected void onStop() {
refreshLife("onStop");
super.onStop();
} @Override
protected void onResume() {
refreshLife("onResume");
super.onResume();
} @Override
protected void onPause() {
refreshLife("onPause");
super.onPause();
} @Override
protected void onRestart() {
refreshLife("onRestart");
super.onRestart();
} @Override
protected void onDestroy() {
refreshLife("onDestory");
super.onDestroy();
} @Override
public void onClick(View view) {
if(view.getId()==R.id.btn){
// //准备跳转页面
// Intent intent=new Intent(this,NewActivity.class);
// //期望接收到下个页面的返回数据
// startActivityForResult(intent,0); Intent intent=new Intent(MainActivity.this,NewActivity.class);
Bundle bundle=new Bundle();//创建新的包裹
bundle.putString("name","小明");
bundle.putInt("age", 20);
bundle.putDouble("height", 170.0f);
intent.putExtras(bundle);//把包裹塞给意图
startActivityForResult(intent,0);
}
} @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
String nextLife=data.getStringExtra("life");
refreshLife("\n"+nextLife);
refreshLife("onActivityResult");
super.onActivityResult(requestCode, resultCode, data);
}
}

效果如下:

总结如下:打开页面,调用顺序为:本页面onCreat——onStart——onResume;跳转页面:上一个页面onPause——下一个页面onCreat——onStart——onResume——上一个页面onStop;回到页面:下一个页面——onPause——上一个页面onRestart——onStart——onResume——下一个页面onStop——onDestory

按HOME键与返回APP场景测试:

可以看到,此时测试页面的生命周期是典型的从活动状态变为暂停状态(回到桌面时)再变为活动状态(回到APP时)

2.使用Intent传递消息

intent的中文名叫意图,意思是我想让你干什么,简单地说就是传递消息。Intent是各个组件之间信息沟通的桥梁,既能在activity之间沟通,又能在activity和service之间沟通,也能在activity和broadcast之间沟通。总而言之,Intent用于处理Android各组件之间的通信,主要完成以下三个工作:

  · Intent需标明本次通信请求从哪里来,到哪里去,要怎么走

  · 发起方携带本次通信需要的数据内容,接收方对收到的Intent数据进行解包

  · 如果发起方要求判断接收方的处理结果,Intent就要负责让接收方传回应答的数据内容

表达Intent的来往路径有两种方式,一种是显式Intent,一种是隐式Intent

(1)显式Intent,直接指定来源类和目标类名,属于精准匹配

  声明方式如下:

  · Intent intent = new Intent(this,anotherActivity.class);

  ` Intent intent = new Intent();

    intent.setClass(this,anotherActivity.class);

  · Intent intent=new Intent();

    ComponentName component=new ComponentName(this,anotherActivity.class);

    intent.setComponent(component);

(2)隐式Intent,没有明确指定要跳转的类名,只给出一个动作让系统匹配拥有相同字串定义的目标,属于模糊匹配

因为我们常常不希望暴露源码的类名,只给出一个事先定义好的名称,即隐式Intent起到了过滤作用。这个动作名称通过setAction方法指定,也可以通过构造函数Intent(String action)直接生成Intent对象。由于动作是模糊匹配,所以我们需要加入更详细的路径,Uri和Category就可以实现路径信息,Uri可以通过构造函数Intent(String action,Uri uri)指定,也可以通过setData方法指定;Category可以通过addCategory方法指定,之所以用add是因为一个intent可以设置多个Category

下面是一个调用系统拨号程序的例子

Intent intent=new Intent();//创建新意图
intent.setAction(Intent.ACTION_CALL);//设置意图动作为直接拨号
Uri uri=Uri.parse("tel:"+phone);//声明一个拨号的Uri
intent.setData(uri);//设置意图前往的路径
startActivity(intent);//启动意图通往的活动页面

隐式Intent还用到了过滤器的概念,即把不符合匹配条件的过滤掉,符合的按照优先顺序调用,AndroidManifest.xml里的intent-filter就是xml中的过滤器,比如

这个activity中的intent-filter就是一个过滤器,该节点下设置了action和category的过滤条件

3.向下一个activity传参

前面我们将的setData方法只是指定了到达目标的路径,而不是信息。要想传递参数信息,则要将其存放到Extras中,又由于单纯调用putExtra方法的难管理,Android引入了Bundle(包裹)概念,它内部用来存放数据的实质是Map映射,可添加、删除、判断元素存在,开发者把Bundle全部打包好只需要调用一次putExtras,取出也只需调用一次getExtras,下面是前一个页面向后一个页面发送请求数据的代码:

Intent intent=new Intent(MainActivity.this,NewActivity.class);
Bundle bundle=new Bundle();//创建新的包裹
bundle.putString("name","小明");
bundle.putInt("age",20);
bundle.putDouble("height",170.0f);
intent.putExtras(bundle);//把包裹塞给意图
startActivity(intent);

下面是后一个页面接收前一个页面请求数据的代码:

Intent intent = new Intent();
Bundle bundle=intent.getExtras();
String name=bundle.getString("name", "");
int age=bundle.getInt("age",0);
double height=bundle.getDouble("height",0.0f);

4.向上一个activity返回参数

很多时候我们在接收到上个页面数据的同时需要处理下一个页面的应答数据(通常发生在下一个页面返回到上一个页面时),此时就要分多步骤处理,详细步骤如下:

  · 前一个页面打包好请求数据,调用方法startActivityForResult(Intent intent,int requestCode),表示需要处理结果数据,第二个参数表示请求编号,用于标识每次请求的唯一性

  · 后一个页面接受请求数据,进行相应处理

  · 后一个页面在返回前一个页面时,打包应答数据并调用setResult方法返回信息,setResult的第一个参数表示应答代码(成功还是失败),代码示例如下:

Intent intent=new Intent();
Bundle bundle=new Bundle();
bundle.putString("job","码农");
intent.putExtras(bundle);
setResult(NewActivity.RESULT_OK, intent);//携带意图返回上一个页面
finish();//关闭当前页面

  · 前一个页面重写方法onActivityResult,该方法输入参数包含请求编号和应答代码,请求编号用于判断对应哪次请求,应答代码用于判断后一个页面是否处理成功。然后对应答数据解包,代码如下:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Bundle bundle=data.getExtras();
String job=bundle.getString("job");
Toast.makeText(this,"您目前的职业是:"+job,Toast.LENGTH_LONG).show();
}

Android之活动Activity用法的更多相关文章

  1. "浅谈Android"第二篇:活动(Activity)

        距离上一篇文章,过去有半个多月了,在此期间忙于工作,疏于整理和总结,特此写下这篇博文,来谈谈自己对Activity的理解.总所周知,Activity组件在Android中的重要性不言而喻,我们 ...

  2. 怎么通过activity里面的一个按钮跳转到另一个fragment(android FragmentTransaction.replace的用法介绍)

    即:android FragmentTransaction.replace的用法介绍 Fragment的生命周期和它的宿主Activity密切相关,几乎和宿主Activity的生命周期一致,他们之间最 ...

  3. Android活动(Activity)创建及生命周期

       Activity是Android的门面,可以与用户进行互动的重要模块,凡是在应用中可以看到的东西,都是放在活动中的.   在学习新的技术时,我喜欢将需要学习的技术与自己懂得技术进行类似比较,而活 ...

  4. Android开发之Activity

    活动(Activity) 活动是最容易吸引用户的地方,它是一种可以包含用户界面的组件,主要用于和用户交互. FirstActivity 手动创建活动 新建一个project,不再选择empty act ...

  5. Android组件系列----Activity组件详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  6. Android开发之Activity的创建跳转及传值

    在Android系统的江湖中有四大组件:活动(Activity), 服务(Service), 广播接收器(Broadcast Reciver)和内容提供者(Content Provider).今天所介 ...

  7. android的logcat详细用法

    Android日志系统提供了记录和查看系统调试信息的功能.日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过 logcat 命 令来查看和使用. 使用logcat命令 你可以用 logc ...

  8. Android笔记——活动的生命周期

    一.活动的重要性 掌握活动的生命周期对任何 Android 开发者来说都非常重要,当你深入理解活动的生命周期之后,就可以写出更加连贯流畅的程序,并在如何合理管理应用资源方面,你会发挥的游刃有余.你的应 ...

  9. Android开发中Bundle用法包裹数据(转)

    Android开发中Bundle用法包裹数据 Bundle的经典用法,包裹数据放入Intent中,目的在于传输数据. SDK 里是这样描述: A mapping from String values ...

随机推荐

  1. ARTS Week 14

    Jan 27, 2020 ~ Feb 2, 2020 Algorithm Problem 160.Intersection of Two Linked Lists(相交链表) 题目链接 题目描述:给定 ...

  2. Windows系统-cmd中的tracert命令

    大部分同学都是用的Linux系统来测试网络命令相关工具,我用Windows10系统来测试tracert.        tracert:也被称为Windows路由跟踪实用程序,在命令提示符(cmd)中 ...

  3. HDU6395 Sequence(矩阵快速幂+数论分块)

    题意: F(1)=A,F(2)=B,F(n)=C*F(n-2)+D*F(n-1)+P/n 给定ABCDPn,求F(n) mod 1e9+7 思路: P/n在一段n里是不变的,可以数论分块,再在每一段里 ...

  4. Jenkins: QQ/Wechat机器人群消息通知Job构建结果

    简介 Jenkins是持续化集成的一个核心部件,它上游从仓库(gitlab)等拉取代码,经编译构建,将应用发布至下游目标环境:构建结果通知的方式有很多,现成的插件有邮件和钉钉方式,但是就方便的角度,通 ...

  5. c语言小游戏-三子棋的完成

    三子棋的实现 一.实现思路 1.初始化数组 三子棋是九宫格的格式,所以用二维数组接收数据.用‘O’代表电脑下的子,‘X’代表玩家下的子.未下子的时候初始化 ’ ‘(space).则二维数组为“char ...

  6. VMware复制Linux虚拟机后网络配置

    1.启动虚拟机,点击我已复制 点击已复制后,VMware将会为重置虚拟机网卡mac地址. 2.修改网卡mac地址 3.ifconfig显示网卡名称与配置不一致处理 Centos6中ifconfig显示 ...

  7. VFP 的 SPT 起跳 -- 陈纯(BOE数据网络工作室)

    细节描述 Visual FoxPro 的 SPT 技术快速入门 说在前面熟悉 Fox 的朋友都知道,在 VFP 里我们可以使用远程视图 (Remote View) 和 SPT(SQL Pass Thr ...

  8. tomcat 安装在 linux

    简单说下什么是tomcat?它与apache web服务器的关系? Apache是web服务器(静态解析,如HTML),tomcat是java应用服务器(动态解析,如JSP.PHP) Tomcat只是 ...

  9. Vscode使用

    一. Vscode使用 1. 点击最下方的错误警告显示条,出现四个选项最后一个为终端命令(dos命令) 2. 提交代码输入提交信息,打勾提交,选择类似刷新按钮进行推送 3. 同步代码点击类似刷新按钮即 ...

  10. ElasticSearch集群-Windows

    概述 ES集群是一个P2类型的分布式系统,除了集群状态管理以外,其他所有的请求都可以发送到集群内任意一台节点上,这个节点可以自己找到需要转发给哪些节点,并且直接跟这些节点通信.所以,从网络架构及服务配 ...