Activity之间的跳转有显式意图和隐式意图两种。

显式意图(显式Intent):

  1. //创建一个Intent对象,明确Intent跳转时的源Activity和目标Activity。参数一为当前Activity对象,参数二表示要启动的目标Activity.
    Intent intent = new Intent(MainActivity.this,MainActivity2.class);
    //启动目标组件,根据intent启动目标Activity
  2. startActivity(intent);

1.定义两个Activity:MainActivity和MainActivity2

2.布局文件:在activity_main.xml中

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical"
  8. tools:context=".MainActivity">
  9. <TextView
  10. android:layout_margin="10dp"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:text="账号" />
  14. <EditText
  15. android:id="@+id/username"
  16. android:layout_margin="10dp"
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content"/>
  19. <TextView
  20. android:layout_margin="10dp"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:text="密码"/>
  24. <EditText
  25. android:id="@+id/userpassword"
  26. android:layout_margin="10dp"
  27. android:layout_width="match_parent"
  28. android:layout_height="wrap_content"
  29. android:inputType="textPassword"/>
  30. <Button
  31. android:id="@+id/singin"
  32. android:layout_margin="10dp"
  33. android:layout_width="match_parent"
  34. android:layout_height="wrap_content"
  35. android:text="登陆"/>
  36.  
  37. </LinearLayout>

效果图为:

activity_main2.xml如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".MainActivity2">
  8. <TextView
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:text="登陆成功!"
  12. app:layout_constraintBottom_toBottomOf="parent"
  13. app:layout_constraintLeft_toLeftOf="parent"
  14. app:layout_constraintRight_toRightOf="parent"
  15. app:layout_constraintTop_toTopOf="parent" />
  16. </androidx.constraintlayout.widget.ConstraintLayout>

效果图:

跳转:点击activity_main.xml中的登陆按钮就跳转到activity_main2.xml

3.功能实现:

  1. package com.kotlin.activitystudy;
  2.  
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.widget.Button;
  8. import android.widget.EditText;
  9.  
  10. public class MainActivity extends AppCompatActivity {
  11. private EditText username,userpassword;
  12. private Button singin;
  13. @Override
  14. protected void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.activity_main);
  17. initView();
  18. //设置singin的点击事件
  19. singin.setOnClickListener(new View.OnClickListener() {
  20. @Override
  21. public void onClick(View v) {
  22. Intent intent = new Intent(MainActivity.this,MainActivity2.class);
  23. startActivity(intent);
  24. }
  25. });
  26. }
  27. private void initView(){ //控件绑定
  28. username = findViewById(R.id.username);
  29. userpassword = findViewById(R.id.userpassword);
  30. singin = findViewById(R.id.singin);
  31. }
  32. }

这样我们就完成了MainActivity到ManActivity2的显式跳转

当然在跳转的同时,我们还可以在Activity之间传递数据。显式Intent数据传递方法:

向下一个页面传递数据:

putExtra(String name,String value) //第一个参数是键,第二个参数是要传递的值

putExtra(String name,int value)  //传递整型数据

putExtra(String name,boolean value)  //传递布尔类型数据

putExtra(String name,Serializable value) //传递序列化对象

下一个页面接收数据:

getStringExtra(String name) //接受键值为name的字符串数据

getIntExtra(String name,int defaultvalue)

getBooleanExtra(String name,boolean defaultvalue)  //传递布尔类型数据

getSerializableExtra(String name) //接收序列化对象

修改MainActivity和MainActivity2中的代码,使得跳转后,显示用户信息。

修改MainActivity:只需在startActivity(intent);之前加上传递数据的代码

  1. @Override
  2. public void onClick(View v) {
  3. Intent intent = new Intent(MainActivity.this,MainActivity2.class);
  4. intent.putExtra("username",username.getText().toString());
  5. intent.putExtra("userpassword",userpassword.getText().toString());
  6. startActivity(intent);
  7. }

