Android中显示Intent和隐式Intent的使用
Intent是Android中定义的Java类,它用来实现Activity之间的跳转,跳转的同时可以传送数据。
使用显式的Intent
使用Intent的构造函数:Intent(Conotext packageContext,Class<?> cls)来创建一个Intent,这个构造函数的第一个参数要求一个启动活动的上下文,第二个参数Class则是指定想要启动的目标活动。单词Intent意思是“意图”。
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
});
使用这种方式启动另一个活动,“意图”很明显,我们称为显式Intent。
使用隐式的Intent
含蓄,不指名道姓,不会指明那个Activity必须被哪个Activity所启动。
一个Activity2如何被另一个Activity1所启动,关键取决于AndroidManifest.xml中对于Activity2定义的两个标签的信息,分别是action和category。
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="android.bignerdranch.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
然后使用另一个的构造函数Intent(String str)来创建隐式的Intent:
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent("android.bignerdranch.activitytest.ACTION_START");
startActivity(intent);
}
});
以上代码创建的Intent对象,用它启动Activity,启动的是能够响应"android.bignerdranch.activitytest.ACTION_START"这个action的活动,由于SecondActivity的category指定为默认,因此是可以匹配的,可以成功启动SecondActivity。
【注意】:每个Intent只能指定一个action,但却能指定多个category。
如果intent对象中多指定一个category,那么,这个intent就无法启动SecondActivity了:
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent("android.bignerdranch.activitytest.ACTION_START");
intent.addCategory("android.bignerdranch.activitytest.MY_CATEGORY");
startActivity(intent);
}
});
这样一来,使用startActivity(intent)启动一个Activity,没有一个Activity与它匹配,程序就会闪退。
出现运行时异常:android.content.ActivityNotFoundException:No Activity found to handle Intent
解决异常:在安卓总配置文件的<intent-filter>
标签中再添加一个category声明:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="android.bignerdranch.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.bignerdranch.activitytest.MY_CATEGORY" />
</intent-filter>
</activity>
隐式Intent:打开网页
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://taobao.com"));
startActivity(intent);
}
});
通过调用Uri.parse()方法,将一个网址的字符串解析成一个Uri对象,再调用Intent的setData()方法将这个Uri对象传递进去。
我们还可以在<intent-filter
标签中再配置一个<data>
标签,用于更精确的响应当前活动能够响应什么类型的数据。<data>
标签中可配置的内容如下:
- android:scheme 用于指定数据的协议部分,如”http“。
- android:host 用于指定数据的主机名部分,如”www.baidu.com“。
- android:port 用于指定数据的端口号,一般紧随在主机名之后。
- android:path 用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
- android:memeType 用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
隐式Intent:拨打电话
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:1008611"));
startActivity(intent);
}
});
隐式Intent:应用之间传递数据
向下一个应用传递数据
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
String data = "你好呀,SecondActivity";
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);//第一个参数是键,第二个参数才是真正的数据
startActivity(intent);
}
});
在SecondActivity重写的onCreate方法中,加入如下代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Intent intent = getIntent();//注意这里是getIntent()
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity",data);
//····
}
返回数据给上一个活动
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
}
});
Button button2 = (Button)findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_return","你好呀 FirstActivity");
setResult(RESULT_OK,intent);
finish();
}
});
在FirstActivity中重写onActivityResult()方法来得到返回数据:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case 1:
if(resultCode == RESULT_OK){
String returnedData = data.getStringExtra("data_return");
Log.d("FirstActivity",returnedData);
}
break;
default:
}
super.onActivityResult(requestCode, resultCode, data);
}
如果用户不是通过点击button 2按钮返回到FirstActivity,而是通过按下手机的Back键回到FirstActivity,这个时候我们就要监听Back键来发送数据给上层应用了:
@Override
public void onBackPressed(){
Intent intent = new Intent();
intent.putExtra("data_return","你好呀,,,FirstActivity");
setResult(RESULT_OK,intent);
finish();
}