1.显式Intent
首先new一个Intent,构造方法中传入两个参数,附上源代码
public Intent(Context packageContext, Class<?> cls) {
mComponent = new ComponentName(packageContext, cls);
}
我们可以发现要传入一个上下文context,和一个class参数(即跳转的另一个Activity活动)
Intent intent = new Intent(MainActivity.this,AnotherActivity.class);
然后Activity类提供了一个startActivity()方法,用于启动活动
这里传入你定义的intent
startActivity(intent);
一般置于按钮的点击事件当中便可实现显式意图的活动跳转,执行这个intent
2.隐式Intent
相比与显式的意图,他没有明确的告诉你要启动什么,启动哪个活动。所以你便要采取其他放在,很幸运,隐式意图提供了抽象的action和category等信息来实现intent的配对,这些都由系统去完成,我们都无需操心。
源代码如下
public Intent(String action) {
setAction(action);
}
通过在 activity 的 intent-filter 中可以配置,配置大概如下
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
这便表示一个主活动,我们可以添加里面的action和category等信息
<action android:name="com.example.cativitytest.ACTION_START"/>
当前活动只有action和category的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应该Intent
Intent intent = new Intent("com.example.cativitytest.ACTION_START");
隐式的Intent还可以用于打开一个网页,打开电话拨号窗口。可以利用new Intent()里写入 Intent.ACTION_VIEW 这样的系统内置动作,去实现这些功能。
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://baidu.com"));
startActivity(intent);
这里我只举一个例子,因为系统还内置了很多这样的动作,包括电池信息,媒体库的调用,还有相机都可以通过这样跳转。
3.向下一个活动传递数据
其实实现这个非常简单,因为Intent提供了这样的功能,putExtra()方法,并且还有一系列的方法重载。
putExtra()方法接收两个参数,一个是键值,一个是真正要传递的数据。
携带数据传入代码如下
String data = "hello";
Intent intent = new Intent(MainActivity.this,AnotherActivity.class);
intent.putExtra("send_data",data);
startActivity(intent);
接收数据代码如下
Intent intent = getIntent();
String data = intent.getStringExtra("send_data");
//你可以打印日志来验证
Log.d("AnotherActivity",data);
运行程序我们就可以看到日志打印出了传递过来的”hello”。
4.返回数据给上一个活动
既然有了传给下一个活动的功能,那么聪明的开发者怎么可能不会想到给一个回传数据的方法呢?
所以Activity里还有一个startActivityForResult()的方法用于启动活动,但是这个方法可以返回一个结果,这是我们需要的。
startActivityForResult(intent,1);
startActivityForResult()的方法接收两个参数,第一个是intent,这个不用多讲,第二个是一个请求码,用于在之后回调中判断数据的发出源头。
点击回调返回数据如下代码所示
Intent intent = new Intent();
intent.putExtra("data_return","back");
setResult(RESULT_OK,intent);
finish();
注意到这里有一个setResult()方法了吗?这个方法便是用来返回数据的。
方法接收两个参数,第一个是用于向上一个活动返回处理结果,一般我们只使用 RESULT_OK 或者 RESULT_CANCELED 这两个值,第二个参数则是把带有数据的Intent传递回去。然后调用finish()方法实现销毁当前活动。
在当前活动杯销毁时会回调上一个活动的onActivityResult()方法,所以我们要在上一个活动中重写(mac系统的Android studio里面快捷键是control+o)这个方法来得到返回的数据。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode){
case 1:
if(resultCode == RESULT_OK){
String returnData = data.getStringExtra("data_return");
}
break;
default:
}
}
很明显,onActivityResult()方法第一个参数便是请求码 1 ,第二个便是返回时处理的结果,第三个便是我们携带的数据data。
当然,如果用户是按下手机虚拟键的back键,我们照样可以这样干。
重写onBackPressed()方法,代码如下
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("data_return","bcak");
setResult(RESULT_OK,intent);
finish();
}
这样,我们便实现了返回数据的需求了。