Android之活动Activity用法
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用法的更多相关文章
- "浅谈Android"第二篇:活动(Activity)
距离上一篇文章,过去有半个多月了,在此期间忙于工作,疏于整理和总结,特此写下这篇博文,来谈谈自己对Activity的理解.总所周知,Activity组件在Android中的重要性不言而喻,我们 ...
- 怎么通过activity里面的一个按钮跳转到另一个fragment(android FragmentTransaction.replace的用法介绍)
即:android FragmentTransaction.replace的用法介绍 Fragment的生命周期和它的宿主Activity密切相关,几乎和宿主Activity的生命周期一致,他们之间最 ...
- Android活动(Activity)创建及生命周期
Activity是Android的门面,可以与用户进行互动的重要模块,凡是在应用中可以看到的东西,都是放在活动中的. 在学习新的技术时,我喜欢将需要学习的技术与自己懂得技术进行类似比较,而活 ...
- Android开发之Activity
活动(Activity) 活动是最容易吸引用户的地方,它是一种可以包含用户界面的组件,主要用于和用户交互. FirstActivity 手动创建活动 新建一个project,不再选择empty act ...
- Android组件系列----Activity组件详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- Android开发之Activity的创建跳转及传值
在Android系统的江湖中有四大组件:活动(Activity), 服务(Service), 广播接收器(Broadcast Reciver)和内容提供者(Content Provider).今天所介 ...
- android的logcat详细用法
Android日志系统提供了记录和查看系统调试信息的功能.日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过 logcat 命 令来查看和使用. 使用logcat命令 你可以用 logc ...
- Android笔记——活动的生命周期
一.活动的重要性 掌握活动的生命周期对任何 Android 开发者来说都非常重要,当你深入理解活动的生命周期之后,就可以写出更加连贯流畅的程序,并在如何合理管理应用资源方面,你会发挥的游刃有余.你的应 ...
- Android开发中Bundle用法包裹数据(转)
Android开发中Bundle用法包裹数据 Bundle的经典用法,包裹数据放入Intent中,目的在于传输数据. SDK 里是这样描述: A mapping from String values ...
随机推荐
- BZOJ 4556(后缀数组+主席树求前驱后继+二分||后缀数组+二分+可持久化线段树)
换markdown写了.. 题意: 给你一个1e5的字符串,1e5组询问,求\([l_1,r_1]\)的所有子串与\([l_2,r_2]\)的lcp 思路: 首先可以发现答案是具有单调性的,我们考虑二 ...
- cookie 笔记
Cookie “小甜点” Cookie的作用是与服务器进行交互,作为HTTP规范的一部分而存在 ,而Web Storage仅仅是为了在本地“存储”数据而生 用来记录:用户信息 计算机信息 浏 ...
- Java类的加载过程与ClassLoader的理解及测试
当程序准备运行某个类,但该类还未被加载到内存中时,会经过以下三个步骤进行类的加载: 类的加载(Load)→类的连接(Link)→类的初始化(Initialize) 加载:类经过javac.exe编译的 ...
- pycharm创建Django项目时报 AttributeError:'module' object has no attrbute 'main' 错误或者创建了就只有venv一个目录
这是因为创建项目时候没有选择合适的项目环境. 所以在创建项目的时候选择一下项目的环境,比如选择python的运行环境 这时候创建的项目就不再报 AttributeError:'module' obje ...
- css position absolute相对于父元素的设置方式
手机赚钱怎么赚,给大家推荐一个手机赚钱APP汇总平台:手指乐(http://www.szhile.com/),辛苦搬砖之余用闲余时间动动手指,就可以日赚数百元 大家知道css的position abs ...
- Laravel + Serverless Framework 快速创建 CMS 内容管理系统
今天,为大家带来一篇 Laravel + Serverless Framework 的综合实战,里面信息量有点多,大家仔细看哦- 首先,我来介绍下主要的本地环境吧: Git:不多说,只要会敲代码就应该 ...
- Jenkins 插件使用国内镜像源-解决插件下载慢的问题
问题 我们在Jenkins里面经常会遇到安装插件很慢,这是由于我们使用的是更新中心镜像默认为国外的源.现在我们可以进行设置为国内镜像源,来解决安装插件慢的问题. 解决办法 安装插件localizati ...
- C++ substr 截取子串
1. substr() 方法使用 string substr (size_t pos = 0, size_t len = npos) const;pos: 截取初始位置(从头开始截取pos=0)len ...
- linux之ls目录处理命令
目录处理命令:ls 解释 命令名称:ls 命令英文原意:list 命令所在路径:/bin/ls 执行权限:所有用户 功能描述:显示目录文件 语法 ls 选项[-ald] [文件或目录] -a 显示所有 ...
- python range函数(42)
在python中使用最多的除了print函数 就是 for循环 了,那么这里就不得不介绍一下python内置函数range函数! 一.range函数简介 python range函数可创建一个整数列表 ...