Intent 意图 , 描述一个动作, 激活一个组件
显示意图 必须要知道被激活的组件的包名和 class的名字
第一种写法
Intent intent = new Intent();
intent.setClassName("cn.itcast.mutileactivity", "cn.itcast.mutileactivity.Demo2Activity");
第二种写法
Intent intent = new Intent(this,Demo2Activity.class);
第三种写法
Intent intent = new Intent();
ComponentName component = new ComponentName("cn.itcast.mutileactivity", "cn.itcast.mutileactivity.Demo2Activity");
intent.setComponent(component);
。。。。。。。。。。。。。
public Intent setClassName (String packageName, String className)
packageName 要启动的组件所在的应用程序的包名
className 要启动的Acticity或者其他组件的名称
隐式意图
<activity
android:name=".activity.ChooseAreaActivity"
android:label="@string/title_activity_choose_area" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<action> 标签中我们指明了当前活动可以响应 com.example.activitytest.ACTION_START 这个 action
<category>标签则包含了一些附加信息,更精确地指明了当前的活动能够响应的 Intent 中还可能带有的 category
只有<action>和<category>中的内容同时能够匹
配上 Intent 中指定的 action 和 category 时,这个活动才能响应该 Intent
Intent intent = new Intent("android.intent.action.MAIN");
startActivity(intent);
android.intent.category.DEFAULT 是一种默认的 category,在调用startActivity()方法的时候会自动将这个 category 添加到 Intent 中,所以没有调用addCategory("android.intent.category.DEFAULT "),也可以启动活动。
注意:每个 Intent 中只能指定一个 action,但却能指定多个 category。
还可以在<intent-filter>标签中再配置一个
<data>标签
,用于更精确地指定当前活动能够响应什么类型的数据。
<data>标签中主要可以配置以下内容。
1. android:scheme 用于指定数据的协议部分,如上例中的 http 部分。
2. android:host 用于指定数据的主机名部分,如上例中的 www.baidu.com 部分。
3. android:port 用于指定数据的端口部分,一般紧随在主机名之后。
4. android:path 用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
5. android:mimeType 用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
1. android:scheme 用于指定数据的协议部分,如上例中的 http 部分。
2. android:host 用于指定数据的主机名部分,如上例中的 www.baidu.com 部分。
3. android:port 用于指定数据的端口部分,一般紧随在主机名之后。
4. android:path 用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
5. android:mimeType 用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
只有<data>标签中指定的内容和 Intent 中携带的 Data 完全一致时,当前活动才能够响应该 Intent。不过一般在<data>标签中都不会指定过多的内容,如浏览器示例,只需要指定 android:scheme 为 http,就可以响应所有的 http 协议的 Intent 了。
<activity
android:name=".activity.ChooseAreaActivity"
android:label="@string/title_activity_choose_area" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="haha" android:host="cn.itcast.demo" />
</intent-filter>
</activity>
Intent intent = new Intent("android.intent.action.MAIN");
intent.setData(Uri.parse("haha://cn.itcast.demo"));
startActivity(intent);
例子:程序中调用浏览器,代码如下:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://163.com"));
startActivity(intent);
或者
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://163.com"));
startActivity(intent);
打开图库
Intent intent = new Intent();
intent.setAction(Intent.ACTION_PICK);
intent.setType("image/jpeg");
/************************************************************/
Activity间传递数据
传递单个数据
主Activity
Intent data = new Intent("","");
data.putExtra("name", name);
startActivity(data);
被激活的Activity
Intent data = getIntent();
String name = data.getStringExtra("name","");
传递多个数据
主Activity
Intent data = new Intent("","");
Bundle bundle = new Bundle();
bundle.putString("name","zhangsan");
bundle.putString("sex","nan");
data.putExtras(bundle);
startActivity(data);
被激活的Activity
Intent data = getIntent();
Bundle bundle = data.getExtras();
String name = bundle.getString("name","");
String sex =
bundle.getString("sex","");
/************************************************************/
获取被激活的Activity返回的数据
主Activity
private final int REQUESTCODE_A=1;// requestCode用来判断是从哪个Activity返回的
private final int REQUESTCODE_B=2;//
Intent intent_a = new Intent("","");
intent_a.putExtra("name","name");
startActivityForResult(intent_a,REQUESTCODE_A);//第二个参数是requestCode,以此来判断数据是从哪个Activity返回的
Intent intent_b = new Intent("","");
intent_b.putExtra("dianhua","123456");
startActivityForResult(intent_b,REQUESTCODE_B);//第二个参数是requestCode,以此来判断数据是从哪个Activity返回的
注意:如果要获取激活的Activity返回的数据, 在用startActivityForResult(”“,”“)激活活动时,一定不要使用finish()方法销毁原来的活动,即startActivityForResult(”“,”“)方法跟finish()方法不要同时使用。
重写Activity的 onActivityResult方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==2){ //如果resultCode==2则说明处理成功
if(requestCode==REQUESTCODE_A){ // 判断数据是从哪个Activity返回的
String result = data.getStringRxtra("dedaole","");//接收返回数据
............................................................................................
}else if(requestCode==REQUESTCODE_B){
..........................................................................................................
}
}
}
requestCode 用来判断数据是从哪个Activity返回的
resultCode 用来标示被激活的Activity接收到传递过来的数据后,对数据的处理结果,处理的结果不同返回的数据不同。
被激活的Activity
......................................................//此处为获取Activity传递过来的数据,并作出相应的处理,根据处理的结果不同,返回不同的“结果码: resultCode”
Intent data = new Intent();
data.putExtra("dedaole", "dedaole");
setResult(2, data); //返回的2是“结果码: resultCode”,设置不同的结果码来表示数据处理的不同结果,此处返回的结果码为2,来表示数据处理成功。
finish();
private final int REQUESTCODE_A=1;// requestCode用来判断是从哪个Activity返回的
private final int REQUESTCODE_B=2;//
Intent intent_a = new Intent("","");
intent_a.putExtra("name","name");
startActivityForResult(intent_a,REQUESTCODE_A);//第二个参数是requestCode,以此来判断数据是从哪个Activity返回的
Intent intent_b = new Intent("","");
intent_b.putExtra("dianhua","123456");
startActivityForResult(intent_b,REQUESTCODE_B);//第二个参数是requestCode,以此来判断数据是从哪个Activity返回的
注意:如果要获取激活的Activity返回的数据, 在用startActivityForResult(”“,”“)激活活动时,一定不要使用finish()方法销毁原来的活动,即startActivityForResult(”“,”“)方法跟finish()方法不要同时使用。
重写Activity的 onActivityResult方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==2){ //如果resultCode==2则说明处理成功
if(requestCode==REQUESTCODE_A){ // 判断数据是从哪个Activity返回的
String result = data.getStringRxtra("dedaole","");//接收返回数据
............................................................................................
}else if(requestCode==REQUESTCODE_B){
..........................................................................................................
}
}
}
requestCode 用来判断数据是从哪个Activity返回的
resultCode 用来标示被激活的Activity接收到传递过来的数据后,对数据的处理结果,处理的结果不同返回的数据不同。
被激活的Activity
......................................................//此处为获取Activity传递过来的数据,并作出相应的处理,根据处理的结果不同,返回不同的“结果码: resultCode”
Intent data = new Intent();
data.putExtra("dedaole", "dedaole");
setResult(2, data); //返回的2是“结果码: resultCode”,设置不同的结果码来表示数据处理的不同结果,此处返回的结果码为2,来表示数据处理成功。
finish();
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==2){ //如果resultCode==2则说明处理成功
if(requestCode==REQUESTCODE_A){ // 判断数据是从哪个Activity返回的
String result = data.getStringRxtra("dedaole","");//接收返回数据
............................................................................................
}else if(requestCode==REQUESTCODE_B){
..........................................................................................................
}
}
}
requestCode 用来判断数据是从哪个Activity返回的
resultCode 用来标示被激活的Activity接收到传递过来的数据后,对数据的处理结果,处理的结果不同返回的数据不同。
被激活的Activity
......................................................//此处为获取Activity传递过来的数据,并作出相应的处理,根据处理的结果不同,返回不同的“结果码: resultCode”
Intent data = new Intent();
data.putExtra("dedaole", "dedaole");
setResult(2, data); //返回的2是“结果码: resultCode”,设置不同的结果码来表示数据处理的不同结果,此处返回的结果码为2,来表示数据处理成功。
finish();