Android学习笔记之——通过Intent来启动不同的Activity

之前博文《Android学习笔记之——activity》已经对Android开发的activity做了基本的介绍了。但是,在启动器中点击应用的图标只会进入到该应用的主活动,本博文学习一下由主活动跳转到其他活动。

目录

创建second activity

启动第二个活动——Intent

显式Intent

隐式Intent

更多隐式Intent的用法(启动其他activity)

构建一个活动能响应Intent


创建second activity

仍然还是右击com.example.activitytest包→New→Activity→Empty Activity,会弹出一个创建活动的对话框

Android Studio会为我们自动生成SecondActivity.java和second_layout.xml这两个文件。

打开Layout,编辑second_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<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_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button 2"
        />

</LinearLayout>

对于SecondActivity

package com.example.activitytest;

import androidx.appcompat.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);
    }
}

任何一个活动都是需要在AndroidManifest.xml中注册的,不过幸运的是,Android Studio已经自动完成了,可以打开AndroidManifest.xml瞧一瞧:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.activitytest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".SecondActivity"></activity>
        <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>
    </application>

</manifest>

由于SecondActivity不是主活动,因此不需要配置<intent-filter> 标签里的内容,注册活动的代码也简单了许多。现在第二个活动已经创建完成。

启动第二个活动——Intent

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

显式Intent

Intent有多个构造函数的重载,其中一个是

Intent(Context packageContext, Class<?>cls) 

这个构造函数接收两个参数,

  • 第一个参数Context 要求提供一个启动活动的上下文
  • 第二个参数Class 则是指定想要启动的目标活动

通过这个构造函数就可以构建出Intent的“意图”。Activity类中提供了一个startActivity() 方
法,这个方法是专门用于启动活动的,它接收一个Intent 参数,所以只需要将构建好的Intent传入startActivity() 方法就可以启动目标活动了。

将博文文Android学习笔记之——activity》中的按钮点击代码改为:

package com.example.activitytest;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
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 {

    //重写onCreateOptionsMenu方法,将菜单显示出来
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        //通过getMenuInflater() 方法能够得到MenuInflater 对象
        //再调用它的inflate() 方法就可以给当前活动创建菜单了
        //inflate() 方法接收两个参数,
        //第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main 。
        //第二个参数用于指定我们的菜单项将添加到哪一个Menu 对象当中,这里直接使用onCreateOptionsMenu() 方法中传入的menu 参数。

        return true;
        //返回true ,表示允许创建的菜单显示出来
        //若返回了false ,创建的菜单将无法显示。
    }

    //重写onOptionsItemSelected方法,定义菜单的相应事件

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){ //通过调用item.getItemId() 来判断我们点击的是哪一个菜单项
            case R.id.add_item:
                Toast.makeText(FirstActivity.this, "你点了add!",Toast.LENGTH_SHORT).show();
                break;
            case  R.id.remove_item:
                Toast.makeText(FirstActivity.this, "你点了remove!",Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return true;
    }


    ////////////////////////////////////////************************************///////

    //定义布局
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);//通过文件名字来调用,加载布局
        //setContentView方法用于加载布局
        //项目中添加的任何资源都会在R文件中生成一个相应的资源id
        // 因此,所创建的layout文件会自动将id添加到R文件中
        // 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id

        ///////////**********************///////////////
        Button button1=(Button) findViewById(R.id.button_1);
        //通过findViewById() 方法获取到在布局文件中定义的元素
        //在first_layout文件中,通过android:id="@+id/button_1"定义了按钮
        //findViewById() 方法返回的是一个View 对象,我们需要向下转型将它转成Button 对象

        button1.setOnClickListener(new View.OnClickListener() {
            @Override //表示重写
            public void onClick(View v) {
                Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
                //构建出intent的“意图”
                startActivity(intent);//启动活动
            }
        });

//        button1.setOnClickListener(new View.OnClickListener() {
//            //通过调用setOnClickListener() 方法为按钮注册一个监听器
//            //点击按钮时就会执行监听器中的onClick() 方法。
//            @Override //表示重写
//            public void onClick(View v) {
//                Toast.makeText(FirstActivity.this, "臭鱼!",Toast.LENGTH_SHORT).show();
//                //通过静态方法makeText() 创建出一个Toast对象
//                //并通过show()将Toast显示出来
//
//                // makeText() 方法需要传入3个参数。
//                // 第一个参数是Context ,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this 即可。
//                // 第二个参数是Toast显示的文本内容,
//                // 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
//            }
//        });

    }
}