修改MainActivity2:

  1. package com.kotlin.activitystudy;
  2.  
  3. import androidx.appcompat.app.AppCompatActivity;
  4.  
  5. import android.os.Bundle;
  6. import android.widget.TextView;
  7.  
  8. public class MainActivity2 extends AppCompatActivity {
  9. private TextView information;
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_main2);
  14. initView();
  15. //接受传递过来的数据
  16. String username = getIntent().getStringExtra("username");//键值不能写错
  17. String userpassword = getIntent().getStringExtra("userpassword");
  18. //接受的数据显示出来
  19. information.setText(username+"你好"+"您的密码为"+userpassword+"欢迎登陆");
  20. }
  21. private void initView(){
  22. information = findViewById(R.id.information);
  23. }
  24. }

运行效果:

这样我们就完成了简单的数据传递。

当然我们也可以加一些小功能,如对是否输入账号密码进行判断

修改MainActivity:

  1. package com.kotlin.activitystudy;
  2.  
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.text.TextUtils;
  7. import android.view.View;
  8. import android.widget.Button;
  9. import android.widget.EditText;
  10. import android.widget.TextView;
  11. import android.widget.Toast;
  12.  
  13. public class MainActivity extends AppCompatActivity {
  14. private EditText username,userpassword;
  15. private Button singin;
  16. @Override
  17. protected void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.activity_main);
  20. initView();
  21. //设置singin的点击事件
  22. singin.setOnClickListener(new View.OnClickListener() {
  23. @Override
  24. public void onClick(View v) {
  25. Intent intent = new Intent(MainActivity.this,MainActivity2.class);
  26. Boolean flag = handlerLogin();
  27. if (flag) {
  28. intent.putExtra("username", username.getText().toString());
  29. intent.putExtra("userpassword", userpassword.getText().toString());
  30. startActivity(intent);
  31. }
  32. }
  33. });
  34. }
  35.  
  36. private Boolean handlerLogin(){
  37. String nameText = username.getText().toString().trim();//trim()是去掉空格
  38. if (TextUtils.isEmpty(nameText)){
  39. Toast.makeText(this,"输入的账号为空",Toast.LENGTH_SHORT).show();
  40. return false;
  41. }
  42. String passwordText = userpassword.getText().toString().trim();
  43. if (TextUtils.isEmpty(passwordText)) {
  44. Toast.makeText(this,"输入的密码为空",Toast.LENGTH_SHORT).show();
  45. return false;
  46. }
  47. return true;
  48. }
  49.  
  50. private void initView(){ //控件绑定
  51. username = findViewById(R.id.username);
  52. userpassword = findViewById(R.id.userpassword);
  53. singin = findViewById(R.id.singin);
  54. }
  55. }

运行效果:

这样就实现了Activity的跳转,我们还可以为跳转加上动画效果。

android自带了很多动画效果,这里我们演示系统自带的淡入淡出动画。

修改MainActivity代码:只需在startActivity(intent);后加上跳转动画效果

  1. intent.putExtra("username", username.getText().toString());
  2. intent.putExtra("userpassword", userpassword.getText().toString());
  3. startActivity(intent);
  4. overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);

在进入MainActivity时便有淡入的效果。

从MainActivity进入MainActivity2时调用:

startActivity(intent); overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);

从MainActivity2进入MainActivity时调用:
overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out)

修改MainActivity2的代码:

  1. @Override
  2. protected void onPause() {
  3. super.onPause();
  4. overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);
  5. }

只需重写该方法。这里涉及到activity的生命周期,就不详细讲了。

修改完后便可以用于淡入淡出的动画效果了。

隐式意图(隐式Intent)

不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理它。例如,如需要在地图上向用户显示位置,则可以用隐式Intent,请求另一具有此功能的应用在地图上显示指定位置。

创建隐式Intent时,Android系统通过将Intent的内容与在设备上其他应用的清单文件中声明的Intent过滤器进行比较,从而找到要启动的相应组件,如果Intent与Intent过滤器匹配,则系统将启动该组件,并向其传递Intent对象。如果多个Intent过滤器兼容,则系统会显示一个对话框,支持用户选取要使用的应用。

Intent过滤器是应用清单文件中的一个表达式,它指定该组件要接收的Intent类型。例如,通过为Activity声明Intent过滤器,可以使其他应用能够直接使用某一特定类型的Intnet启动Activity。同样,如果您没有为Activity声明任何Intent过滤器,则Activity只能通过显示Intent启动。

1.创建新的Activity,为MainActivity3

