Android基础 Intent

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;
        }
    }
发布了85 篇原创文章 · 获赞 40 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/lw_zhaoritian/article/details/52487498