隐式Intent

对于隐式Intent并不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的action 和category 等信息,然后交由系统去分析这个Intent,并帮我们找出合适的活动去启动。

在AndroidManifest.xml中。SecondActivity配置<intent-filter> 标签里的内容,可以指定当前活动能够响应的action 和category(类别)

只有<action> 和<category> 中的内容同时能够匹配上Intent中指定的action 和category时,这个活动才能响应该Intent。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.activitytest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".SecondActivity"></activity>
            <intent-filter>
                <action android:name="com.example.ActivityTest.ACTION_START" />
                //在<action> 标签中我们指明了当前活动可以响应
com.example.activitytest.ACTION_START 这个action
                <category android:name="android.intent.category.DEFAULT" />
                //更精确地指明了当前的活动能够响应的Intent中还可能带有的category
            </intent-filter>>   
        
        
        <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>
    </application>

</manifest>

然后修改FirstActivity中按钮的点击事件:

package com.example.activitytest;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
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 {

    //重写onCreateOptionsMenu方法,将菜单显示出来
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        //通过getMenuInflater() 方法能够得到MenuInflater 对象
        //再调用它的inflate() 方法就可以给当前活动创建菜单了
        //inflate() 方法接收两个参数,
        //第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main 。
        //第二个参数用于指定我们的菜单项将添加到哪一个Menu 对象当中,这里直接使用onCreateOptionsMenu() 方法中传入的menu 参数。

        return true;
        //返回true ,表示允许创建的菜单显示出来
        //若返回了false ,创建的菜单将无法显示。
    }

    //重写onOptionsItemSelected方法,定义菜单的相应事件

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){ //通过调用item.getItemId() 来判断我们点击的是哪一个菜单项
            case R.id.add_item:
                Toast.makeText(FirstActivity.this, "你点了add!",Toast.LENGTH_SHORT).show();
                break;
            case  R.id.remove_item:
                Toast.makeText(FirstActivity.this, "你点了remove!",Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return true;
    }


    ////////////////////////////////////////************************************///////

    //定义布局
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);//通过文件名字来调用,加载布局
        //setContentView方法用于加载布局
        //项目中添加的任何资源都会在R文件中生成一个相应的资源id
        // 因此,所创建的layout文件会自动将id添加到R文件中
        // 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id

        ///////////**********************///////////////
        Button button1=(Button) findViewById(R.id.button_1);
        //通过findViewById() 方法获取到在布局文件中定义的元素
        //在first_layout文件中,通过android:id="@+id/button_1"定义了按钮
        //findViewById() 方法返回的是一个View 对象,我们需要向下转型将它转成Button 对象

        button1.setOnClickListener(new View.OnClickListener() {
            @Override //表示重写
            public void onClick(View v) {
                Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
                //构建出intent的“意图”
                startActivity(intent);//启动活动
            }
        });


//        button1.setOnClickListener(new View.OnClickListener() {
//            @Override //表示重写
//            public void onClick(View v) {
//                Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
//                //构建出intent的“意图”
//                startActivity(intent);//启动活动
//            }
//        });



//        button1.setOnClickListener(new View.OnClickListener() {
//            //通过调用setOnClickListener() 方法为按钮注册一个监听器
//            //点击按钮时就会执行监听器中的onClick() 方法。
//            @Override //表示重写
//            public void onClick(View v) {
//                Toast.makeText(FirstActivity.this, "臭鱼!",Toast.LENGTH_SHORT).show();
//                //通过静态方法makeText() 创建出一个Toast对象
//                //并通过show()将Toast显示出来
//
//                // makeText() 方法需要传入3个参数。
//                // 第一个参数是Context ,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this 即可。
//                // 第二个参数是Toast显示的文本内容,
//                // 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
//            }
//        });

    }
}

得到的效果与显示intent一样的

每个Intent中只能指定一个action ,但却能指定多个category 。

目前我们的Intent中只有一个默认的category ,那么现在再来增加一个吧。

