Android基础学习(9)-Intent的使用
Android基础学习(9)-Intent的使用
AlanCooper 发表于4年前
Android基础学习(9)-Intent的使用
  • 发表于 4年前
  • 阅读 63
  • 收藏 2
  • 点赞 0
  • 评论 0

移动开发云端新模式探索实践 >>>   

一. 了解 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;
	}

}


  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 5
博文 67
码字总数 27450
×
AlanCooper
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: