当前位置:   article > 正文

Android Intent的基本使用_android.intent.action.view

android.intent.action.view

一、Intent概述

意图本身(一个 Intent 对象)是一个被动的数据结构,保存着要执行操作的抽象描述;

在 Android 不同组件间 传递数据,是Activity、Service、BroadcastReceiver之间的通信载体。

  • 显式Intent:通过组件名指定启动的目标组件,比如startActivity(new Intent(A.this,B.class)); 每次启动的组件只有一个~
  • 隐式Intent: 不指定组件名,而指定Intent的Action,Data,或Category,当我们启动组件时, 会去匹配AndroidManifest.xml相关组件的Intent-filter,逐一匹配出满足属性的组件,当不止一个满足时, 会弹出一个让我们选择启动哪个的对话框~

二、Intent的属性

1)ComponentName(组件名称)


2)Action(动作)


3)Category(类别)


4)Data(数据),Type(MIME类型)

此处输入图片的描述


5)Extras(额外)


6)Flags(标记)

参考菜鸟教程Intent使用 

三、使用示例

1、显式Intent使用示例:

1) Intent不仅可以启动一个活动,还可以在启动活动的时候传递数据,传递数据的思路如下:

  1. 1、在启动页面中通过Intent提供的一系列putExtra(“键”,值)方法,将传递的数据放在Intent中;
  2. Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
  3. // b. 通过putExtra()方法传递一个字符串到SecondActivity;
  4. // putExtra()方法接收两个参数:第一个是键,第二个是值(代表真正要传递的数据)
  5. intent.putExtra("data","I come from FirstActivity");
  6. // c. 启动Activity
  7. startActivity(intent);
  8. 2、在被启动的页面中通过getIntent()获取Intent对象,再调用getXXXExtra(“键”)方法获取值。
  9. // a. 获取用于启动SecondActivit的Intent
  10. Intent intent = getIntent();
  11. // b. 调用getStringExtra(),传入相应的键名,就可得到传来的数据
  12. // 注意数据类型 与 传入时保持一致
  13. String data = intent.getStringExtra("data");

2)点击按钮打开百度页面:

  1. Intent it = new Intent();
  2. it.setAction(Intent.ACTION_VIEW);
  3. it.setData(Uri.parse("http://www.baidu.com"));
  4. startActivity(it);

2、隐式Intent使用示例:

 

1)预定义动作的隐式Intent示例:

  1. 1、点击按钮后,所有Action为VIEW的Activity被筛选出来,由用户进一步选择:
  2. Intent it = new Intent();
  3. it.setAction(Intent.ACTION_VIEW);
  4. startActivity(it);
  5. 2、建立第二个Activity的布局,与对应的Activity,在第一个Activity的按钮点击事件中添加一下代码:
  6. <activity android:name=".SecondActivity"
  7. android:label="第二个Activity">
  8. <intent-filter>
  9. <action android:name="android.intent.action.VIEW"/>
  10. <category android:name="android.intent.category.DEFAULT"/>
  11. </intent-filter>
  12. </activity>

 

2)自定义动作的隐式Intent示例:

  1. 1、使用自定义的Action与category来激活另一个Activity
  2. Intent it = new Intent();
  3. it.setAction("my_action");
  4. it.addCategory("my_category");
  5. startActivity(it);
  6. 2、建立第二个Activity的布局,与对应的Activity,在第一个Activity的按钮点击事件中添加一下代码:
  7. <activity android:name=".SecondActivity"
  8. android:label="第二个Activity">
  9. <intent-filter>
  10. <action android:name="my_action"/>
  11. <category android:name="my_category"/>
  12. <category android:name="android.intent.category.DEFAULT"/>
  13. </intent-filter>
  14. </activity>

四、使用 Intent传递对象

1、 Serializable 方式

Serializable是序列化的意思,表示将一个对象转化成可储存或可传输的状态。序列化的对象可在网络上传输也可存储到本地。将一个类序列化只要去实现 Serializable 接口就可以了。

  1. public class Person implements Serializable{
  2. private String name;
  3. private int age;
  4. ....Get/SetMethod
  5. }

传递:

  1. Person person = new Person();
  2. person.setName("Tom");
  3. person.setAge(20);
  4. Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
  5. intent.putExtra("person_data", person);
  6. startActivity(intent);

接收:

Person person = (Person) getIntent().getSerializableExtra("person_data");

2、 Parcelable 方式

除了Serializable之外,使用Parcelable也可以实现相同的效果,不过不同于将对象进行序列化,Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了。

  1. public class Person implements Parcelable {
  2. private String name;
  3. private int age;
  4. ……
  5. @Override
  6. public int describeContents() {
  7. return 0;
  8. }
  9. //将Person类中的字段一一写出,注意不同类型对应不同的方法
  10. @Override
  11. public void writeToParcel(Parcel dest, int flags) {
  12. dest.writeString(name); // 写出name
  13. dest.writeInt(age); // 写出age
  14. }
  15. public static final Parcelable.Creator<Person> CREATOR = new Parcelable. Creator<Person>() {
  16. @Override
  17. public Person createFromParcel(Parcel source) {
  18. Person person = new Person();
  19. person.name = source.readString(); // 读取name
  20. person.age = source.readInt(); // 读取age
  21. return person;
  22. }
  23. @Override
  24. public Person[] newArray(int size) {
  25. return new Person[size];
  26. }
  27. };
  28. }

必须重写describeContents()和writeToParcel()这两个方法;还必须在Person类中提供一个名为CREATOR的常量,这里创建了Parcelable.Creator接口的一个实现,并将泛型指定为Person,需要重写createFromParcel()和newArray()这两个方法。

接收:

Person person = (Person) getIntent().getParcelableExtra("person_data");

评价两种方式: 
对比一下,Serializable的方式较为简单,但由于会把整个对象进行序列化,因此效率方面会比Parcelable方式低一些,所以在通常情况下还是更加推荐使用Parcelable的方式来实现Intent传递对象的功能。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/235930
推荐阅读
相关标签
  

闽ICP备14008679号