package com.example.activitytest;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
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 {

    //重写onCreateOptionsMenu方法,将菜单显示出来
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        //通过getMenuInflater() 方法能够得到MenuInflater 对象
        //再调用它的inflate() 方法就可以给当前活动创建菜单了
        //inflate() 方法接收两个参数,
        //第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main 。
        //第二个参数用于指定我们的菜单项将添加到哪一个Menu 对象当中,这里直接使用onCreateOptionsMenu() 方法中传入的menu 参数。

        return true;
        //返回true ,表示允许创建的菜单显示出来
        //若返回了false ,创建的菜单将无法显示。
    }

    //重写onOptionsItemSelected方法,定义菜单的相应事件

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){ //通过调用item.getItemId() 来判断我们点击的是哪一个菜单项
            case R.id.add_item:
                Toast.makeText(FirstActivity.this, "你点了add!",Toast.LENGTH_SHORT).show();
                break;
            case  R.id.remove_item:
                Toast.makeText(FirstActivity.this, "你点了remove!",Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return true;
    }


    ////////////////////////////////////////************************************///////

    //定义布局
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);//通过文件名字来调用,加载布局
        //setContentView方法用于加载布局
        //项目中添加的任何资源都会在R文件中生成一个相应的资源id
        // 因此,所创建的layout文件会自动将id添加到R文件中
        // 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id

        ///////////**********************///////////////
        Button button1=(Button) findViewById(R.id.button_1);
        //通过findViewById() 方法获取到在布局文件中定义的元素
        //在first_layout文件中,通过android:id="@+id/button_1"定义了按钮
        //findViewById() 方法返回的是一个View 对象,我们需要向下转型将它转成Button 对象

        button1.setOnClickListener(new View.OnClickListener() {
            @Override //表示重写
            public void onClick(View v) {
                Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
                //构建出intent的“意图”
                intent.addCategory("com.example.ActivityTest.MY_CATEGORY");
                //调用Intent中的addCategory() 方法来添加一个category

                startActivity(intent);//启动活动
            }
        });


//        button1.setOnClickListener(new View.OnClickListener() {
//            @Override //表示重写
//            public void onClick(View v) {
//                Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
//                //构建出intent的“意图”
//                startActivity(intent);//启动活动
//            }
//        });



//        button1.setOnClickListener(new View.OnClickListener() {
//            //通过调用setOnClickListener() 方法为按钮注册一个监听器
//            //点击按钮时就会执行监听器中的onClick() 方法。
//            @Override //表示重写
//            public void onClick(View v) {
//                Toast.makeText(FirstActivity.this, "臭鱼!",Toast.LENGTH_SHORT).show();
//                //通过静态方法makeText() 创建出一个Toast对象
//                //并通过show()将Toast显示出来
//
//                // makeText() 方法需要传入3个参数。
//                // 第一个参数是Context ,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this 即可。
//                // 第二个参数是Toast显示的文本内容,
//                // 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
//            }
//        });

    }
}

对于新增的category,到AndroidManifest.xml中。SecondActivity配置<intent-filter>

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.activitytest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="com.example.ActivityTest.ACTION_START" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="com.example.activitytest.MY_CATEGORY"/>
            </intent-filter>
        </activity>


        <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>
    </application>

</manifest>

更多隐式Intent的用法(启动其他activity)

使用隐式Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动,这使得Android多个应用程序之间的功能共享成为了可能。比如说应用程序中需要展示一个网页,这时没有必要自己去实现一个浏览器(事实上也不太可能),而是只需要调用系统的浏览器来打开这个网页就行了。

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

