什么是Intent
Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递参数。Intent一般可被用于启动活动、启动服务以及发送广播。
Intent大致可以分为两种:显示Intent和隐式Intent。Intent有多个构造函数的重载,其中一个是Intent(Context packageContext,Class<?>cls)。这个构造函数接收连个参数,第一个参数Context要求提供一个启动的上下文,第二个参数Class则是指定想要启动的目标活动,通过这个构造函数就可以构建出Intent要达到的意图。Activity类中提供了一个startActivity()方法,这个方法是专门用于启动活动的。如
button.setOnClickListener(new View.onClickListener(){
@Override
public void onClick(View v){
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent)
}
})
这一段代码的意思是创建一个Intent对象,传入MainActivity.this作为Context,即在MainActivity这个活动的基础之上打开SecondActivity这个活动。这种就是显示使用Intent。
相比于显示Intent,隐式Intent则含蓄很多,它并不明确指出要启动哪一个活动,而是指定一系列更为抽象的action和category等信息,然后交给系统去分析这个Intent,并找出合适的活动去启动。通过在<activity>标签下配置<intent-filter>的内容,可以指定当前活动能够响应的action和category。同样我们要实现在MainActivity页面响应SecondActivity页面,首先是要修改AndroidManifest.xml文件
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activity.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<activity>
然后修改MainActivity中的代码:
button.setOnClickListener(new View.onClickListener(){
@Override
public void onClick(View v){
Intent intent=new Intent(com.example.activity.ACTION_START);
startActivity(intent)
}
})
要注意的是只有在<action>和<category>中的内容同时能够匹配上Intent中指定的action和category时,活动才能够相应Intent。
使用Intent向活动传递参数
Intent除了用于启动一个新的Activity之外还有一个很重要的作用,即向另一个Activity传递参数。在启动活动时传递参数很简单,Intent中提供了一系列putExtra()方法的重载,把数据暂存到Intent中,启动了另一个活动之后,只需要把这些数据再从Intent中取出就好了。比如说我们需要把FirstActivity中的一个字符串传递到SecondActivity中:
button.setOnClickListener(new View.onClickListener(){
@Override
public void onClick(View v){
String data="Hello World"
Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent)
}
})
在putExtra这个方法中有两个参数,第一个参数是Key第二个即是Value,那么如何在SecondActivity中取出data字符串呢
protected void onCreate(Bundle sacedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Intent intent=getIntent();
String data=intent.getStringExtra("extra_data");
Log.i("String is",data);
}
在SecondActivity中使用getIntent获取得到启动SecondActivity的Intent,然后调用putStringExtra()方法传入相应的key,就可以取得想要的value了。不同的类型有不同的取值方法要灵活应用。
向上一个活动返回参数
Intent即存在向下一个活动传参,那么必然也会存在向上一个活动传参。在Activity中有一个startActivityForResult()方法,当这个方法期望在活动销毁时能够返回一个结果给上一个活动。嗯我们需要的便是这一个效果了,首先先修改FirstActivity
button.setOnClickListener(new View.onClickListener(){
@Override
public void onClick(View v){
Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
}
})
现在我们使用的是 startActivityForResult()方法来启动SecondActivity活动,代码中的"1"只要是一个唯一值即可,修改SecondActivity代码
button2.setOnClickListener(new View.onClickListener(){
@Override
public void onClick(View v){
Intent intent=new Intent();
intent.putExtra("data_return","Go to FirstActivity");
setResult(RESULT_OK,intent);
finish();
}
})
这样是否就能达到我们想要的结果呢?那当然是不行咯,我们还没有在FirstActivity中接收SecondActivity的参数呢。当我们销毁SecondActivity活动之后会回调上一个活动的onActivityResult()方法,So我们现在修改一下FirstActivity的代码吧
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
switch(requestCode){
case 1:
if(resultCode==RESULT_OK){
String returnData=data.getStringExtra("data_return");
Log.i("I lvoe Android",returnData);
}
break;
default:
}
}
onActivityResult()方法有三个参数,requestCode即启动活动时传入的请求码就是那个"1",resultCode是返回数据时传入的处理结果,第三个便是带有参数返回的Intent了。
好了,Intent的常用使用大概就是这些希望能帮助到你