安卓开发之Intent使用介绍(显式Intent和隐式Intent)

Intent

Intent是 Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动、启动服务以及发送广播等场景,这次我们运用在启动活动上面。

Intent大致可以分为两种:显式Intent和隐式Intent,我们先来看一下显式Intent如何使用。
首先我创建了2个活动.
1.FirstActivity(第一个活动)

package activitytest.example.administrator.activitytest;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class FirstActivity extends AppCompatActivity {
     

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
     
        switch (item.getItemId()) {
     
            case R.id.add_item:
                Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show();
                break;
            case R.id.remove_item:
                Toast.makeText(this, "You clicked Remove", Toast.LENGTH_SHORT).show();
                break;
            default:
        }
        return true;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
     
        getMenuInflater().inflate(R.menu.main,menu);
        return true;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
     
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
        Button button1 = (Button) findViewById(R.id.button_1);
        button1.setOnClickListener(new View.OnClickListener(){
     
            @Override
            public void onClick(View v) {
     
                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });
    }
}

第一个活动的配置文件(first_layout.xml):


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/button_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button 1" />
LinearLayout>

2.SecondActivity(第二个活动)

package activitytest.example.administrator.activitytest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class SecondActivity extends AppCompatActivity {
     

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

第二个活动的配置文件(second_layout.xml):


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/second_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="activitytest.example.administrator.activitytest.SecondActivity">
<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/button_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button 2"/>
LinearLayout>
RelativeLayout>

总的配置文件(AndroidManifest.xml):


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="activitytest.example.administrator.activitytest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".FirstActivity"
            android:label="This is FirstActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            intent-filter>
        activity>
        <activity android:name=".SecondActivity">activity>
    application>

manifest>

Intent有多个构造函数的重载,其中一个是Intent(Context packageContext,Classcls)。这个构造函数接收两个参数,第一个参数Context要求提供一个启动活动的上下文,第二个参数class 则是指定想要启动的目标活动,通过这个构造函数就可以构建出Intent的”意图”。然后我们应该怎么使用这个Intent呢? Activity 类中提供了一个startActivity()方法,这个方法是专门用于启动活动的,它接收一个Intent参数,这里我们将构建好的Intent传入startActivity()方法就可以启动目标活动了。

FirstActivity 中按钮的点击事件的代码如下所示:

            @Override
            public void onClick(View v) {
     
                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                startActivity(intent);
            }

我们首先构建出了一个Intent,传入 FirstActivity.this 作为上下文,传入SecondActivity.class 作为目标活动,这样我们的“意图”就非常明显了,即在FirstActivity这个活动的基础上打开SecondActivity这个活动。然后通过startActivity()方法来执行这个Intent.
运行结果:
安卓开发之Intent使用介绍(显式Intent和隐式Intent)_第1张图片
这时候已经切换到了第二个应用.
安卓开发之Intent使用介绍(显式Intent和隐式Intent)_第2张图片
可以看到,我们已经成功启动SecondActivity这个活动了。如果你想要回到上一个活动怎么办呢?很简单,按下Back键就可以销毁当前活动,从而回到上一个活动了。
使用这种方式来启动活动,Intent的“意图”非常明显,因此我们称之为显式 Intent

隐式Intent

相比于显式Intent,隐式Intent则含蓄了许多,它并不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的action和 category 等信息,然后交由系统去分析这个Intent,并帮我们找出合适的活动去启动。
什么叫作合适的活动呢?简单来说就是可以响应我们这个隐式Intent的活动,那么目前SecondActivity可以响应什么样的隐式Intent呢?额,现在好像还什么都响应不了,不过很快就会有了。

通过在标签下配置的内容,可以指定当前活动能够响应的action和 category,打开AndroidManifest.xml,添加如下代码:

<activity android:name=".SecondActivity">
        <intent-filter>
            <action android:name="activitytest.example.administrator.activitytest.ACTION_START">action>
            <category android:name="android.intent.category.DEFAULT" />
        intent-filter>
    activity>

!这里的activitytest.example.administrator.activitytest是活动所在的地址
安卓开发之Intent使用介绍(显式Intent和隐式Intent)_第3张图片
在标签中我们指明了当前活动可以响应activitytest.example.administrator.activitytest.ACTION_START这个action,而标签则包含了一些附加信息,更精确地指明了当前的活动能够响应的Intent中还可能带有的category。只有和中的内容同时能够匹配上Intent中指定的action和 category时,这个活动才能响应该Intent。
修改FirstActivity 中按钮的点击事件,代码如下所示:

         @Override
            public void onClick(View v) {
     
                Intent intent = new Intent("activitytest.example.administrator.activitytest.ACTION_START");
                startActivity(intent);
            }

可以看到,我们使用了Intent 的另一个构造函数,直接将action的字符串传了进去,表明我们想要启动能够响应activitytest.example.administrator.activitytest.ACTION_START这个action的活动。那前面不是说要和同时匹配上才能响应的吗?怎么没看到哪里有指定category呢?这是因为android.intent.category.DEFAULT是一种默认的category,在调用startActivity()方法的时候会自动将这个category添加到 Intent中。
重新运行程序,在FirstActivity 的界面点击一下按钮,你同样成功启动SecondActivity了。不同的是,这次你是使用了隐式Intent 的方式来启动的,说明我们在标签下配置的action和 category 的内容已经生效了!
运行结果:
安卓开发之Intent使用介绍(显式Intent和隐式Intent)_第4张图片
安卓开发之Intent使用介绍(显式Intent和隐式Intent)_第5张图片
每个Intent中只能指定一个action,但却能指定多个category。目前我们的Intent中只有一个默认的category,那么现在再来增加一个吧。
修改FirstActivity中按钮的点击事件,代码如下所示:

   public void onClick(View v) {
     
                Intent intent = new Intent("activitytest.example.administrator.activitytest.ACTION_START");
                intent.addCategory("activitytest.example.administrator.activitytest.MY_CATEGORY");
                startActivity(intent);
            }
        });

现在我们在AndroidManifest.xml的中再添加一个category的声明,如下所示:

<activity android:name=".SecondActivity">
        <intent-filter>
            <action android:name="activitytest.example.administrator.activitytest.ACTION_START">action>
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="activitytest.example.administrator.activitytest.MY_CATEGORY"/>
        intent-filter>
    activity>

再次重新运行程序,你就会发现一切都正常了。

谢谢大家观看,周某不才, 刚刚学Android开发, 如有问题和建议,欢迎指出来。

望君与吾共进

你可能感兴趣的:(安卓学习,安卓)