package com.example.activitytest;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.net.Uri;
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 {

    //重写onCreateOptionsMenu方法,将菜单显示出来
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        //通过getMenuInflater() 方法能够得到MenuInflater 对象
        //再调用它的inflate() 方法就可以给当前活动创建菜单了
        //inflate() 方法接收两个参数,
        //第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main 。
        //第二个参数用于指定我们的菜单项将添加到哪一个Menu 对象当中,这里直接使用onCreateOptionsMenu() 方法中传入的menu 参数。

        return true;
        //返回true ,表示允许创建的菜单显示出来
        //若返回了false ,创建的菜单将无法显示。
    }

    //重写onOptionsItemSelected方法,定义菜单的相应事件

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){ //通过调用item.getItemId() 来判断我们点击的是哪一个菜单项
            case R.id.add_item:
                Toast.makeText(FirstActivity.this, "你点了add!",Toast.LENGTH_SHORT).show();
                break;
            case  R.id.remove_item:
                Toast.makeText(FirstActivity.this, "你点了remove!",Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return true;
    }


    ////////////////////////////////////////************************************///////

    //定义布局
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);//通过文件名字来调用,加载布局
        //setContentView方法用于加载布局
        //项目中添加的任何资源都会在R文件中生成一个相应的资源id
        // 因此,所创建的layout文件会自动将id添加到R文件中
        // 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id

        ///////////**********************///////////////
        Button button1=(Button) findViewById(R.id.button_1);
        //通过findViewById() 方法获取到在布局文件中定义的元素
        //在first_layout文件中,通过android:id="@+id/button_1"定义了按钮
        //findViewById() 方法返回的是一个View 对象,我们需要向下转型将它转成Button 对象

        button1.setOnClickListener(new View.OnClickListener() {
            @Override //表示重写
            public void onClick(View v) {
                Intent intent=new Intent(Intent.ACTION_VIEW);//首先指定了Intent的action 是Intent.ACTION_VIEW(android内部动作)
                //构建出intent的“意图”
                intent.setData(Uri.parse("http://www.baidu.com"));
               //通过Uri.parse() 方法,将一个网址字符串解析成一个Uri对象,
                //再调用Intent的setData() 方法将这个Uri 对象传递进去
                //setData()接收一个Uri 对象,主要用于指定当前Intent正在操作的数据,
                // 而这些数据通常都是以字符串的形式传入到Uri.parse() 方法中解析产生的

                startActivity(intent);//启动活动
            }
        });


//        button1.setOnClickListener(new View.OnClickListener() {
//            @Override //表示重写
//            public void onClick(View v) {
//                Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
//                //构建出intent的“意图”
//                intent.addCategory("com.example.ActivityTest.MY_CATEGORY");
//                //调用Intent中的addCategory() 方法来添加一个category
//
//                startActivity(intent);//启动活动
//            }
//        });


//        button1.setOnClickListener(new View.OnClickListener() {
//            @Override //表示重写
//            public void onClick(View v) {
//                Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
//                //构建出intent的“意图”
//                startActivity(intent);//启动活动
//            }
//        });



//        button1.setOnClickListener(new View.OnClickListener() {
//            //通过调用setOnClickListener() 方法为按钮注册一个监听器
//            //点击按钮时就会执行监听器中的onClick() 方法。
//            @Override //表示重写
//            public void onClick(View v) {
//                Toast.makeText(FirstActivity.this, "臭鱼!",Toast.LENGTH_SHORT).show();
//                //通过静态方法makeText() 创建出一个Toast对象
//                //并通过show()将Toast显示出来
//
//                // makeText() 方法需要传入3个参数。
//                // 第一个参数是Context ,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this 即可。
//                // 第二个参数是Toast显示的文本内容,
//                // 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
//            }
//        });

    }
}

一开始会提醒缺少Uri这个量,通过“alt+shift+enter”就可以自动增加import了(不得不感叹一下,真方便hhh)

运行结果如下图所示

除此之外,还可以在<intent-filter> 标签中再配置一个<data> 标签,用于更精确地指定当前活动能够响应什么类型的数据。<data> 标签中主要可以配置以下内容。

  • android:scheme 。用于指定数据的协议部分,如上例中的http部分。
  • android:host 。用于指定数据的主机名部分,如上例中的www.baidu.com部分。
  • android:port 。用于指定数据的端口部分,一般紧随在主机名之后。
  • android:path 。用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
  • android:mimeType 。用于指定可以处理的数据类型,允许使用通配符的方式进行指定。

只有<data> 标签中指定的内容和Intent中携带的Data完全一致时,当前活动才能够响应该Intent。不过一般在<data> 标签中都不会指定过多的内容,如上面浏览器示例中,其实只需要指定android:scheme 为http,就可以响应所有的http协议的Intent了。(甚至不指定也可以正常运行)

构建一个活动能响应Intent

构建一个新的activity,然后编辑third_layout.xml,将里面的代码替换成如下内容:

<?xml version="1.0" encoding="utf-8"?>
<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_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button 3"
        />

</LinearLayout>

ThirdActivity中的代码保持不变。在AndroidManifest.xml中修改ThirdActivity的注册信息:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.activitytest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".ThirdActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="http" />
            </intent-filter>
        </activity>

        <activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="com.example.ActivityTest.ACTION_START" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="com.example.ActivityTest.MY_CATEGORY" />
            </intent-filter>
        </activity>
        <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>
    </application>

</manifest>

