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 ...
随机推荐
- Ubuntu下安装spark
方法一: jps 查看Java 包 sudo apt-get install openjdk** sudo apt-get install scala 选择安装源然后 sudo wget 下载链接 s ...
- CCF_201604-2_俄罗斯方块
用一个4*2的数组记录方块的位置,每一次移动前判断每个方块位置下面是否已有方块,直到不能移动,将该数组更新到原来的图上,输出即可. #include<cstdio> #include< ...
- ARTS Week 15
Feb 3, 2020 ~ Feb 9, 2020 Algorithm Problem 172.Factorial Trailing Zeroes(阶乘末尾的0) 题目链接 题目描述:给定一个整数n, ...
- Codeforces Round #600 (Div. 2) E. Antenna Coverage
Codeforces Round #600 (Div. 2) E. Antenna Coverage(dp) 题目链接 题意: m个Antenna,每个Antenna的位置是\(x_i\),分数是\( ...
- 基于 HTML5 Canvas 的病毒模拟视觉试验台
前言 2020 年 1 月 12 日,世界卫生组织以武汉病毒肺炎病例命名了一种病毒,2019新型冠状病毒 ( 2019-nCoV ) .随着春运的到来,该病毒迅速的蔓延开来,大家都唯恐避之不及.病毒的 ...
- Element ui select 同时获取value和label的值
html <el-form-item label="单位名称" prop="checkInUnitName"> <el-select v-mo ...
- USBWebServer - 在U盘里搭一个Web服务器!
文章选自我的博客:https://blog.ljyngup.com/archives/321.html/ 本文将介绍一款可以在U盘内直接搭建Web服务器的软件 软件可以免安装直接在U盘内运行,适合外出 ...
- 入侵检测基本准则(Basic principles of intrusion detection)【v1.0】
所谓“入侵检测”,顾名思义,就是对入侵行为的发觉.他通过对计算机网络或计算机系统中若干关键点收集信息并对其进行分析,从中发现网络或系统中是否有违反安全策略的行为和被攻击的迹象.” 但实际上,所谓的“违 ...
- rm -f 后如何恢复
前言 每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小心执行了误删,然后就要准备跑路了,毕竟人不是机器,更何况机器也有bug,呵呵. 那么如果真的删除了不该删除的文件,比如数据库. ...
- 杭电-------2032杨辉三角(C语言写)
#include<stdio.h> ][] = { }; void init() { int i, j; ; i < ; i++) { a[i][] = ; a[i][i] = ; ...