当前位置:   article > 正文

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

startactivity intent

之前博文《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:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <Button
  7. android:id="@+id/button_2"
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:text="Button 2"
  11. />
  12. </LinearLayout>

对于SecondActivity

  1. package com.example.activitytest;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. public class SecondActivity extends AppCompatActivity {
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.second_layout);
  9. }
  10. }

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.activitytest">
  4. <application
  5. android:allowBackup="true"
  6. android:icon="@mipmap/ic_launcher"
  7. android:label="@string/app_name"
  8. android:roundIcon="@mipmap/ic_launcher_round"
  9. android:supportsRtl="true"
  10. android:theme="@style/AppTheme">
  11. <activity android:name=".SecondActivity"></activity>
  12. <activity android:name=".FirstActivity">
  13. android:label="This is FirstActivity">
  14. <intent-filter>
  15. <action android:name="android.intent.action.MAIN" />
  16. <category android:name="android.intent.category.LAUNCHER" />
  17. </intent-filter>
  18. </activity>
  19. </application>
  20. </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》中的按钮点击代码改为:

  1. package com.example.activitytest;
  2. import androidx.annotation.NonNull;
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.view.Menu;
  7. import android.view.MenuItem;
  8. import android.view.View;
  9. import android.widget.Button;
  10. import android.widget.Toast;
  11. public class FirstActivity extends AppCompatActivity {
  12. //重写onCreateOptionsMenu方法,将菜单显示出来
  13. @Override
  14. public boolean onCreateOptionsMenu(Menu menu) {
  15. getMenuInflater().inflate(R.menu.main, menu);
  16. //通过getMenuInflater() 方法能够得到MenuInflater 对象
  17. //再调用它的inflate() 方法就可以给当前活动创建菜单了
  18. //inflate() 方法接收两个参数,
  19. //第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main 。
  20. //第二个参数用于指定我们的菜单项将添加到哪一个Menu 对象当中,这里直接使用onCreateOptionsMenu() 方法中传入的menu 参数。
  21. return true;
  22. //返回true ,表示允许创建的菜单显示出来
  23. //若返回了false ,创建的菜单将无法显示。
  24. }
  25. //重写onOptionsItemSelected方法,定义菜单的相应事件
  26. @Override
  27. public boolean onOptionsItemSelected(@NonNull MenuItem item) {
  28. switch (item.getItemId()){ //通过调用item.getItemId() 来判断我们点击的是哪一个菜单项
  29. case R.id.add_item:
  30. Toast.makeText(FirstActivity.this, "你点了add!",Toast.LENGTH_SHORT).show();
  31. break;
  32. case R.id.remove_item:
  33. Toast.makeText(FirstActivity.this, "你点了remove!",Toast.LENGTH_SHORT).show();
  34. break;
  35. default:
  36. break;
  37. }
  38. return true;
  39. }
  40. ************************************///
  41. //定义布局
  42. @Override
  43. protected void onCreate(Bundle savedInstanceState) {
  44. super.onCreate(savedInstanceState);
  45. setContentView(R.layout.first_layout);//通过文件名字来调用,加载布局
  46. //setContentView方法用于加载布局
  47. //项目中添加的任何资源都会在R文件中生成一个相应的资源id
  48. // 因此,所创建的layout文件会自动将id添加到R文件中
  49. // 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id
  50. ///**********************///
  51. Button button1=(Button) findViewById(R.id.button_1);
  52. //通过findViewById() 方法获取到在布局文件中定义的元素
  53. //在first_layout文件中,通过android:id="@+id/button_1"定义了按钮
  54. //findViewById() 方法返回的是一个View 对象,我们需要向下转型将它转成Button 对象
  55. button1.setOnClickListener(new View.OnClickListener() {
  56. @Override //表示重写
  57. public void onClick(View v) {
  58. Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
  59. //构建出intent的“意图”
  60. startActivity(intent);//启动活动
  61. }
  62. });
  63. // button1.setOnClickListener(new View.OnClickListener() {
  64. // //通过调用setOnClickListener() 方法为按钮注册一个监听器
  65. // //点击按钮时就会执行监听器中的onClick() 方法。
  66. // @Override //表示重写
  67. // public void onClick(View v) {
  68. // Toast.makeText(FirstActivity.this, "臭鱼!",Toast.LENGTH_SHORT).show();
  69. // //通过静态方法makeText() 创建出一个Toast对象
  70. // //并通过show()将Toast显示出来
  71. //
  72. // // makeText() 方法需要传入3个参数。
  73. // // 第一个参数是Context ,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this 即可。
  74. // // 第二个参数是Toast显示的文本内容,
  75. // // 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
  76. //
  77. // }
  78. // });
  79. }
  80. }

 

