Intent的介绍
Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,可以将Intent理解为不同组件之间通信的“媒介”专门提供组件互相调用的相关信息。
Inten启动组件的方法
Intent可以启动一个Activity,也可以启动一个Service,还可以发起一个广播Broadcasts。具体方法如下:
组件名称 | 方法名称 |
---|---|
Activity | startActvity( ) startActivitys( ) |
Service | startService( ) bindService( ) |
Broadcasts | sendBroadcasts( ) sendOrderedBroadcasts( ) sendStickyBroadcasts( ) |
显示启动和隐式启动
这里只讲Activity的启动
显示:
指定从哪里启动和启动的类名
Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
隐式:
只指定action标签和category标签来启动
<activity>
<intent-filter>
<action android:name="...."/>
<category android:name="...."/>
<category android:name="android.intent.category.DEFAULT"/> <!--此句一般都要加 -->
<data android:scheme="..." android:host="..." android:path="/..." android:type="..."/>
</intent-filter>
</activity>
启动
Intent intent = new Intent();
intent.setAction("com.xiazdong.action");
intent.addCategory("com.xiazdong.category");
intent.setData(Uri.parse("xiazdong://www.xiazdong.com/xia"));
startActivity(intent);
Intent传参:
简单数据传递:
只要在启动Activity的时候添加putExtra("",);就能传递一个字典类型数据。
Intent intent=new Intent();
intent.putExtra("extra", "xxxxx");
取值:
Intent intent=getIntent();
String StringE=intent.getStringExtra("extra");
anddroid内置了一些常用数据类型的传值,比如:
String int float ArrayList…
传递自定义类型数据
使用到序列化,在Android中使用序列化有两种方法:(1)实现Serializable接口(2)实现Parcelable接口
其中Parcelable是Android特有的功能,效率要比实现Serializable接口高。实现Serializable接口非常简单,声明一下就可以了。而实现Parcelable虽然稍微复杂一些,但效率高。
首先需要写一个实现Parcelable接口的类
此处参考文章:http://zhouhongyu1989.blog.51cto.com/2931598/1407257/
public class Person implements Parcelable {
private String name;
private int age;
public Person(String name, int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return this.name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return this.age;
}
public void setAge(int age)
{
this.age = age;
}
@Override public int describeContents() {
return 0;
}
//2、实现Parcelable接口的public void writeToParcel(Parcel dest, int flags)方法
//通常进行重写
@Override
public void writeToParcel(Parcel dest, int flags) {
//把数据写入Parcel
dest.writeString(name);
dest.writeInt(age);
}
//3、自定义类型中必须含有一个名称为CREATOR的静态成员,该成员对象要求实现Parcelable.Creator接口及其方法
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
@Override
public Person createFromParcel(Parcel source) {
//从Parcel中读取数据
//此处read顺序依据write顺序
return new Person(source.readString(), source.readInt());
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
}
发送数据:
ArrayList<Person> lPersonSet = new ArrayList<Person>();
Person p1 = new Person(“张三”,20);
lPersonSet.add(p1);
Person p2 = new Person(“李四”,22);
lPersonSet.add(p2);
Person p3 = new Person(“王五”,21);
lPersonSet.add(p3);
//进行页面跳转
Intent intent = new Intent();
intent.putParcelableArrayListExtra("com.example.utilities.personset", lPersonSet);
intent.setClass(MyActivity.this, OtherActivity.class);
MyActivity.this.startActivity(intent);
接收数据
ArrayList<Person> lPersonSet = new ArrayList<Person>();
Intent intent = getIntent();
lPersonSet = intent.getParcelableArrayListExtra("com.example.utilities.personset");
返回数据给上一个活动
回调数据式传值跳转:startActivityForResult()方法
注意这个方法是在第一个活动里使用,表示准备获得数据。
Intent intent1=new Intent(MainActivity.this,OtherActivity.class);
startActivityForResult(intent1,1);
发送数据:
用户按back键,重写onBackPressed方法
@Override
public void onBackPressed() {
super.onBackPressed();
Intent intent =new Intent();
intent.putExtra("fanhui",editText.getText());
setResult(RESULT_OK,intent);
finish();
}
接收数据:
setResult方法会调用前面活动的onActivityResult方法,重写即可。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case 1:
if(requestCode==RESULT_OK){
String datastring=data.getStringExtra("fanhui");
}
break;
}
}