可以看到,系统自动弹出了一个列表,显示了目前能够响应这个Intent的所有程序

选择浏览器会出现之前的百度主页;选择ActivityTest,则会启动ThirdActivity

除了http协议外,我们还可以指定很多其他协议,比如geo表示显示地理位置、tel表示拨打电话。

修改FirstActivity代码如下:

package com.example.activitytest;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.net.Uri;
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 {

    //重写onCreateOptionsMenu方法,将菜单显示出来
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        //通过getMenuInflater() 方法能够得到MenuInflater 对象
        //再调用它的inflate() 方法就可以给当前活动创建菜单了
        //inflate() 方法接收两个参数,
        //第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main 。
        //第二个参数用于指定我们的菜单项将添加到哪一个Menu 对象当中,这里直接使用onCreateOptionsMenu() 方法中传入的menu 参数。

        return true;
        //返回true ,表示允许创建的菜单显示出来
        //若返回了false ,创建的菜单将无法显示。
    }

    //重写onOptionsItemSelected方法,定义菜单的相应事件

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){ //通过调用item.getItemId() 来判断我们点击的是哪一个菜单项
            case R.id.add_item:
                Toast.makeText(FirstActivity.this, "你点了add!",Toast.LENGTH_SHORT).show();
                break;
            case  R.id.remove_item:
                Toast.makeText(FirstActivity.this, "你点了remove!",Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return true;
    }


    ////////////////////////////////////////************************************///////

    //定义布局
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);//通过文件名字来调用,加载布局
        //setContentView方法用于加载布局
        //项目中添加的任何资源都会在R文件中生成一个相应的资源id
        // 因此,所创建的layout文件会自动将id添加到R文件中
        // 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id

        ///////////**********************///////////////
        Button button1=(Button) findViewById(R.id.button_1);
        //通过findViewById() 方法获取到在布局文件中定义的元素
        //在first_layout文件中,通过android:id="@+id/button_1"定义了按钮
        //findViewById() 方法返回的是一个View 对象,我们需要向下转型将它转成Button 对象

        button1.setOnClickListener(new View.OnClickListener() {
            @Override //表示重写
            public void onClick(View v) {
//                Intent intent=new Intent(Intent.ACTION_VIEW);//首先指定了Intent的action 是Intent.ACTION_VIEW(android内部动作)
//                //构建出intent的“意图”
//                intent.setData(Uri.parse("http://www.baidu.com"));
//               //通过Uri.parse() 方法,将一个网址字符串解析成一个Uri对象,
//                //再调用Intent的setData() 方法将这个Uri 对象传递进去
//                //setData()接收一个Uri 对象,主要用于指定当前Intent正在操作的数据,
//                // 而这些数据通常都是以字符串的形式传入到Uri.parse() 方法中解析产生的

                //电话
                Intent intent=new Intent(Intent.ACTION_DIAL);//Intent的action 是Intent.ACTION_DIAL
                intent.setData(Uri.parse("tel:10086"));

                startActivity(intent);//启动活动
            }
        });


//        button1.setOnClickListener(new View.OnClickListener() {
//            @Override //表示重写
//            public void onClick(View v) {
//                Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
//                //构建出intent的“意图”
//                intent.addCategory("com.example.ActivityTest.MY_CATEGORY");
//                //调用Intent中的addCategory() 方法来添加一个category
//
//                startActivity(intent);//启动活动
//            }
//        });


//        button1.setOnClickListener(new View.OnClickListener() {
//            @Override //表示重写
//            public void onClick(View v) {
//                Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
//                //构建出intent的“意图”
//                startActivity(intent);//启动活动
//            }
//        });



//        button1.setOnClickListener(new View.OnClickListener() {
//            //通过调用setOnClickListener() 方法为按钮注册一个监听器
//            //点击按钮时就会执行监听器中的onClick() 方法。
//            @Override //表示重写
//            public void onClick(View v) {
//                Toast.makeText(FirstActivity.this, "臭鱼!",Toast.LENGTH_SHORT).show();
//                //通过静态方法makeText() 创建出一个Toast对象
//                //并通过show()将Toast显示出来
//
//                // makeText() 方法需要传入3个参数。
//                // 第一个参数是Context ,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this 即可。
//                // 第二个参数是Toast显示的文本内容,
//                // 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
//            }
//        });

    }
}

有:

发布了255 篇原创文章 · 获赞 281 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/gwplovekimi/article/details/105339027