隐式Intent

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

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

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.activitytest">
  4. <application
  5. android:allowBackup="true"
  6. android:icon="@mipmap/ic_launcher"
  7. android:label="@string/app_name"
  8. android:roundIcon="@mipmap/ic_launcher_round"
  9. android:supportsRtl="true"
  10. android:theme="@style/AppTheme">
  11. <activity android:name=".SecondActivity"></activity>
  12. <intent-filter>
  13. <action android:name="com.example.ActivityTest.ACTION_START" />
  14. //在<action> 标签中我们指明了当前活动可以响应
  15. com.example.activitytest.ACTION_START 这个action
  16. <category android:name="android.intent.category.DEFAULT" />
  17. //更精确地指明了当前的活动能够响应的Intent中还可能带有的category
  18. </intent-filter>>
  19. <activity android:name=".FirstActivity">
  20. android:label="This is FirstActivity">
  21. <intent-filter>
  22. <action android:name="android.intent.action.MAIN" />
  23. <category android:name="android.intent.category.LAUNCHER" />
  24. </intent-filter>
  25. </activity>
  26. </application>
  27. </manifest>

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

  1. package com.example.activitytest;
  2. import androidx.annotation.NonNull;
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.view.Menu;
  7. import android.view.MenuItem;
  8. import android.view.View;
  9. import android.widget.Button;
  10. import android.widget.Toast;
  11. public class FirstActivity extends AppCompatActivity {
  12. //重写onCreateOptionsMenu方法,将菜单显示出来
  13. @Override
  14. public boolean onCreateOptionsMenu(Menu menu) {
  15. getMenuInflater().inflate(R.menu.main, menu);
  16. //通过getMenuInflater() 方法能够得到MenuInflater 对象
  17. //再调用它的inflate() 方法就可以给当前活动创建菜单了
  18. //inflate() 方法接收两个参数,
  19. //第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main 。
  20. //第二个参数用于指定我们的菜单项将添加到哪一个Menu 对象当中,这里直接使用onCreateOptionsMenu() 方法中传入的menu 参数。
  21. return true;
  22. //返回true ,表示允许创建的菜单显示出来
  23. //若返回了false ,创建的菜单将无法显示。
  24. }
  25. //重写onOptionsItemSelected方法,定义菜单的相应事件
  26. @Override
  27. public boolean onOptionsItemSelected(@NonNull MenuItem item) {
  28. switch (item.getItemId()){ //通过调用item.getItemId() 来判断我们点击的是哪一个菜单项
  29. case R.id.add_item:
  30. Toast.makeText(FirstActivity.this, "你点了add!",Toast.LENGTH_SHORT).show();
  31. break;
  32. case R.id.remove_item:
  33. Toast.makeText(FirstActivity.this, "你点了remove!",Toast.LENGTH_SHORT).show();
  34. break;
  35. default:
  36. break;
  37. }
  38. return true;
  39. }
  40. ************************************///
  41. //定义布局
  42. @Override
  43. protected void onCreate(Bundle savedInstanceState) {
  44. super.onCreate(savedInstanceState);
  45. setContentView(R.layout.first_layout);//通过文件名字来调用,加载布局
  46. //setContentView方法用于加载布局
  47. //项目中添加的任何资源都会在R文件中生成一个相应的资源id
  48. // 因此,所创建的layout文件会自动将id添加到R文件中
  49. // 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id
  50. ///**********************///
  51. Button button1=(Button) findViewById(R.id.button_1);
  52. //通过findViewById() 方法获取到在布局文件中定义的元素
  53. //在first_layout文件中,通过android:id="@+id/button_1"定义了按钮
  54. //findViewById() 方法返回的是一个View 对象,我们需要向下转型将它转成Button 对象
  55. button1.setOnClickListener(new View.OnClickListener() {
  56. @Override //表示重写
  57. public void onClick(View v) {
  58. Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
  59. //构建出intent的“意图”
  60. startActivity(intent);//启动活动
  61. }
  62. });
  63. // button1.setOnClickListener(new View.OnClickListener() {
  64. // @Override //表示重写
  65. // public void onClick(View v) {
  66. // Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
  67. // //构建出intent的“意图”
  68. // startActivity(intent);//启动活动
  69. // }
  70. // });
  71. // button1.setOnClickListener(new View.OnClickListener() {
  72. // //通过调用setOnClickListener() 方法为按钮注册一个监听器
  73. // //点击按钮时就会执行监听器中的onClick() 方法。
  74. // @Override //表示重写
  75. // public void onClick(View v) {
  76. // Toast.makeText(FirstActivity.this, "臭鱼!",Toast.LENGTH_SHORT).show();
  77. // //通过静态方法makeText() 创建出一个Toast对象
  78. // //并通过show()将Toast显示出来
  79. //
  80. // // makeText() 方法需要传入3个参数。
  81. // // 第一个参数是Context ,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this 即可。
  82. // // 第二个参数是Toast显示的文本内容,
  83. // // 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
  84. //
  85. // }
  86. // });
  87. }
  88. }

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

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

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

  1. package com.example.activitytest;
  2. import androidx.annotation.NonNull;
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.view.Menu;
  7. import android.view.MenuItem;
  8. import android.view.View;
  9. import android.widget.Button;
  10. import android.widget.Toast;
  11. public class FirstActivity extends AppCompatActivity {
  12. //重写onCreateOptionsMenu方法,将菜单显示出来
  13. @Override
  14. public boolean onCreateOptionsMenu(Menu menu) {
  15. getMenuInflater().inflate(R.menu.main, menu);
  16. //通过getMenuInflater() 方法能够得到MenuInflater 对象
  17. //再调用它的inflate() 方法就可以给当前活动创建菜单了
  18. //inflate() 方法接收两个参数,
  19. //第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main 。
  20. //第二个参数用于指定我们的菜单项将添加到哪一个Menu 对象当中,这里直接使用onCreateOptionsMenu() 方法中传入的menu 参数。
  21. return true;
  22. //返回true ,表示允许创建的菜单显示出来
  23. //若返回了false ,创建的菜单将无法显示。
  24. }
  25. //重写onOptionsItemSelected方法,定义菜单的相应事件
  26. @Override
  27. public boolean onOptionsItemSelected(@NonNull MenuItem item) {
  28. switch (item.getItemId()){ //通过调用item.getItemId() 来判断我们点击的是哪一个菜单项
  29. case R.id.add_item:
  30. Toast.makeText(FirstActivity.this, "你点了add!",Toast.LENGTH_SHORT).show();
  31. break;
  32. case R.id.remove_item:
  33. Toast.makeText(FirstActivity.this, "你点了remove!",Toast.LENGTH_SHORT).show();
  34. break;
  35. default:
  36. break;
  37. }
  38. return true;
  39. }
  40. ************************************///
  41. //定义布局
  42. @Override
  43. protected void onCreate(Bundle savedInstanceState) {
  44. super.onCreate(savedInstanceState);
  45. setContentView(R.layout.first_layout);//通过文件名字来调用,加载布局
  46. //setContentView方法用于加载布局
  47. //项目中添加的任何资源都会在R文件中生成一个相应的资源id
  48. // 因此,所创建的layout文件会自动将id添加到R文件中
  49. // 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id
  50. ///**********************///
  51. Button button1=(Button) findViewById(R.id.button_1);
  52. //通过findViewById() 方法获取到在布局文件中定义的元素
  53. //在first_layout文件中,通过android:id="@+id/button_1"定义了按钮
  54. //findViewById() 方法返回的是一个View 对象,我们需要向下转型将它转成Button 对象
  55. button1.setOnClickListener(new View.OnClickListener() {
  56. @Override //表示重写
  57. public void onClick(View v) {
  58. Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
  59. //构建出intent的“意图”
  60. intent.addCategory("com.example.ActivityTest.MY_CATEGORY");
  61. //调用Intent中的addCategory() 方法来添加一个category
  62. startActivity(intent);//启动活动
  63. }
  64. });
  65. // button1.setOnClickListener(new View.OnClickListener() {
  66. // @Override //表示重写
  67. // public void onClick(View v) {
  68. // Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
  69. // //构建出intent的“意图”
  70. // startActivity(intent);//启动活动
  71. // }
  72. // });
  73. // button1.setOnClickListener(new View.OnClickListener() {
  74. // //通过调用setOnClickListener() 方法为按钮注册一个监听器
  75. // //点击按钮时就会执行监听器中的onClick() 方法。
  76. // @Override //表示重写
  77. // public void onClick(View v) {
  78. // Toast.makeText(FirstActivity.this, "臭鱼!",Toast.LENGTH_SHORT).show();
  79. // //通过静态方法makeText() 创建出一个Toast对象
  80. // //并通过show()将Toast显示出来
  81. //
  82. // // makeText() 方法需要传入3个参数。
  83. // // 第一个参数是Context ,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this 即可。
  84. // // 第二个参数是Toast显示的文本内容,
  85. // // 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
  86. //
  87. // }
  88. // });
  89. }
  90. }

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.activitytest">
  4. <application
  5. android:allowBackup="true"
  6. android:icon="@mipmap/ic_launcher"
  7. android:label="@string/app_name"
  8. android:roundIcon="@mipmap/ic_launcher_round"
  9. android:supportsRtl="true"
  10. android:theme="@style/AppTheme">
  11. <activity android:name=".SecondActivity">
  12. <intent-filter>
  13. <action android:name="com.example.ActivityTest.ACTION_START" />
  14. <category android:name="android.intent.category.DEFAULT" />
  15. <category android:name="com.example.activitytest.MY_CATEGORY"/>
  16. </intent-filter>
  17. </activity>
  18. <activity android:name=".FirstActivity">
  19. android:label="This is FirstActivity">
  20. <intent-filter>
  21. <action android:name="android.intent.action.MAIN" />
  22. <category android:name="android.intent.category.LAUNCHER" />
  23. </intent-filter>
  24. </activity>
  25. </application>
  26. </manifest>

 

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

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

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

  1. package com.example.activitytest;
  2. import androidx.annotation.NonNull;
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import android.content.Intent;
  5. import android.net.Uri;
  6. import android.os.Bundle;
  7. import android.view.Menu;
  8. import android.view.MenuItem;
  9. import android.view.View;
  10. import android.widget.Button;
  11. import android.widget.Toast;
  12. public class FirstActivity extends AppCompatActivity {
  13. //重写onCreateOptionsMenu方法,将菜单显示出来
  14. @Override
  15. public boolean onCreateOptionsMenu(Menu menu) {
  16. getMenuInflater().inflate(R.menu.main, menu);
  17. //通过getMenuInflater() 方法能够得到MenuInflater 对象
  18. //再调用它的inflate() 方法就可以给当前活动创建菜单了
  19. //inflate() 方法接收两个参数,
  20. //第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main 。
  21. //第二个参数用于指定我们的菜单项将添加到哪一个Menu 对象当中,这里直接使用onCreateOptionsMenu() 方法中传入的menu 参数。
  22. return true;
  23. //返回true ,表示允许创建的菜单显示出来
  24. //若返回了false ,创建的菜单将无法显示。
  25. }
  26. //重写onOptionsItemSelected方法,定义菜单的相应事件
  27. @Override
  28. public boolean onOptionsItemSelected(@NonNull MenuItem item) {
  29. switch (item.getItemId()){ //通过调用item.getItemId() 来判断我们点击的是哪一个菜单项
  30. case R.id.add_item:
  31. Toast.makeText(FirstActivity.this, "你点了add!",Toast.LENGTH_SHORT).show();
  32. break;
  33. case R.id.remove_item:
  34. Toast.makeText(FirstActivity.this, "你点了remove!",Toast.LENGTH_SHORT).show();
  35. break;
  36. default:
  37. break;
  38. }
  39. return true;
  40. }
  41. ************************************///
  42. //定义布局
  43. @Override
  44. protected void onCreate(Bundle savedInstanceState) {
  45. super.onCreate(savedInstanceState);
  46. setContentView(R.layout.first_layout);//通过文件名字来调用,加载布局
  47. //setContentView方法用于加载布局
  48. //项目中添加的任何资源都会在R文件中生成一个相应的资源id
  49. // 因此,所创建的layout文件会自动将id添加到R文件中
  50. // 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id
  51. ///**********************///
  52. Button button1=(Button) findViewById(R.id.button_1);
  53. //通过findViewById() 方法获取到在布局文件中定义的元素
  54. //在first_layout文件中,通过android:id="@+id/button_1"定义了按钮
  55. //findViewById() 方法返回的是一个View 对象,我们需要向下转型将它转成Button 对象
  56. button1.setOnClickListener(new View.OnClickListener() {
  57. @Override //表示重写
  58. public void onClick(View v) {
  59. Intent intent=new Intent(Intent.ACTION_VIEW);//首先指定了Intent的action 是Intent.ACTION_VIEW(android内部动作)
  60. //构建出intent的“意图”
  61. intent.setData(Uri.parse("http://www.baidu.com"));
  62. //通过Uri.parse() 方法,将一个网址字符串解析成一个Uri对象,
  63. //再调用Intent的setData() 方法将这个Uri 对象传递进去
  64. //setData()接收一个Uri 对象,主要用于指定当前Intent正在操作的数据,
  65. // 而这些数据通常都是以字符串的形式传入到Uri.parse() 方法中解析产生的
  66. startActivity(intent);//启动活动
  67. }
  68. });
  69. // button1.setOnClickListener(new View.OnClickListener() {
  70. // @Override //表示重写
  71. // public void onClick(View v) {
  72. // Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
  73. // //构建出intent的“意图”
  74. // intent.addCategory("com.example.ActivityTest.MY_CATEGORY");
  75. // //调用Intent中的addCategory() 方法来添加一个category
  76. //
  77. // startActivity(intent);//启动活动
  78. // }
  79. // });
  80. // button1.setOnClickListener(new View.OnClickListener() {
  81. // @Override //表示重写
  82. // public void onClick(View v) {
  83. // Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
  84. // //构建出intent的“意图”
  85. // startActivity(intent);//启动活动
  86. // }
  87. // });
  88. // button1.setOnClickListener(new View.OnClickListener() {
  89. // //通过调用setOnClickListener() 方法为按钮注册一个监听器
  90. // //点击按钮时就会执行监听器中的onClick() 方法。
  91. // @Override //表示重写
  92. // public void onClick(View v) {
  93. // Toast.makeText(FirstActivity.this, "臭鱼!",Toast.LENGTH_SHORT).show();
  94. // //通过静态方法makeText() 创建出一个Toast对象
  95. // //并通过show()将Toast显示出来
  96. //
  97. // // makeText() 方法需要传入3个参数。
  98. // // 第一个参数是Context ,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this 即可。
  99. // // 第二个参数是Toast显示的文本内容,
  100. // // 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
  101. //
  102. // }
  103. // });
  104. }
  105. }

