一、用Intent启动活动
1、Intent()函数需要两个参数,第一个参数要求提供一个启动活动的上下文,第二个参数是指定想要启动哪个目标活动
2、示例:
public void onClick(View v){
Intent intent=new Intent(FirstActivity.this,secondActivity.class);
startActivity(intent);
}
3、意义(意图):在一个活动的基础上打开另一个新活动。startActivity(intent);是启动目标活动的方法。
4、隐式Inttent()示例:
<activity android:name=".secondActivity">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_STSRT"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
表示同时匹配到category和action时可以响应这个活动
点击事件:
public void onClick(View v){
Intent intent=new Intent("com.example.activitytest.ACTION_STSRT");
startActivity(intent);
}
这里Intent()只指定了action一样能响应到secondactivity,因为没指定category就是自动默认为"android.intent.category.DEFAULT"
如此secondactivity的action和category都被匹配到了,就能响应该活动,而成功选择这个活动启动。
5、隐式Intent中只能指定一个action,但你却能指定多个category,比如:
public void onClick(View v){
Intent intent=new Intent("com.example.activitytest.ACTION_STSRT");
intent.addCategory("com.example.activitytest.MY_CATEGORY"); //这里就除了默认的还添加多了一个category
startActivity(intent);
}
相应的,注册活动时category也可以设置多个,且没在注册中出现的category在活动代码中出现,项目运行会报错!!!
二、更多Intent隐式用法
1、用于更精确地指定当前活动能够响应什么类型的数据<data>,如在<intent-filter>中添加<data>标签:
<data android:scheme=" "/> //指定数据协议部分,如http。
<data android:host=" "/> //指定数据协议部分,如www.baidu.com。
<data android:port=" "/> //指定数据的端口部分,一般在主机名之后。
<data android:path=" "/> //指定主机名和端口之后的部分,如一段网址跟着域名之后的内容。
<data android:mimeType=" "/> //用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
2、示例:
<activity android:name=".ThirdActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" /> //能够响应的action是ACTION_VIEW
<category android:name="android.intent.category.DEFAULT" /> //category保持默认
<data android:scheme="http"/> //指定数据协议是http
</intent-filter>
</activity>
将在下面这个活动响应:
public void onClick(View v){
Intent intent=new Intent(Intent.ACTION_VIEW); //Intent.ACTION_VIEW是Android系统的内置动作匹配action
intent.setData(Uri.parse("http://www.baidu.com")); //匹配data
startActivity(intent); //启动活动
}
当执行了这个程序,就会弹出所有能够响应这个Intent的所有应用程序供用户选择打开。
3、协议指定。http表示网址,geo表示地理位置,tel表示电话,如:
intent.setData(Uri.parse("tel:10086"));
三、向下一个活动传入数据
1、Intent还可以在启动活动的时候传递数据,如要把一个字符串从活动一传入活动二
2、示例:
public void onClick(View v){
String data="Hello SecondActivity"; //设置需要传入的数据(这里是一个字符串)
Intent intent=new Intent(FirstActivity.this,SecondActivity.class); //用显式Intent启动SecondActivity
intent.putExtra("extra_data",data); //用putExtra函数传入字符
startActivity(intent);
}
注:传入putExtra函数内的两个参数,第一个参数是键,用于后面从Intent取值,第二个参数是传入的数据。
如此传入数据后,在被传入数据的活动可以这样
Intent intent=getIntent(); // 获得在该活动的Intent
String data=intent.getStringExtra("extra_data");
直接获取数据
四、向上一个活动返回数据
1、startActivityForResult()也是用于启动活动的方法,比startActivity()方法多一个返回结果的功能。startActivityForResult()方法有两个参数,第一个参数还是intent,第二个参数是请求码(只要是唯一值就行)。
2、专门用于向上一个活动返回数据的方法setResult(),这个函数需两个参数,第一个参数是用于向上一个活动返回处理结果(一般只使用RESULT_OK或RESULT_CANCEL),第二个参数把有数据的intent传递回去。
3、示例:
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this,secondActivity.class);
startActivityForResult(intent,1);
} //在FirstActivity的class中添加
先在FirstActivity打开secondActivity,并使用startActivityForResult()可返回会数据的启动活动方法。
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","Hello FirstActivity");//传入的数据是"Hello FirstActivity",data_return代之
setResult(RESULT_OK,intent);
finish();
}
}); //在secondActivity的class中添加
这段代码创建了button2 的按键反应,打开secondActivity时按下button2,intent通过putExtra方法加载数据,setResult方法再用已有数据的intent返回上一个活动数据。最后销毁当前活动回到上一个活动。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
switch(requestCode){
case 1:
if (resultCode == RESULT_OK) {
String returnedData = data.getStringExtra("data_return"); //给returnedData创建实例
Log.d("FirstActivity", returnedData); data_return就是代指Hello FirstActivity
}
break;
default:
}
} //FirstActivity的class中添加
在secondActivity销毁后会回调到FirstActivity活动的onActivityResult方法,这里面有三个参数其中requestCode是 startActivityForResult方法中的请求码, resultCode就是setResult方法中的处理结果, Intent data即是intent携带的返回数据
4、通过back键返回数据
示例:
@Override
public void onBackPressed(){
Intent intent=new Intent();
intent.putExtra("data_return","Hello FirstActivity");
setResult(RESULT_OK,intent);
finish();
} //在secondActivity的class中添加
向上一个活动返回数据方法和用startActivityForResult()方法向上一个活动活动返回数据类似