文档章节

Android基础学习(9)-Intent的使用

AlanCooper
 AlanCooper
发布于 2014/09/26 15:11
字数 1692
阅读 63
收藏 2

一. 了解 AndroidManifest.xml

‍‍<intent-filter>标签的功能是根据设置的条件筛选 Intent 要执行的 Activity。主要是以action、category、data为筛选的条件。‍‍

(1)action:

(2)category:

(3)data: 

二. 了解 Intent

Intent由一个动作和内容(相当于一串网址组成,可以打开指定的网页并传递数据,Intent就是执行各个页面之间的切换,功能类似网页上的超链接。


三. 执行自定义的 Activity

MainActivity.java

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
	private Button surfNetButton, dialButton, callButton, switchButton;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// 获取资源文件夹中的界面组件
		surfNetButton = (Button) findViewById(R.id.surfNetButton);
		dialButton = (Button) findViewById(R.id.dialButton);
		callButton = (Button) findViewById(R.id.callButton);
		switchButton = (Button) findViewById(R.id.switchButton);

		// 为按钮组件设置Click监听事件
		// surfNetButton.setOnClickListener(new Button.OnClickListener() {
		//
		// @Override
		// public void onClick(View v) {
		// Uri uri = Uri.parse("http://www.yahoo.com");
		// Intent intent = new Intent(Intent.ACTION_VIEW, uri);
		// startActivity(intent);
		// }
		// });
		//
		// dialButton.setOnClickListener(new Button.OnClickListener() {
		//
		// @Override
		// public void onClick(View v) {
		// Uri uri = Uri.parse("tel:1234567");
		// Intent intent = new Intent(Intent.ACTION_DIAL, uri);
		// startActivity(intent);
		// }
		// });
		//
		// callButton.setOnClickListener(new Button.OnClickListener() {
		//
		// @Override
		// public void onClick(View v) {
		// Uri uri = Uri.parse("tel:1234567");
		// Intent intent = new Intent(Intent.ACTION_CALL, uri);
		// startActivity(intent);
		// }
		// });

		// 为按钮组件设置共享Click监听事件
		surfNetButton.setOnClickListener(myListener);
		dialButton.setOnClickListener(myListener);
		callButton.setOnClickListener(myListener);
		switchButton.setOnClickListener(myListener);
	}

	private Button.OnClickListener myListener = new Button.OnClickListener() {

		@Override
		public void onClick(View v) {
			switch (v.getId()) {
			case R.id.surfNetButton: {
				Uri uri = Uri.parse("http://www.yahoo.com");
				Intent intent = new Intent(Intent.ACTION_VIEW, uri);
				startActivity(intent);
				break;
			}
			case R.id.dialButton: {
				Uri uri = Uri.parse("tel:1234567");
				Intent intent = new Intent(Intent.ACTION_DIAL, uri);
				startActivity(intent);
				break;
			}
			case R.id.callButton: {
				Uri uri = Uri.parse("tel:1234567");
				Intent intent = new Intent(Intent.ACTION_CALL, uri);
				startActivity(intent);
				break;
			}
			case R.id.switchButton: {
				Intent intent = new Intent();
				intent.setClass(getApplicationContext(), SecondActivity.class);
				startActivity(intent);
				break;
			}
			}
		}
	};

SecondActivity.java

package com.wwtiot.ozee;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class SecondActivity extends Activity {
	private Button returnButton;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);
		returnButton = (Button) findViewById(R.id.returnButton);
		returnButton.setOnClickListener(new Button.OnClickListener() {

			@Override
			public void onClick(View v) {
				// Intent intent = new Intent();
				// intent.setClass(getApplicationContext(), MainActivity.class);
				// startActivity(intent);
				// 此处我们只有两个Activity,应该清楚Activity的状态以及存放条件
				finish();
			}
		});
	}


四. 附带数据的 Intent

1、Intent 传递数据的流程

(1)使用setClass()方法指定执行类:

即确定 Intent 中的发件人和收件人。例如:

Intent intent = new Intent();
//此处发件者可以使用getApplicationContext()
intent.setClass(MainActivity.this, SecondActivity.class);

(2)根据数据的类型通过Bundle对象进行打包:

这个 Bundle 有点儿像是邮寄的包裹,包裹里包含许多的邮包,可以使用 Bundle 的putXXX()方法,将邮包根据不同的数据类型打包并写上邮包名称。例如:

