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了

posted @ 2022-04-09 20:13  虞美人体重90  阅读(99)  评论(0编辑  收藏  举报