详解显式intent和隐式intent

Intent是Android程序中各组件之间进行交互的一种重要方式。它不仅可以指明activity想要执行的动作,也可以在不同组件之间传输数据。
Intent分为两种,显式intent和隐式intent,以下分别进行描述:

一、显式intent

 bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent1 = new Intent(MainActivity.this,secondActivity.class);
                startActivity(intent1);
            }
        });

显式intent非常简单,直接创建一个intent对象,第一个参数代表启动活动的上下文,第二个代表想要启动的目标,之后调用startactivity即可。

二、隐式intent

相比于显式intent,隐式intent含蓄了很多,他并不明确指定要启动哪一个服务,而是用一系列的action和category等信息去过滤,然后交由系统分析这个intent,并帮我们找到合适的activity去启动。

<activity android:name=".secondActivity">
            <intent-filter>
                <action android:name="com.example.aries.androidtest.ACTION_START"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
</activity>

上述的action标签中的内容可以随便用一个字符串,比如上述的,也可以使用系统内置的,比如主活动的action;category标签则是添加了一系列附加信息,更加精确的指出当前activity能够响应的intent还必须包含带有的category。只有action和category中的内容同时响应intent的action和category时,这个activity才能被响应;
代码段如下所示:

bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent("com.example.aries.androidtest.ACTION_START");
                startActivity(intent);
            }
        });

注:一个intent只能指定一个action,但是可以指定多个category,满足其中一个category即可启动。单action多category如下所示:

<activity android:name=".secondActivity">
            <intent-filter>
                <action android:name="com.example.aries.androidtest.ACTION_START"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
                <category android:name="my_category"></category>
            </intent-filter>
        </activity>

三、更多隐式intent的用法

intent-filter下面可以有三种标签,分别是action、category和data,前两个都已经讲述,现在来探讨一下data这个属性。
使用隐式intent,我们不仅可以启动自己程序内的activity,还可以调用其他程序中的activity,先看一个简单的例子,我们要展示一个网页,自己去实现一个浏览器不科学的,所以我们可以调用系统浏览器去打开,代码如下:

 bt.setOnClickListener(new View.OnClickListener() {
            @Override
        public void onClick(View view) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse("http://www.baidu.com"));
            startActivity(intent);
            }
        });

这里我们首先指定了intent的action对象为Intent.ACTION_VIEW,这是安卓内置的动作,然后指定intent的data值-一个uri对象。

data标签究竟可以有哪些内容呢,我们发现如下:

android:scheme 用于指定数据的协议部分,如上例中的http;
android:host 用于指定数据的主机名部分,如www.baidu.comandroid:port 用于指定数据的端口部分,一般在主机名之后;
android:path 用于指定主机名和端口后面的部分;
android:mimeType 用于指定可以处理的数据类型。

如下面代码就可以响应打开一个网页的intent:

<activity android:name=".secondActivity">
            <intent-filter tools:ignore="AppLinkUrlError">
                <action android:name="android.intent.action.VIEW"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
                <data android:scheme="http"></data>
            </intent-filter>
        </activity>

四、intent在activity中传递数据

1、向下一个activity传递数据
第一个activity代码如下:

 bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,secondActivity.class);
                intent.putExtra("data","this is data");
                startActivity(intent);
            }
        });

接收方的第二个activity:

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        TextView tv = findViewById(R.id.textView);
        Intent intent = getIntent();
        String data = intent.getStringExtra("data");
        tv.setText(data);
    }

2、返回数据给上一个活动
不在使用startactivity这个方法,而是使用startactivityforresult方法;
第一个activity:

public class MainActivity extends AppCompatActivity {
    TextView tv;
    Button bt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bt = findViewById(R.id.bt1);
        tv = findViewById(R.id.textView);
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,secondActivity.class);
                startActivityForResult(intent,1);//第二个参数是请求码
            }
        });
    }

    //请求码,返回数据的结果码,携带数据的intent
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode){
            case 1:
                if (resultCode == 4){
                    Log.i("info",data.getStringExtra("data"));
                    tv.setText(data.getStringExtra("data"));
                }
        }
    }
}

第二个activity:

public class secondActivity extends AppCompatActivity {
    Button bt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        bt = findViewById(R.id.bt);
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.putExtra("data","second返回的数据");
                setResult(4,intent);
                finish();
            }
        });
    }
}

注意:一个activity可以跳转到很多个activity,应用请求码和结果码可以进行区分;

猜你喜欢

转载自blog.csdn.net/sinat_29355599/article/details/81002540
今日推荐