//通过Bundle对象进行打包
Bundle bundle = new Bundle();
bundle.putString("NAME", "栾妮");
bundle.putInt("AGE", 22);
bundle.putFloat("SALARY", 12000);

(3)利用Intent的putExtras()方法加入Bundle对象:

Intent 像是邮差,而“intent.putExtras(bundle)”则是带有包裹的邮差。例如:

//利用Intent的putExtras()方法加入Bundle对象
intent.putExtras(bundle);

(4)最后使用startActivity()方法执行Intent:

最后使用startActivity()方法将包裹寄出。例如:

//最后使用startActivity()方法将包裹寄出
startActivity(intent);

2、取出 Intent 数据的流程

(1)使用 getIntent()方法获取传递的 Intent:

// 使用getIntent()方法获取传递的Intent
Intent intent = this.getIntent();

(2)使用 Intent 的 getExtras()方法,从 Intent 中获取 Bundle 对象:

Bundle bundle = intent.getExtras();

(3)根据邮包名称获取 Bundle 对象中的数据:

String name = bundle.getString("NAME");
int age = bundle.getInt("AGE");
float salary = bundle.getFloat("SALARY");


五. 从被调用的 Intent 传回数据

1、主程序传递数据

(1)使用setClass()方法指定执行类:

(2)根据数据的类型通过Bundle对象进行打包:

(3)利用Intent的putExtras()方法加入Bundle对象:

(4)最后使用startActivityForResult()方法执行Intent:

与 startActivity()方法 不同的是,startActivityForResult()方法中要设置ACTIVITY_EDIT识别代码,这个代码用来表示发件人是谁,命名可以自己定义。这样,当收件人回寄数据时就知道发件人是谁了。例如:

private static final int ACTIVITY_EDIT = 1;
... ...
//使用startActivityForResult()方法将包裹寄出
startActivityForResult(intent,ACTIVITY_EDIT);

2、被调用的程序取出 Intent 的数据

(1)使用 getIntent()方法获取传递的 Intent:

(2)使用 Intent 的 getExtras()方法,从 Intent 中获取 Bundle 对象:

(3)根据邮包名称获取 Bundle 对象中的数据:

3、被调用程序传回 Intent 的数据

(1)创建 Intent 对象:

这里不需要以setClass()设置邮件的收发者,因为当初在主程序中是使用“startActivityForResult(intent, ACTIVITY_EDIT)”方式,也就是说已经清楚写明发件人是“ACTIVITY_EDIT

(2)将要回传的数据放入 Bundle 中,再把这个 Bundle 交给 Intent 处理。例如:

age = Integer.parseInt(editAge.getText().toString());
Bundle bundle = new Bundle();
bundle.putInt("Age", age);
intent.putExtras(bundle);

(3)最后使用setResult()方法将Intent传回,同时必须传回一个结果的代码。例如:

setResult(RESULT_OK,intent);

4、主程序接收传回的数据

主程序要接收被调用程序传回的数据,必须重载onActiveResult()方法。

protected void onActivityResult(int requestCode, int resultCode, Intent data);

说明:

【1】requestCode是调用主程序传递Intent时所记录的代码,相当于原来的寄件者的ID,这样被调用程序传回的数据

才知道要回送给谁。

【2】resultCode是被调用程序以setResult()方法传回结果的代码。例如,“RESULT_OK、RESULT_CANCELED”,根据这个代码就可以判断被调用程序返回时点击的按钮。

【3】data是回传的Intent,它就是在Bundle中被调用程序传回的数据。例如,在主程序中接收传回的数据,如果是回寄给“ACTIVITY_EDIT”,再判断回寄者是不是点击确定按钮,如果是,才处理接收的数据。

Main.java