2.在应用清单文件中加入:

  1. <activity android:name=".MainActivity3">
  2. <intent-filter>
  3. <action android:name="com.kotlin.activitystudy.LOGIN_INFO"/> <!--指明当前Activity可以响应com.kotlin.LOGIN_INFO这个action -->
  4. <category android:name="android.intent.category.DEFAULT"/> <!--默认类别。 -->
  5. </intent-filter>
  6. </activity>

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

3.修改MainActivity中的代码:

  1. package com.kotlin.activitystudy;
  2.  
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.text.TextUtils;
  7. import android.view.View;
  8. import android.widget.Button;
  9. import android.widget.EditText;
  10. import android.widget.Toast;
  11.  
  12. public class MainActivity extends AppCompatActivity {
  13. private EditText username,userpassword;
  14. private Button singin;
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19. initView();
  20. //设置singin的点击事件
  21. singin.setOnClickListener(new View.OnClickListener() {
  22. @Override
  23. public void onClick(View v) {
  24. Intent intent = new Intent("com.kotlin.activitystudy.LOGIN_INFO");
  25. Boolean flag = handlerLogin();
  26. if (true) {
  27. intent.putExtra("username", username.getText().toString());
  28. intent.putExtra("userpassword", userpassword.getText().toString());
  29. startActivity(intent);
  30. overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);
  31. }
  32. }
  33. });
  34. }
  35.  
  36. private Boolean handlerLogin(){
  37. String nameText = username.getText().toString().trim();//trim()是去掉空格
  38. if (TextUtils.isEmpty(nameText)){
  39. Toast.makeText(this,"输入的账号为空",Toast.LENGTH_SHORT).show();
  40. return false;
  41. }
  42. String passwordText = userpassword.getText().toString().trim();
  43. if (TextUtils.isEmpty(passwordText)) {
  44. Toast.makeText(this,"输入的密码为空",Toast.LENGTH_SHORT).show();
  45. return false;
  46. }
  47. return true;
  48. }
  49.  
  50. private void initView(){ //控件绑定
  51. username = findViewById(R.id.username);
  52. userpassword = findViewById(R.id.userpassword);
  53. singin = findViewById(R.id.singin);
  54. }
  55. }

只修改了一句代码

Intent intent = new Intent("com.kotlin.activitystudy.LOGIN_INFO");

点击登陆按钮,发现MianActivity3启动成功。

这里使用的是Intent另一个构造函数,直接将action的字符串传了进去,表明我们想要启动能够响应com.kotlin.activitystudy.LOGIN_INFO这个action的Activity。而在AndroidManifest.xml中,已经为MianActivity3设置了action为com.kotlin.activitystudy.LOGIN_INFO。所以此处成功启动MianActivity3。

注意:清单文件中的<category android:name="android.intent.category.DEFAULT"/>是一种默认的category,在调用StartActivity方法的时候会自动将这个category添加到Intent中。

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

修改清单文件:

  1. <activity android:name=".MainActivity3">
  2. <intent-filter>
  3. <action android:name="com.kotlin.activitystudy.LOGIN_INFO"/> <!--指明当前Activity可以响应com.kotlin.LOGIN_INFO这个action -->
  4. <category android:name="android.intent.category.DEFAULT"/> <!--默认类别。 -->
  5. <category android:name="com.kotlin.activitystudy.MY_CATEGORY"/>
  6. </intent-filter>
  7. </activity>

我们添加了一个category,所以在MainActivity中也要添加该category才能成功启动MainActivity3

修改MainActivity:

  1. Intent intent = new Intent("com.kotlin.activitystudy.LOGIN_INFO");
  2. intent.addCategory("com.kotlin.activitystudy.MY_CATEGORY");

添加后,就可以隐式的启动MainActivity3了