一开始会提醒缺少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,将里面的代码替换成如下内容:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <Button
  7. android:id="@+id/button_3"
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:text="Button 3"
  11. />
  12. </LinearLayout>

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.activitytest">
  4. <application
  5. android:allowBackup="true"
  6. android:icon="@mipmap/ic_launcher"
  7. android:label="@string/app_name"
  8. android:roundIcon="@mipmap/ic_launcher_round"
  9. android:supportsRtl="true"
  10. android:theme="@style/AppTheme">
  11. <activity android:name=".ThirdActivity">
  12. <intent-filter>
  13. <action android:name="android.intent.action.VIEW" />
  14. <category android:name="android.intent.category.DEFAULT" />
  15. <data android:scheme="http" />
  16. </intent-filter>
  17. </activity>
  18. <activity android:name=".SecondActivity">
  19. <intent-filter>
  20. <action android:name="com.example.ActivityTest.ACTION_START" />
  21. <category android:name="android.intent.category.DEFAULT" />
  22. <category android:name="com.example.ActivityTest.MY_CATEGORY" />
  23. </intent-filter>
  24. </activity>
  25. <activity android:name=".FirstActivity">
  26. android:label="This is FirstActivity">
  27. <intent-filter>
  28. <action android:name="android.intent.action.MAIN" />
  29. <category android:name="android.intent.category.LAUNCHER" />
  30. </intent-filter>
  31. </activity>
  32. </application>
  33. </manifest>

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

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

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