package com.wwtiot.ozee2;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class Main extends Activity {
	private Button btnPage2;
	private static final int ACTIVITY_EDIT = 1;
	private TextView textView1;
	private String name = null;
	private int age;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		// 获取资源文件中的界面组件
		textView1 = (TextView) findViewById(R.id.textView1);
		btnPage2 = (Button) findViewById(R.id.btnPage2);

		// 设置button1的myListener
		btnPage2.setOnClickListener(myListener);

		name = "小雨晨";
		age = 4;
		String s = "姓名:" + name + "\n" + "年龄:" + age;
		textView1.setText(s);
	}

	private Button.OnClickListener myListener = new Button.OnClickListener() {

		@Override
		public void onClick(View v) {
			Intent intent = new Intent();
			intent.setClass(Main.this, Second.class);
			Bundle bundle = new Bundle();
			bundle.putString("Name", name);
			bundle.putInt("Age", age);
			intent.putExtras(bundle);
			startActivityForResult(intent, ACTIVITY_EDIT);
		}
	};

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {

		super.onActivityResult(requestCode, resultCode, data);
		if (requestCode == ACTIVITY_EDIT) {// 回传ACTIVITY_EDIT
			if (resultCode == RESULT_OK) {
				// 获取bundle
				Bundle bundle = data.getExtras();
				// name= bundle.getString("Name");
				age = bundle.getInt("Age");
				String s = "姓名:" + name + "\n" + "年龄:" + age;
				textView1.setText(s);
			}
			if (resultCode == RESULT_CANCELED) {

			}
		}

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

Second.java

package com.wwtiot.ozee2;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Second extends Activity {
	private TextView textName;
	private EditText editAge;
	private int age ;
	private Button btnSure,btnCancel;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.second);
		
		//获取界面组件
		textName=(TextView)findViewById(R.id.textName);
		editAge=(EditText)findViewById(R.id.editAge);
		btnSure = (Button)findViewById(R.id.btnSure);
		btnCancel = (Button)findViewById(R.id.btnCancel);
		
		//设置button的共享myListener
		btnSure.setOnClickListener(myListener);
		btnCancel.setOnClickListener(myListener);

		//获取bundle
		Intent intent = this.getIntent();
		Bundle bundle = intent.getExtras();
		String name = bundle.getString("Name");
		age = bundle.getInt("Age");
		
		textName.setText("Name: "+name);
		editAge.setText(""+age);
	}
	
	private Button.OnClickListener myListener = new Button.OnClickListener(){

		@Override
		public void onClick(View v) {
			if(v.getId()==R.id.btnSure){
			Intent intent = new Intent();
			age = Integer.parseInt(editAge.getText().toString());
			Bundle bundle = new Bundle();
			bundle.putInt("Age", age);
			intent.putExtras(bundle);
			setResult(RESULT_OK,intent);
			finish();
			}
			if(v.getId()==R.id.btnCancel){
				setResult(RESULT_CANCELED);
				finish();
			}
		}
		
	};

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.second, menu);
		return true;
	}

}


© 著作权归作者所有

AlanCooper
粉丝 5
博文 69
码字总数 27450
作品 0
朝阳
程序员
私信 提问
android基础知识05:四大组件之activity 03

本系列开始介绍activity的四大组件,主要是整理网络上关于这一部分的相关资料。包含如下三篇文章: android基础知识05:四大组件之activity 01:基础知识 android基础知识05:四大组件之act...

迷途d书童
2012/03/23
178
0
Android零基础入门第81节:Activity数据传递

在Android开发中,经常要在Activity之间传递数据。前面也学习了Activity和Intent相关基础,接下来一起来学习Activity的数据传递。 一、简介 通过前面的学习知道,Intent可以用来开启Activit...

鑫鱻
2017/10/23
33
0
Android特色开发之Google Map和桌面组件

本文节选于机械工业出版社推出的《Android应用开发揭秘》一书,作者为杨丰盛。本书内容全面,详细讲解了Android框架、Android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发...

鉴客
2011/12/01
2K
0
android基础知识05:四大组件之activity 01

本系列开始介绍activity的四大组件,主要是整理网络上关于这一部分的相关资料。包含如下三篇文章: android基础知识05:四大组件之activity 01:基础知识 android基础知识05:四大组件之act...

迷途d书童
2012/03/23
283
0
Android特色开发之语音识别

本文节选于机械工业出版社推出的《Android应用开发揭秘》一书,作者为杨丰盛。本书内容全面,详细讲解了Android框架、Android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发...

yarin
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JS基础-该如何理解原型、原型链?

JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个...

OBKoro1
今天
7
0
高防CDN的出现是为了解决网站的哪些问题?

高防CDN是为了更好的服务网络而出现的,是通过高防DNS来实现的。高防CDN是通过智能化的系统判断来路,再反馈给用户,可以减轻用户使用过程的复杂程度。通过智能DNS解析,能让网站访问者连接到...

云漫网络Ruan
今天
14
0
OSChina 周一乱弹 —— 熟悉的味道,难道这就是恋爱的感觉

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @xiaoshiyue :好久没分享歌了分享张碧晨的单曲《今后我与自己流浪》 《今后我与自己流浪》- 张碧晨 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
今天
3K
24
SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
46
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部