Android四大组件——Activity——Activity之间通信上
Activity之间的跳转有显式意图和隐式意图两种。
显式意图(显式Intent):
//创建一个Intent对象,明确Intent跳转时的源Activity和目标Activity。参数一为当前Activity对象,参数二表示要启动的目标Activity.
Intent intent = new Intent(MainActivity.this,MainActivity2.class);
//启动目标组件,根据intent启动目标Activity
startActivity(intent);
1.定义两个Activity:MainActivity和MainActivity2
2.布局文件:在activity_main.xml中
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_margin="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="账号" />
<EditText
android:id="@+id/username"
android:layout_margin="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:layout_margin="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="密码"/>
<EditText
android:id="@+id/userpassword"
android:layout_margin="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"/>
<Button
android:id="@+id/singin"
android:layout_margin="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登陆"/> </LinearLayout>
效果图为:
activity_main2.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity2">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登陆成功!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
效果图:
跳转:点击activity_main.xml中的登陆按钮就跳转到activity_main2.xml
3.功能实现:
package com.kotlin.activitystudy; import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends AppCompatActivity {
private EditText username,userpassword;
private Button singin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//设置singin的点击事件
singin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,MainActivity2.class);
startActivity(intent);
}
});
}
private void initView(){ //控件绑定
username = findViewById(R.id.username);
userpassword = findViewById(R.id.userpassword);
singin = findViewById(R.id.singin);
}
}
这样我们就完成了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);之前加上传递数据的代码
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,MainActivity2.class);
intent.putExtra("username",username.getText().toString());
intent.putExtra("userpassword",userpassword.getText().toString());
startActivity(intent);
}
修改MainActivity2:
package com.kotlin.activitystudy; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle;
import android.widget.TextView; public class MainActivity2 extends AppCompatActivity {
private TextView information;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
initView();
//接受传递过来的数据
String username = getIntent().getStringExtra("username");//键值不能写错
String userpassword = getIntent().getStringExtra("userpassword");
//接受的数据显示出来
information.setText(username+"你好"+"您的密码为"+userpassword+"欢迎登陆");
}
private void initView(){
information = findViewById(R.id.information);
}
}
运行效果:
这样我们就完成了简单的数据传递。
当然我们也可以加一些小功能,如对是否输入账号密码进行判断
修改MainActivity:
package com.kotlin.activitystudy; import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends AppCompatActivity {
private EditText username,userpassword;
private Button singin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//设置singin的点击事件
singin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,MainActivity2.class);
Boolean flag = handlerLogin();
if (flag) {
intent.putExtra("username", username.getText().toString());
intent.putExtra("userpassword", userpassword.getText().toString());
startActivity(intent);
}
}
});
} private Boolean handlerLogin(){
String nameText = username.getText().toString().trim();//trim()是去掉空格
if (TextUtils.isEmpty(nameText)){
Toast.makeText(this,"输入的账号为空",Toast.LENGTH_SHORT).show();
return false;
}
String passwordText = userpassword.getText().toString().trim();
if (TextUtils.isEmpty(passwordText)) {
Toast.makeText(this,"输入的密码为空",Toast.LENGTH_SHORT).show();
return false;
}
return true;
} private void initView(){ //控件绑定
username = findViewById(R.id.username);
userpassword = findViewById(R.id.userpassword);
singin = findViewById(R.id.singin);
}
}
运行效果:
这样就实现了Activity的跳转,我们还可以为跳转加上动画效果。
android自带了很多动画效果,这里我们演示系统自带的淡入淡出动画。
修改MainActivity代码:只需在startActivity(intent);后加上跳转动画效果
intent.putExtra("username", username.getText().toString());
intent.putExtra("userpassword", userpassword.getText().toString());
startActivity(intent);
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的代码:
@Override
protected void onPause() {
super.onPause();
overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);
}
只需重写该方法。这里涉及到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.在应用清单文件中加入:
<activity android:name=".MainActivity3">
<intent-filter>
<action android:name="com.kotlin.activitystudy.LOGIN_INFO"/> <!--指明当前Activity可以响应com.kotlin.LOGIN_INFO这个action -->
<category android:name="android.intent.category.DEFAULT"/> <!--默认类别。 -->
</intent-filter>
</activity>
只有<action>和<category>中的内容同时匹配Intent中指定的action和category时,这个Activity才能响应该Intent。
3.修改MainActivity中的代码:
package com.kotlin.activitystudy; import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends AppCompatActivity {
private EditText username,userpassword;
private Button singin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//设置singin的点击事件
singin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.kotlin.activitystudy.LOGIN_INFO");
Boolean flag = handlerLogin();
if (true) {
intent.putExtra("username", username.getText().toString());
intent.putExtra("userpassword", userpassword.getText().toString());
startActivity(intent);
overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);
}
}
});
} private Boolean handlerLogin(){
String nameText = username.getText().toString().trim();//trim()是去掉空格
if (TextUtils.isEmpty(nameText)){
Toast.makeText(this,"输入的账号为空",Toast.LENGTH_SHORT).show();
return false;
}
String passwordText = userpassword.getText().toString().trim();
if (TextUtils.isEmpty(passwordText)) {
Toast.makeText(this,"输入的密码为空",Toast.LENGTH_SHORT).show();
return false;
}
return true;
} private void initView(){ //控件绑定
username = findViewById(R.id.username);
userpassword = findViewById(R.id.userpassword);
singin = findViewById(R.id.singin);
}
}
只修改了一句代码
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。
修改清单文件:
<activity android:name=".MainActivity3">
<intent-filter>
<action android:name="com.kotlin.activitystudy.LOGIN_INFO"/> <!--指明当前Activity可以响应com.kotlin.LOGIN_INFO这个action -->
<category android:name="android.intent.category.DEFAULT"/> <!--默认类别。 -->
<category android:name="com.kotlin.activitystudy.MY_CATEGORY"/>
</intent-filter>
</activity>
我们添加了一个category,所以在MainActivity中也要添加该category才能成功启动MainActivity3
修改MainActivity:
Intent intent = new Intent("com.kotlin.activitystudy.LOGIN_INFO");
intent.addCategory("com.kotlin.activitystudy.MY_CATEGORY");
添加后,就可以隐式的启动MainActivity3了
Android四大组件——Activity——Activity之间通信上的更多相关文章
- Android四大组件之——Activity的生命周期(图文详解)
转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com [Andro ...
- 【Android开发日记】之入门篇(四)——Android四大组件之Activity
在Android中,无论是开发者还是用户,接触最多的就算是Activity.它是Android中最复杂.最核心的组件.Activity组件是负责与用户进行交互的组件,它的设计理念在很多方面都和Web页 ...
- Android四大组件之Activity(活动)及其布局的创建与加载布局
Android四大组件之Activity(活动)及其布局的创建与加载布局 什么是Activity ? 活动(Activity)是包含用户界面的组件,主要用于和用户进行交互的,一个应用程序中可以包含零个 ...
- Android四大组件之——Activity的开启:StartActivity()和StartActivityForResult()(图文详解)
如需转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com ...
- Android四大组件及activity的四大启动模式
Android四大组件 1. 广播接收者的两种类型: (1)系统广播接收者,就是继承BroadcastReceiver这个类,然后还要在清单文件中注册,注册之后给他一个action.当系统发生了这个a ...
- Android 四大组件之 Activity(二)
1.综述 Activity是Android四大组件(Application Components)之一,简单来说Activity就是平常所见到的用户界面,一般情况下,一个Activity所占的窗口是满 ...
- Android四大组件之——Activity(一)定义、状态和后退栈(图文详解)
什么是Activity 关键字:应用组件.四大组件.用户界面,交互. An Activity is an application component that provides a screen wi ...
- Android 四大组件之 Activity(一)
1.Activity的定义及作用: Android系统中的四大组件之一,可以用于显示View.Activity是一个与用户交互的系统模块,几乎所有的Activity都是和用户进行交互的一个应用程序的组 ...
- [Android基础]Android四大组件之Activity总结
1.Activity简介 Activity是Android一个非常重要的用户接口(四大组件之一),是可见的,主要是用户和应用程序之间进行交互的接口.在每个Activity中都可以放很多控件,所以也可以 ...
- Android 四大组件之Activity(续2)
1.生命周期 关于生命周期,在详细讲解下: 上图是从android官网获取的生命周期. 正常的流程,很多文章都讨论过了,我们讨论几个特殊的情况. 1)OnResume->OnPause-> ...
随机推荐
- MySQL知识补充(表字段操作、视图、触发器、事物、存储过程、内置函数、流程控制、索引、慢查询)
今日内容概要 表字段操作补充(掌握) 视图(了解) 触发器(了解) 事务(掌握) 存储过程(了解) 内置函数(了解) 流程控制(了解) 索引(熟悉) 内容详细 1.表字段操作补充 # 1.添加表字段 ...
- 嵌套OOPS导致系统卡死 每个CPU都上报softlockup的问题
问题现象:在ARM服务器上,构造oops异常,本应该产生panic,进入dump流程,并且系统重启,但是系统并未重启,而是出现了卡死,在串口会隔一段时间就循环打印调用栈信息.如下所示 linux-fA ...
- 痞子衡嵌入式:IAR内部C-SPY调试组件配套宏文件(.mac)用法介绍
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR内部C-SPY调试组件配套宏文件(.mac)用法. 痞子衡之前写过一篇 <JLink Script文件基础及其在IAR下调用 ...
- 4、传统三层架构与DDD分层架构
4.传统三层架构与DDD分层架构 模型是抽象的 现实是形象的 技巧是重要的 思想是永恒的 从传统三层架构与DDD分层架构的编程演变其实是思想的演变. 传统三层架构,即用户界面层UI.业务逻辑层BAL. ...
- 羽夏看Win系统内核——消息机制篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- Spring中毒太深,离开了Spring,我居然连最基本的接口都不会写了¯\_(ツ)_/¯
前言 众所周知,Java必学的框架其中就是SSM,Spring已经融入了每个开发人员的生活,成为了不可或缺的一份子. 随着 Spring 的崛起以及其功能的完善,现在可能绝大部分项目的开发都是使用 S ...
- leedcode算法分类
- 什么是unzip 命令?
· 解压 *.zip 文件:unzip test.zip . · 查看 *.zip 文件的内容:unzip -l jasper.zip .
- ThreadPoolTaskExecutor原理、详解及案例
为什么要用线程池? 服务器应用程序中经常出现的情况是:单个任务处理的时间很短而请求的数目却是巨大的. 构建服务器应用程序的一个过于简单的模型应该是:每当一个请求到达就创建一个新线程,然后在新线程中为请 ...
- 【Java】这 35 个 Java 代码优化细节!
前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没 ...