修改FirstActivity代码如下:

  1. package com.example.activitytest;
  2. import androidx.annotation.NonNull;
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import android.content.Intent;
  5. import android.net.Uri;
  6. import android.os.Bundle;
  7. import android.view.Menu;
  8. import android.view.MenuItem;
  9. import android.view.View;
  10. import android.widget.Button;
  11. import android.widget.Toast;
  12. public class FirstActivity extends AppCompatActivity {
  13. //重写onCreateOptionsMenu方法,将菜单显示出来
  14. @Override
  15. public boolean onCreateOptionsMenu(Menu menu) {
  16. getMenuInflater().inflate(R.menu.main, menu);
  17. //通过getMenuInflater() 方法能够得到MenuInflater 对象
  18. //再调用它的inflate() 方法就可以给当前活动创建菜单了
  19. //inflate() 方法接收两个参数,
  20. //第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main 。
  21. //第二个参数用于指定我们的菜单项将添加到哪一个Menu 对象当中,这里直接使用onCreateOptionsMenu() 方法中传入的menu 参数。
  22. return true;
  23. //返回true ,表示允许创建的菜单显示出来
  24. //若返回了false ,创建的菜单将无法显示。
  25. }
  26. //重写onOptionsItemSelected方法,定义菜单的相应事件
  27. @Override
  28. public boolean onOptionsItemSelected(@NonNull MenuItem item) {
  29. switch (item.getItemId()){ //通过调用item.getItemId() 来判断我们点击的是哪一个菜单项
  30. case R.id.add_item:
  31. Toast.makeText(FirstActivity.this, "你点了add!",Toast.LENGTH_SHORT).show();
  32. break;
  33. case R.id.remove_item:
  34. Toast.makeText(FirstActivity.this, "你点了remove!",Toast.LENGTH_SHORT).show();
  35. break;
  36. default:
  37. break;
  38. }
  39. return true;
  40. }
  41. ************************************///
  42. //定义布局
  43. @Override
  44. protected void onCreate(Bundle savedInstanceState) {
  45. super.onCreate(savedInstanceState);
  46. setContentView(R.layout.first_layout);//通过文件名字来调用,加载布局
  47. //setContentView方法用于加载布局
  48. //项目中添加的任何资源都会在R文件中生成一个相应的资源id
  49. // 因此,所创建的layout文件会自动将id添加到R文件中
  50. // 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id
  51. ///**********************///
  52. Button button1=(Button) findViewById(R.id.button_1);
  53. //通过findViewById() 方法获取到在布局文件中定义的元素
  54. //在first_layout文件中,通过android:id="@+id/button_1"定义了按钮
  55. //findViewById() 方法返回的是一个View 对象,我们需要向下转型将它转成Button 对象
  56. button1.setOnClickListener(new View.OnClickListener() {
  57. @Override //表示重写
  58. public void onClick(View v) {
  59. // Intent intent=new Intent(Intent.ACTION_VIEW);//首先指定了Intent的action 是Intent.ACTION_VIEW(android内部动作)
  60. // //构建出intent的“意图”
  61. // intent.setData(Uri.parse("http://www.baidu.com"));
  62. // //通过Uri.parse() 方法,将一个网址字符串解析成一个Uri对象,
  63. // //再调用Intent的setData() 方法将这个Uri 对象传递进去
  64. // //setData()接收一个Uri 对象,主要用于指定当前Intent正在操作的数据,
  65. // // 而这些数据通常都是以字符串的形式传入到Uri.parse() 方法中解析产生的
  66. //电话
  67. Intent intent=new Intent(Intent.ACTION_DIAL);//Intent的action 是Intent.ACTION_DIAL
  68. intent.setData(Uri.parse("tel:10086"));
  69. startActivity(intent);//启动活动
  70. }
  71. });
  72. // button1.setOnClickListener(new View.OnClickListener() {
  73. // @Override //表示重写
  74. // public void onClick(View v) {
  75. // Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
  76. // //构建出intent的“意图”
  77. // intent.addCategory("com.example.ActivityTest.MY_CATEGORY");
  78. // //调用Intent中的addCategory() 方法来添加一个category
  79. //
  80. // startActivity(intent);//启动活动
  81. // }
  82. // });
  83. // button1.setOnClickListener(new View.OnClickListener() {
  84. // @Override //表示重写
  85. // public void onClick(View v) {
  86. // Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
  87. // //构建出intent的“意图”
  88. // startActivity(intent);//启动活动
  89. // }
  90. // });
  91. // button1.setOnClickListener(new View.OnClickListener() {
  92. // //通过调用setOnClickListener() 方法为按钮注册一个监听器
  93. // //点击按钮时就会执行监听器中的onClick() 方法。
  94. // @Override //表示重写
  95. // public void onClick(View v) {
  96. // Toast.makeText(FirstActivity.this, "臭鱼!",Toast.LENGTH_SHORT).show();
  97. // //通过静态方法makeText() 创建出一个Toast对象
  98. // //并通过show()将Toast显示出来
  99. //
  100. // // makeText() 方法需要传入3个参数。
  101. // // 第一个参数是Context ,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this 即可。
  102. // // 第二个参数是Toast显示的文本内容,
  103. // // 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
  104. //
  105. // }
  106. // });
  107. }
  108. }

有:

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/680172
推荐阅读
相关标签
  

闽ICP备14008679号