Android(安卓)- Intent
Intent
Intent 是 Android 中的各个组件之间交互的一种重要方式,它可以用来启动 Activity、Service 和 BroadcastReceiver,还可以在不同组件之间传递数据。
Intent Filter
- Intent Filter 就是用来注册 Activity 、 Service 和 Broadcast Receiver 具有能在某种数据上执行一个动作的能力。使用 Intent Filter,应用程序组件告诉 Android,它们能为其它程序的组件的动作请求提供服务,包括同一个程序的组件、本地的或第三方的应用程序。—— Android开发--Intent-filter属性详解
- Intent Filter 负责过滤掉组件本身无法响应和处理的 Intent,只将自己关心的 Intent 接收进来进行处理。—— IntentFilter
Intent 的七大属性
- ComponentName: 指定了 ComponentName 属性的 Intent已经明确了它将要启动哪个组件,这种 Intent 被称为显式 Intent;没有指定 ComponentName 属性的 Intent 被称为隐式 Intent。隐式Intent没有明确要启动哪个组件,应用会根据 Intent 指定的规则去启动符合条件的组件。
- Action: Action 属性用于指定要执行的动作,一个 Intent 只能设置一个 Action。
- Category: Category 属性为 Action 增加额外的附加类别信息。CATEGORY_LAUNCHER 意味着在加载程序的时候 Acticity 出现在最上面,而 CATEGORY_HOME 表示页面跳转到 HOME 界面。一个 Intent 可以添加多个 Category。
- Data: Data 属性通常用于向 Action 属性提供操作的数据。Data 属性的值是个 Uri 对象。
Uri 的格式如下:scheme://host:port/path
- scheme:用于指定数据的协议部分,如 http
- host:用于指定数据的主机名部分,如 www.google.com
- port:用于指定数据的端口部分,跟在主机后面,可以省略
- path:用于指定主机名和端口之后的部分,通常是资源的路径,可以省略 - Type: Type 属性用于指定 Data 所指定的 Uri 对应的 MIME 类型。MIME 只要符合 “abc/xyz” 这样的字符串格式即可。
- Extras: Extras 属性用于保存需要传递的额外数据。
- Flag: Intent 可调用 addFlags() 方法来为 Intent 添加控制标记。
AndroidManifest.xml 中的 标签
- : 一个
可以有一个或多个 用于过滤,到达的 Intent 只需要匹配其中一个 即可。 -
: 一个中可以有多个 ,只有 Intent 中的所有 Category 都能匹配到 中的 时,Intent 才能通过检查。 - : 元素包含的内容为 Uri 和数据类型, 元素中一般不会指定过多的内容。
- Uri 格式见上面。
- mimeType:用于指定可以处理的数据类型,可以省略。 - 更多内容,请看这篇文章 IntentFilter
Intent 的用法 - 启动组件
Intent 启动组件的方法可以分为两种,分别是显式 Intent 和 隐式 Intent。显式 Intent 必须明确指出要启动的是哪个组件;隐式 Intent 只须指出想要启动的组件的特征,系统就会自动启动符合该特征的组件。
启动组件 - 使用显式 Intent
这里我们以从一个 Activity 跳转到 另一个 Activity 为例。
1. XML 布局文件:
- activity_first.xml
<?xml version="1.0" encoding="utf-8"?>
- activity_second.xml
<?xml version="1.0" encoding="utf-8"?>
2. Java 代码:
- FirstActivity.java
public class FirstActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_first); } public void startSecondActivity(View view) { // 第一个参数为当前上下文,第二个参数为要启动的组件 Intent intent = new Intent(FirstActivity.this, SecondActivity.class); startActivity(intent); }}
- SecondActivity.java
public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); }}
- 不要忘了在清单文件 AndroidManifest.xml 中注册第二个 Activity:
<?xml version="1.0" encoding="utf-8"?>
- 效果演示:
点击按钮,启动第二个 Activity
启动组件 - 使用隐式 Intent
下面我们使用隐式 Intent 来实现上面的跳转效果。
1. 首先修改 AndroidManifest.xml 成如下:
<?xml version="1.0" encoding="utf-8"?>
可以看到,我们给 SecondActivity 配置了 intent-filter,并在 intent-filter 下增加了 action 属性和 category 属性。
2. Java 代码,这里只须修改 FirstActivity.java:
public class FirstActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_first); } public void startSecondActivity(View view) { Intent intent = new Intent("net.monkeychan.intenttest.action.START"); startActivity(intent); }}
- 效果演示:
效果与上面使用显式 Intent 方式启动一样,只不过这里是使用隐式 Intent 方式实现罢了。
使用隐式 Intent 启动系统组件
使用隐式隐式 Intent 除了可以启动同一个应用程序的组件,还可以启动系统或第三方应用程序的组件。下面使用隐式 Intent 来启动系统的组件。
1. 启动拨号界面
- XML 布局文件,activity_main.xml:
- Java 代码,MainActivity.java:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void startDial(View view) { // 1. 创建一个 Intent 对象 Intent intent = new Intent(); // 2. 设置 Intent 对象的 Action // ACTION_DIAL 是 Intent 中定义的一个常量,查源码可知: // public static final String ACTION_DIAL = "android.intent.action.DIAL"; // 这是 Android 中已经定义好的,事实上 Intent 中还有许多这样的常量 intent.setAction(Intent.ACTION_DIAL); // 3. 跳转到对应的组件 startActivity(intent); }}
- AndroidManifest.xml 文件,记得声明权限,这里的权限是使用电话:
<?xml version="1.0" encoding="utf-8"?>
上面的代码实现的功能是这样的:当我们点击按钮时,将会跳转到拨号界面。
- 效果演示:
点击按钮,将会跳转到拨号界面:
接下来我们对上面的程序进行修改,当点击按钮时,将会把我们要拨打的号码自动写好,我们只须按下拨号键就可以拨打了。
- XML 布局文件以及 AndroidManifest.xml 文件无须修改, Java 代码部分修改成如下:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void startDial(View view) { // 1. 创建一个 Intent 对象 Intent intent = new Intent(); // 2. 设置 Intent 对象的 Action // ACTION_DIAL 是 Intent 中定义的一个常量,查源码可知: // public static final String ACTION_DIAL = "android.intent.action.DIAL"; // 这是 Android 中已经定义好的,事实上 Intent 中还有许多这样的常量 intent.setAction(Intent.ACTION_DIAL); // tel 是 Android 中已经定义好的,用于拨打电话,这里设置要拨打的号码为 10010 Uri uri = Uri.parse("tel://10010"); // 3. 调用 Intent 对象的 setData() 方法,该方法需要传入一个 Uri 类型的参数 intent.setData(uri); // 4. 跳转到对应的组件 startActivity(intent); }}
-
效果演示:
点击按钮之后,号码将自动写好:
2. 发送短信
- XML 布局文件,activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
- Java 代码,MainActivity.java:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void sendSMS(View view) { // 1. 创建一个 Intent 对象 Intent intent = new Intent(); // 2. 设置 Intent 对象的 Action intent.setAction(Intent.ACTION_VIEW); // smsto 是 Android 中已经定义好的,用于发送,这里设置要发送的号码为 10010 Uri uri = Uri.parse("smsto://10010"); // 3. 设置 Intent 对象的 setData() 方法,该方法需要传入一个 Uri 类型的参数 intent.setData(uri); // 4. 设置短信的内容,调用 Intent 对象的 putExtra() 方法,该方法需要传入一个键值对(key-value) // 其中 key 为 sms_body,是 Android 系统已经定义好的,系统的短信发送程序只能识别 sms_body intent.putExtra("sms_body", "CXYE"); // 5. 跳转到对应的组件 startActivity(intent); }}
- 声明权限,这里的权限是发送短信,AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
- 效果演示:
点击按钮,启动发送短信程序,并将我们要发送的号码及内容传递给系统短信程序
点击发送按钮:
注意,这里使用的是虚拟机,实际上并没有给10010发送短信。
总结:使用 Intent 启动 Activity 的步骤
- 创建一个 Intent 对象;
若是显式启动直接向构造方法里传入源 Activity 和 目的 Activity,然后进行第 3 步:
Intent intent = new Intent(OriActivity.this, DesActivity.class);
若是隐式启动直接调用无参的构造方法:
Intent intent = new Intent();
- 根据具体对 Intent 对象进行设置,如设置 Action、添加 Category 、设置 Data 等
等;
intent.setAction("MyAction");intent.addCategory("MyCategory");intent.setData(Uri.parse("scheme://host"));
- 跳转到相应的 Activity。
startActivity(intent);
Intent 的用法 - 传递数据
Intent 除了可以用来启动各种组件之外,还可以用来在组件之间传递数据。
使用 Intent 在 Activity 之间传递数据
1. 传递简单数据
我们来做一个实现注册功能的程序:用户在注册界面填写用户名和密码,之后点击注册按钮,跳转到注册成功界面,该界面提示用户注册成功,并显示用户的注册信息。
1. XML 布局文件
- 注册界面,activity_signup.xml:
<?xml version="1.0" encoding="utf-8"?>
- 注册成功界面,activity_signup_success.xml:
<?xml version="1.0" encoding="utf-8"?>
2. Java 代码
- 注册界面,SignUpActivity.java:
public class SignUpActivity extends AppCompatActivity { private EditText et_userName; private EditText et_userPassword; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_signup); // 设置 title setTitle("注册界面"); initView(); } // 该方法用于实例化布局中的控件 private void initView() { et_userName = (EditText) findViewById(R.id.et_userName); et_userPassword = (EditText) findViewById(R.id.et_userPassword); } public void signUp(View view) { // 获取 EditText 里的数据 String userName = et_userName.getText().toString(); String userPassword = et_userPassword.getText().toString(); // 1. 创建一个 Intent 对象,并传入将要启动的 Activity Intent intent = new Intent(SignUpActivity.this, SignUpSuccessActivity.class); // 2. 往 Intent 的对象里放入需要传递的数据 intent.putExtra("userName", userName); intent.putExtra("userPassword", userPassword); // 3. 启动相应的组件,并将数据传递过去 startActivity(intent); }}
- 注册成功界面,SignUpSuccessActivity.java:
public class SignUpSuccessActivity extends AppCompatActivity { private TextView tv_userName; private TextView tv_userPassword; private Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_signup_success); // 设置 title setTitle("注册成功"); initView(); display(); } // 该方法用来显示用户的注册信息 private void display() { //1. 获取启动本 Activity 的 Intent intent = getIntent(); // 2. 从 Intent 中取出数据,根据键取出相应的值 // 注意,此键要与传递过来的键一致,否则会出现 NullPointerException 异常 String userName = intent.getStringExtra("userName"); String userPassword = intent.getStringExtra("userPassword"); // 3. 显示用户的注册信息 tv_userName.setText("您的用户名为:" + userName); tv_userPassword.setText("您的注册密码为:" + userPassword); } // 该方法用来实例化布局中的控件 private void initView() { tv_userName = (TextView) findViewById(R.id.tv_userName); tv_userPassword = (TextView) findViewById(R.id.tv_userPassword); }}
3. 最后,在 AndroidManifest.xml 中注册:
<?xml version="1.0" encoding="utf-8"?>
4) 效果演示:
输入用户名和密码:
点击注册按钮:
返回数据给上一个 Activity
除了向下一个 Activity 传递数据,下一个 Activity 也可以向上一个 Activity 传递数据,具体步骤如下:
- 上一个 Activity 在跳转到相应的 Activity 时调用 startActivityForResult(Intent intent, int requestCode) 方法;
- 在下一个 Activity 调用 setResult(int resultCode, Intent data) 方法;
- 重写上一个 Activity 中的 onActivityResult(int requestCode, int resultCode, Intent data) 方法,在此方法中根据 resultCode 和 resultCode 对对应的返回数据进行处理。
注意:requestCode 必须是唯一的,resultCode 也必须是唯一的,但两者可以相同。
修改上面的程序中 Java 部分的代码如下:
- SignUpActivity.java:
public class SignUpActivity extends AppCompatActivity { private EditText et_userName; private EditText et_userPassword; private Button btn_signUp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_signup); // 设置 title setTitle("注册界面"); initView(); } // 该方法用于实例化布局中的控件 private void initView() { et_userName = (EditText) findViewById(R.id.et_userName); et_userPassword = (EditText) findViewById(R.id.et_userPassword); btn_signUp = (Button) findViewById(R.id.btn_signUp); } public void signUp(View view) { // 获取 EditText 里的数据 String userName = et_userName.getText().toString(); String userPassword = et_userPassword.getText().toString(); // 1. 创建一个 Intent 对象,并传入将要启动的目的 Activity Intent intent = new Intent(SignUpActivity.this, SignUpSuccessActivity.class); // 2. 往 Intent 的对象里放入需要传递的数据 intent.putExtra("userName", userName); intent.putExtra("userPassword", userPassword); // 3. 启动相应的组件,将数据传递过去,并设置 requestCode startActivityForResult(intent, 0); } // 在此方法中根据 requestCode 和 resultCode 对对应的返回数据进行处理 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 0 && resultCode == 0) { // 将 Button 上的文字设置为返回的数据 btn_signUp.setText(data.getStringExtra("signUpSuccess")); btn_signUp.setTextColor(Color.RED); } }}
- SignUpSuccessActivity.java:
public class SignUpSuccessActivity extends AppCompatActivity { private TextView tv_userName; private TextView tv_userPassword; private Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_signup_success); // 设置 title setTitle("注册成功"); initView(); display(); } // 该方法用来显示用户的注册信息 private void display() { //1. 获取启动本 Activity 的 Intent intent = getIntent(); // 2. 从 Intent 中取出数据,根据键取出相应的值 // 注意,此键要与传递过来的键一致,否则会出现 NullPointerException 异常 String userName = intent.getStringExtra("userName"); String userPassword = intent.getStringExtra("userPassword"); // 3. 显示用户的注册信息 tv_userName.setText("您的用户名为:" + userName); tv_userPassword.setText("您的注册密码为:" + userPassword); // 设置返回的数据 intent.putExtra("signUpSuccess", "注册成功"); // 设置 resultCode 和返回的 Intent setResult(0, intent); } // 该方法用来实例化布局中的控件 private void initView() { tv_userName = (TextView) findViewById(R.id.tv_userName); tv_userPassword = (TextView) findViewById(R.id.tv_userPassword); }}
- 效果演示:
填写信息并点击提交注册按钮:
点击返回键:
可以看到,按钮上的文字即为返回的数据。
使用 Bundle 传递数据
除了 Intent,Bundle 也可以用来传递数据,其用法跟 Intent 差不多。将上面的程序修改成如下 (只须修改 SignUpActivity.java 和 SignUpSuccessActivity.java):
- SignUpActivity.java:
public class SignUpActivity extends AppCompatActivity { private EditText et_userName; private EditText et_userPassword; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_signup); // 设置 title setTitle("注册界面"); initView(); } // 该方法用于实例化布局中的控件 private void initView() { et_userName = (EditText) findViewById(R.id.et_userName); et_userPassword = (EditText) findViewById(R.id.et_userPassword); } public void signUp(View view) { // 获取 EditText 里的数据 String userName = et_userName.getText().toString(); String userPassword = et_userPassword.getText().toString(); // 1. 创建一个 Intent 对象,并传入将要启动的 Activity Intent intent = new Intent(SignUpActivity.this, SignUpSuccessActivity.class); // 2. 创建一个 Bundle 对象 Bundle bundle = new Bundle(); // 3. 往 Bundle 的对象里放入需要传递的数据 bundle.putString("userName", userName); bundle.putString("userPassword", userPassword); // 4. 将 Bundle 对象放进 Intent 里 intent.putExtras(bundle); // 5. 启动相应的组件,并将数据传递过去 startActivity(intent); }}
- SignUpSuccessActivity.java:
public class SignUpSuccessActivity extends AppCompatActivity { private TextView tv_userName; private TextView tv_userPassword; private Bundle bundle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_signup_success); // 设置 title setTitle("注册成功"); initView(); display(); } // 该方法用来显示用户的注册信息 private void display() { //1. 获取启动本 Activity 的 Intent 里的 Bundle bundle = getIntent().getExtras(); // 2. 从 Bundle 中取出数据,根据键取出相应的值 // 注意,此键要与传递过来的键一致,否则会出现 NullPointerException 异常 String userName = bundle.getString("userName"); String userPassword = bundle.getString("userPassword"); // 3. 显示用户的注册信息 tv_userName.setText("您的用户名为:" + userName); tv_userPassword.setText("您的注册密码为:" + userPassword); } // 该方法用来实例化布局中的控件 private void initView() { tv_userName = (TextView) findViewById(R.id.tv_userName); tv_userPassword = (TextView) findViewById(R.id.tv_userPassword); }}
从上面的代码可以看出,使用 Bundle 来传递数据跟使用 Intent 来传递数据差不多。实际上还是用的 Intent 来传递数据,只不过 Intent 并不直接将数据传递过去,而是传递一个 Bundle 对象,我们将要传递的数据封装在一个 Bundle 对象里,再使用 Intent 将 Bundle 对象传递过去。
- 效果演示:
效果跟上面的程序完全一样。
2. 传递对象
当要传递的数据较多时,我们可以把数据封装成一个对象,再把这个对象传递过去,条件是该对象必须实现 Serializable 接口或 Parcelable 接口。
- 对象实现 Serializable 接口
在使用内存方面,Serializable 效率比 Parcelable 低,但它能把数据存储在磁盘上。
a. XML 布局文件
信息提交页面,activity_info.xml:
<?xml version="1.0" encoding="utf-8"?>
信息显示页面,activity_info_display.xml:
<?xml version="1.0" encoding="utf-8"?>
b. Java 代码
信息提交页面,InfoSummitActivity.java:
public class InfoSummitActivity extends AppCompatActivity { private EditText et_name; private EditText et_age; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_info); // 设置 title setTitle("提交信息"); initView(); } // 该方法用于实例化布局中的控件 private void initView() { et_name = (EditText) findViewById(R.id.et_name); et_age = (EditText) findViewById(R.id.et_age); } // 该方法用于提交用户信息,并跳转用户信息页面 public void summit(View view) { // 获取 EditText 里的信息 String name = et_name.getText().toString(); int age = Integer.parseInt(et_age.getText().toString()); // 1. 创建一个 Teacher 对象,并设置其属性 Teacher teacher = new Teacher(); teacher.setName(name); teacher.setAge(age); // 2. 创建一个 Intent 对象,指定要跳转的目的组件 Intent intent = new Intent(InfoSummitActivity.this, InfoDisplayActivity.class); // 3. 将要传递的对象放入 Intent 中 intent.putExtra("teacher", teacher); // 4. 跳转到对应的组件 startActivity(intent); } }
信息显示页面,InfoDisplayActivity.java:
public class InfoDisplayActivity extends AppCompatActivity { private TextView tv_name; private TextView tv_age; private Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_info_display); // 设置 title setTitle("用户信息"); initView(); display(); } // 该方法用于显示用户的信息 private void display() { // 1. 获取启动本 Activity 的 Intent intent = getIntent(); // 2. 创建一个 Teacher 对象,用来接收从 Intent 里取出的数据 Teacher teacher = (Teacher) intent.getSerializableExtra("teacher"); // 3. 设置数据到对应的控件上 tv_name.setText("您的姓名是:" + teacher.getName()); tv_age.setText("您的年龄为:" + teacher.getAge()); // 注意,由于 setText 只能接受 CharSequence 类型的参数, // 而在这里我们的年龄是 int 类型的,如果写成: // tv_age.setText(teacher.getAge()); // 点击按钮时会出现 Resources$NotFoundException,即资源未找到异常 // 解决办法是加个空字符:tv_age.setText(teacher.getAge() + ""); } // 该方法用于实例化布局中的控件 private void initView() { tv_name = (TextView) findViewById(R.id.tv_name); tv_age = (TextView) findViewById(R.id.tv_age); }}
c. 效果演示:
输入信息,并点击提交按钮:
- 对象实现 Parcelable 接口
- 在使用内存方面,Parcelable 效率比 Serializable 高,但它不能将数据存储在磁盘上。
- 实现 Parcelable 接口必须重写 writeToParcel() 方法和 describeContents() 方法,并实例化静态内部对象 CREATOR 实现 Creator 接口。详情请看这篇文章 Android中Parcelable接口用法
a. XML 布局文件
信息提交页面,activity_info.xml:
<?xml version="1.0" encoding="utf-8"?>
信息显示页面,activity_info_display.xml:
<?xml version="1.0" encoding="utf-8"?>
b. Java 代码
新建一个 Student 类,该类实现了 Parcelable 接口:
public class Student implements Parcelable { private String name; private int id; public Student() { } public Student(Parcel source) { name = source.readString(); id = source.readInt(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } // 此方法为内容描述,默认即可 @Override public int describeContents() { return 0; } // 此方法用来写入数据 @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.name); dest.writeInt(this.id); } // 实例化 CREATOR 对象,实现 Creator 接口 public static final Creator CREATOR = new Creator() { // 此方法用来读取传递过来的数据,注意读取的顺序要与写入的顺序一致 @Override public Student createFromParcel(Parcel source) { return new Student(source); } // 此方法用来供外部类反序列化本类数组使用 @Override public Student[] newArray(int size) { return new Student[size]; } };}
信息提交页面,InfoSummitActivity.java:
public class InfoSummitActivity extends AppCompatActivity { private EditText et_name; private EditText et_id; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_info); // 设置 title setTitle("提交信息"); initView(); } // 该方法用于实例化布局中的控件 private void initView() { et_name = (EditText) findViewById(R.id.et_name); et_id = (EditText) findViewById(R.id.et_id); } // 该方法用于提交用户信息,并跳转用户信息页面 public void summit(View view) { // 获取 EditText 里的信息 String name = et_name.getText().toString(); int id = Integer.parseInt(et_id.getText().toString()); // 1. 创建一个 Student 对象,并设置其属性 Student student = new Student(); student.setName(name); student.setId(id); // 2. 创建一个 Intent 对象,指定要跳转的目的组件 Intent intent = new Intent(InfoSummitActivity.this, InfoDisplayActivity.class); // 3. 将要传递的对象放入 Intent 中 intent.putExtra("student", student); // 4. 跳转到对应的组件 startActivity(intent); }}
信息显示页面,InfoDisplayActivity.java:
public class InfoDisplayActivity extends AppCompatActivity { private TextView tv_name; private TextView tv_id; private Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_info_display); // 设置 title setTitle("用户信息"); initView(); display(); } // 该方法用于显示用户的信息 private void display() { // 1. 获取启动本 Activity 的 Intent intent = getIntent(); // 2. 创建一个 Student 对象,用来接收从 Intent 里取出的数据 Student student = intent.getParcelableExtra("student"); // 3. 设置数据到对应的控件上 tv_name.setText("您的姓名是:" + student.getName()); tv_id.setText("您的学号是:" + student.getId()); // 注意,由于 setText 只能接受 CharSequence 类型的参数, // 而在这里我们的年龄是 int 类型的,如果写成: // tv_id.setText(student.getId()); // 点击按钮时会出现 Resources$NotFoundException,即资源未找到异常 // 解决办法是加个空字符:tv_id.setText(student.getId() + ""); } // 该方法用于实例化布局中的控件 private void initView() { tv_name = (TextView) findViewById(R.id.tv_name); tv_id = (TextView) findViewById(R.id.tv_id); }}
c. 效果演示:
填写信息,并点击提交按钮:
总结:使用 Intent 在 Activity 之间传递数据
- 在传递数据的地方创建一个 Intent 对象;
Intent intent = new Intent();
- 对 Intent 对象进行设置,可以传入简单的数据、对象 (包括 Bundle 对象),注意传入的参数键值对形式;
- intent.putExtra("key", value); - Person person = new Person(); intent.putExtra("person", person); - Bundle bundle = new Bundle(); bundle.putXxx("key", value); intent.putExtra("bundle", bundle); // Xxx 为具体数据类型
- 在接收数据的地方创建一个 Intent 对象;
Intent intent = new Intent();
- 获取启动本 Activity 的 Intent;
intent = getIntent();
- 从 Intent 中取出数据,根据键取出相应的值,注意,此键要与传递过来的键一致,否则会出现 NullPointerException 异常;根据传递过来的值的类型,用对应的数据类型去接收。
- String string = intent.getStringExtra("string"); - Teacher teacher = (Teacher) intent.getSerializableExtra("teacher"); - Student student = intent.getParcelableExtra("student");
参考资料:
- Android中Parcelable接口用法
- IntentFilter - today520的专栏
- Intent和IntentFilter详解 - CNnumen
- Android开发--Intent-filter属性详解 - 博学而笃志,切问而近思
更多相关文章
- Android中的Application类
- 如何获取手机短信和通话记录信息
- 深入分析Android(安卓)Binder 驱动
- Android(安卓)获取手机中微信聊天记录并后台发送到邮箱
- Android中的Sqlite数据库操作总结
- Android实现BMP和PNG转换为JPEG格式
- Android客户端通过GET和POST向服务器发送数据
- android 广播的知识积累
- IntentService使用、原理