Android四大组件——Activity——Activity之间通信上的更多相关文章

  1. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  2. 【Android开发日记】之入门篇(四)——Android四大组件之Activity

    在Android中,无论是开发者还是用户,接触最多的就算是Activity.它是Android中最复杂.最核心的组件.Activity组件是负责与用户进行交互的组件,它的设计理念在很多方面都和Web页 ...

  3. Android四大组件之Activity(活动)及其布局的创建与加载布局

    Android四大组件之Activity(活动)及其布局的创建与加载布局 什么是Activity ? 活动(Activity)是包含用户界面的组件,主要用于和用户进行交互的,一个应用程序中可以包含零个 ...

  4. Android四大组件之——Activity的开启:StartActivity()和StartActivityForResult()(图文详解)

                如需转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com   ...

  5. Android四大组件及activity的四大启动模式

    Android四大组件 1. 广播接收者的两种类型: (1)系统广播接收者,就是继承BroadcastReceiver这个类,然后还要在清单文件中注册,注册之后给他一个action.当系统发生了这个a ...

  6. Android 四大组件之 Activity(二)

    1.综述 Activity是Android四大组件(Application Components)之一,简单来说Activity就是平常所见到的用户界面,一般情况下,一个Activity所占的窗口是满 ...

  7. Android四大组件之——Activity(一)定义、状态和后退栈(图文详解)

    什么是Activity 关键字:应用组件.四大组件.用户界面,交互. An Activity is an application component that provides a screen wi ...

  8. Android 四大组件之 Activity(一)

    1.Activity的定义及作用: Android系统中的四大组件之一,可以用于显示View.Activity是一个与用户交互的系统模块,几乎所有的Activity都是和用户进行交互的一个应用程序的组 ...

  9. [Android基础]Android四大组件之Activity总结

    1.Activity简介 Activity是Android一个非常重要的用户接口(四大组件之一),是可见的,主要是用户和应用程序之间进行交互的接口.在每个Activity中都可以放很多控件,所以也可以 ...

  10. Android 四大组件之Activity(续2)

    1.生命周期 关于生命周期,在详细讲解下: 上图是从android官网获取的生命周期. 正常的流程,很多文章都讨论过了,我们讨论几个特殊的情况. 1)OnResume->OnPause-> ...

随机推荐

  1. OpenCV使用级联分类器实现人脸检测

    一.概述 案例:使用opencv级联分类器CascadeClassifier+其提供的特征数据实现人脸检测,检测到人脸后使用红框画出来. API介绍:detectMultiScale( InputAr ...

  2. phpstudy、Apache安装DVWA教程

    1.下载DVWA(http://www.dvwa.co.uk/) 2.解压缩DVWA安装包到服务器的目录下 Apache: \Apache24\htdocs phpStudy: \PHPTutoria ...

  3. wifi钓鱼

    无线网络的加密方式和破解方式 1.WEP加密及破解 1).WEP加密方式 有线等效保密(wired euivalent pricacy,WEP)协议的使用RC4(rivest cipher4)串流加密 ...

  4. 从查询重写角度理解elasticsearch的高亮原理

    一.高亮的一些问题 elasticsearch提供了三种高亮方式,前面我们已经简单的了解了elasticsearch的高亮原理; 高亮处理跟实际使用查询类型有十分紧密的关系,其中主要的一点就是muti ...

  5. 说说对 SQL 语句优化有哪些方法?(选择几条)

    1.Where 子句中:where 表之间的连接必须写在其他 Where 条件之前,那些可 以过滤掉最大数量记录的条件必须写在 Where 子句的末尾.HAVING 最后. 2.用 EXISTS 替代 ...

  6. Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?

    可以继承其他类或实现其他接口,在 Swing 编程和 Android 开发中常用此方式来 实现事件监听和回调.

  7. Springmvc入门基础(六) ---拦截器应用demo

    1.拦截器定义 Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理. 2.拦截器demo demo需求: 拦截用户请求,判断用 ...

  8. 使用 Spring 有哪些方式?

    使用 Spring 有以下方式: 作为一个成熟的 Spring Web 应用程序. 作为第三方 Web 框架,使用 Spring Frameworks 中间层. 用于远程使用. 作为企业级 Java ...

  9. Spring官宣网传大漏洞,并提供解决方案

    Spring沦陷了!这样的标题这几天是不是看腻了?然而,仔细看看都是拿着之前的几个毫不相干的CVE来大吹特吹.所以,昨天发了一篇关于最近网传的Spring大漏洞的文章,聊了聊这些让人迷惑的营销文.以及 ...

  10. python学习笔记(二)——程序结构

    1. 选择结构: if 语句:单分支.双分支.多分支 **单分支结构** if 条件表达式: 语句块 **双分支结构** if 条件表达式: 语句块 else: 语句块 **多分支结构** if 条件 ...