Intent(意图)的用法整理

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();
    }

这样,我们便实现了返回数据的需求了。

猜你喜欢

转载自blog.csdn.net/weixin_38364803/article/details/78946348