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