Intent
Intent(意图),Intent提供了一种通用的消息系统,它允许在你的应用程序与其他的应用程序间传递Intent来执行动作和产生事件
Intent是对一次将要进行的操作的抽象描述
我们使用Intent启动一个Activity,Service,Boradcast等,并进行数据的传递
Intent可以划分为显示意图和隐式意图
显示意图:调用Intent.setComponent()或Intent.setClass()方法指定了组件名或类对象的Intent为显示意图,显示意图明确指定了Intent应该传递给哪个组件。
隐式意图:Android系统会根据隐式意图中设置的动作(action),类别(category),数据(URI和数据类型)找到最合适的组件来处理这个意图
Intent Filter(过滤器)其实就是用来匹配隐式Intent的,如果Intent Filter定义的动作,类别,数据与Intent匹配,就会使用Intent Filter所在的组件来处理该Intent。想要接收使用startActivity()方法传递隐式意图的活动必须在他们的意图过滤器中包含“android.intent.category.DEFAULT”
意图的简单用法
使用功能需要打开权限
//打电话的意图
Intent i1=new Intent();
i.setAction(Intent.ACTION_CALL);
i.setData(Uri.parse("tel:222"));
startActivity(i1);
//发短息的意图
Intent i2=new Intent();
i.setAction(intent.ACTION_SENDTO);
i.setData(Uri.parse("smsto:5554"));
i.putExtra("sms_body","hello");
startActivity(i2);
//上网的意图
Intent i3=new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.baidu.com"));
startActivity(i3);
打开新的Activity,传递参数
Intent intent=new Intent(MainActivity.this,NewActivity.class);
Bundle bundle=new Bundle();//该类用作携带参数
bundle.putString("name","xxxx");
bundle.putInt("age",4);
intent.putExtras(bundle);//附带上额外的数据
startActivity(intent);
新的Activity获取数据
Bundle bundle=this.getIntent().getExtras();
String name=bundle.getString("name");
int age=bundle.getInt("age");
Bundle类用作携带数据,它类似于Map,用于存放key-value名值对形式的值。Bundle的内部实际上是使用了HashMap<String,Object>类型的变量来存放putXxx()方法放入的值
为Intent附加数据的两种方法
第一种,用于批量添加数据到Intent:
Intent intent=new Intent(MainActivity.this,NewActivity.class);
Bundle bundle=new Bundle();//该类用作携带参数
bundle.putString("name","xxxx");
intent.putExtras(bundle);//附带上额外的数据,意图原来的把数据不会丢失,但key同名的数据会被替换
第二种,这种写法的作用等价于上面的写法,只不过这种写法是把数据一个个地添加进Intent,这种写法使用起来比较方便,而且只需要编写少量的代码。
Intent intent =new Intent();
intent.putExtra("name","xxxx");
Intent提供了各种常用类型重载后的putExtra()方法,在putExtra()方法内部会判断当前Intent对象内部是否已经存在一个Bundle对象,如果不存在就会新建Bundle对象,以后调用putExtra()方法传入的值都会存放于该Bundle对象
Activity关闭后返回的数据
在Activity中得到新打开Activity关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent,int requestCode)方法打开新的Activity,新的Activity关闭后会向前面的Activity传回数据,为了得到传回的数据在前面的Activity中重写onActivityResult(int requestCode,int resultCode,Intent data)方法:
//第一个参数请求码,即调用startActivityForResult()传递过去的值
//第二个参数为结果码,结果码用于标识返回数据来自哪个新Activity
@Override protected void onActivityResult(int requsetCode,int resultCode,Intent data)
String result =data.getExtras().getString("result");
//得到新Activity关闭后返回的数据
使用startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新Activity关闭前需要向前面的Activity返回数据需要使用系统提供的setResult(int resultCode, Intent data)方法实现:
Intent intent = new Intent();//数据是使用Intent返回
intent.putExtra(“result”, “xxxxx”);//把返回数据存入Intent
setResult(RESULT_OK, intent);//设置返回数据
setResult()方法的第一个参数值可以根据业务需要自己定义
Button btn1 = (Button)findViewById(R.id.button1);
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Uri number = Uri.parse("tel:1234");
Intent i = new Intent(Intent.ACTION_CALL,number);
startActivity(i);
}
};