Intent

  1. 定义,使用范围
    Android中提供了Intent机制来协助应用间的交互通讯,不仅可用于应用程序之间,也可用于应用程序内部的activity, service和broadcast receiver之间的交互。
    Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。
    通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来响应。
    Intent有以下几个属性:
    动作(Action): Action是指Intent要完成的动作,是一个字符串常量。
    数据(Data): 执行动作的URI和MIME类型,不同的Action有不同的Data数据指定。
    分类(Category): Category属性是一个执行动作Action的附加信息。 每个Intent中只能指定一个action,但却能指定多个category。
    类型(Type): Type属性显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
    组件(Compent): Intent的的目标组件的类名称, 指定了这个属性以后,Intent的其它所有属性都是可选的。
    扩展信(Extra): 添加一些组件的附加信息。

  2. 可以启动哪些组件,用什么方法
    (1) Activity
    Context.startActivity() 或 Activity.startActivityForResult()
    (2) Service
    Context.startService()或Context.bindService()
    (3) Broadcasts
    Context.sendBroadcast(),Context.sendOrderedBroadcast()或者
    Context.sendStickyBroadcast()

  3. 显示Intent和隐式Intent
    显示Intent:用java代码实现。
    如:从MainActivity跳转到SecondActivity

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent); 

隐式Intent:在Android Mainefest.xml中实现,在下的中配置
如:从MainActivity跳转到SecondActivity

<activity      
android:name="com.fny.demo. SecondActivity">
<intent-filter>            
<action android:name="android.intent.action.MAIN"/>            
<category android:name="android.intent.category.LAUNCHER"/>   
</intent-filter>
</activity>

在MainActivity中调用

Intent intent = new Intent("android.intent.action.MAIN");
startActivity(intent);

使用隐式Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动;
当Intent匹配成功的组件有多个时,显示优先级高的组件,如果优先级相同,显示列表让用户自己选择;
优先级从-1000至1000,并且其中一个必须为负的才有效。

使用Intent调用系统组件
(1) 相册(从gallery选取图片)

Intent intent1 = new Intent(Intent.ACTION_PICK, null);
intent1.setDataAndType(MediaStore.Images.Media.INTERNAL_CONTENT_URI, "image/*"); 
// INTERNAL_CONTENT_URI是本机图片,图片类型用image

(2) 相机(调用Android设备的照相机,并设置拍照后存放位置)

Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
intent2.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(newFile(Environment.getExternalStorageDirectory(),"head.jpg")));
startActivityForResult(intent2, 2); 
// getExternalStorageDirectory()是存储在本机

(3) 拨号,信息
打开拨打电话的界面:

Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);  

直接拨打电话:

Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);

调用时,要在Android Mainefest.xml添加权限

<uses-permission android:name="android.permission.CALL_PHONE"/>

打开发送短信的界面:

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("smsto: 手机号"));
intent.putExtra("sms_body", "具体短信内容"); 
//"sms_body"为固定内容        
startActivity(intent);

(4) 播放音乐,播放视频
data+type属性的使用实例:播放指定路径的mp3文件

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri data = Uri.parse("mp3所在路径");
intent.setDataAndType(data, "audio/mp3");
startActivity(intent); 
  1. 哪些数据类型能被Intent传送?
    (1) 简单或基本数据类型
    发送方:
Intent intent = new Intent(this,~.class);       
intent.putExtra("key", "value");    
startActivity(intent);

接收方:

Intent intent = getIntent();
String name = getStringExtra("key"); 

(2) 传递一个Bundle
发送方:

Intent intent = new Intent("com.scott.intent.action.TARGET");    
Bundle bundle = new Bundle();    
bundle.putInt("id", 0);    
bundle.putString("name", "scott");    
intent.putExtras(bundle);    
startActivity(intent);    

接收方:

Intent intent = getIntent();
Bundle bundle = intent.getExtras();  
int id = bundle.getInt("id");  
String name = bundle.getString("name"); 

(3) 传递Serializable对象

Bundle bundle = new Bundle(); 
bundle.putSerializable(SER_KEY, Boy ); 
bundle.putString(intent_type,"Serializable"); 
intent.putExtras(bundle); 
startActivity(intent);

Serializable 对象 Boy 代码如下

public class Boy implements Serializable {

    private String name;
    private  int age;
    private String major;

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getMajor() {
        return major;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setMajor(String major) {
        this.major = major;
    }
}

(4) Parcelable对象

Bundle bundle = new Bundle(); 
bundle.putParcelable(PAR_KEY, Girl ); 
bundle.putString(intent_type,"Parcelable"); 
intent.putExtras(bundle);
startActivity(intent);

parcelable 对象 Girl 代码如下

public class Girl implements Parcelable {

    private String name;
    private  int age;
    private String major;

    public static final Parcelable.Creator<Girl> CREATOR = new Parcelable.Creator<Girl>() {

        @Override
        public Girl[] newArray(int i) {
            return new Girl[i];
        }

        @Override
        public Girl createFromParcel(Parcel parcel) {
        // Parcelable必须按照变量声明顺序读取或封装数据
            Girl girl = new Girl();
            girl.setName(parcel.readString());
            girl.setAge(parcel.readInt());
            girl.setMajor(parcel.readString());
            return girl;
        }

    };

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setMajor(String major) {
        this.major = major;
    }


    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getMajor() {
        return major;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
    // Parcelable必须按照变量声明顺序读取或封装数据
        parcel.writeString(name);
        parcel.writeInt(age);
        parcel.writeString(major);
    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值