天天看点

Activity的跳转和数据传递

显示跳转和隐式跳转

  • 显示跳转
public void onClick(View view) {
                //Intent intent = new Intent();
                //显式1
                //intent.setClass(AActivity.this,BActivity.class);
                //显式2
                //intent.setClassName(AActivity.this,"com.example.test.jump.BActivity");
                //显式3
                //intent.setComponent(new ComponentName(AActivity.this,"com.example.test.jump.BActivity"));
                //显式4,最常用
                Intent intent = new Intent(AActivity.this,BActivity.class);
                startActivity(intent);
                
            }
           
  • 隐式跳转
  1. 在activity.java中如下设置,记住setAction中的字符串
Intent intent = new Intent()
intent.setAction("com.b.jump");
startActivity(intent);
           
  1. 在AndroidManifest文件中要跳转到的目标activity标签中添加如下子标签,action中的name属性值就是之前setAction中写的那个。category的name值也要做如下修改
<intent-filter>
     <action android:name="com.b.jump" />
     <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
           
intent.setAction还可以调用一些系统的组件,比如打电话,发邮件,摄像头等等

activity之间的数据传递

  • 数据的绑定:Bundle类

    通过put对应的方法绑定数据,数据是键值对的形式绑定的,绑定的数据可以是各种类型string/int/数组等等,比如

    void putString( String key,String value);

    void putInt( String key, int value) ;

  • bundle设置到intent
    1. intent.putExtra(key,value): 给bundle绑定一个key,键值对的形式放进去,相应的读取时就用intent.getExtra(key)
    2. inten.putExtras(bundle):这样可以直接放bundle进去,读取的时候就用intent.getExtras()方法
//绑定数据
                Bundle bundle = new Bundle();
                bundle.putString("name","德华");
                bundle.putInt("age",18);
                //将bundle放进intent中
                intent.putExtras(bundle);
                startActivity(intent);
           
  • 数据的读取

    读取的方法根据绑定的时候用的方法来

Button btnB = findViewById(R.id.btn_b);
        //获取intent
        Intent intent = getIntent();
        //获取bundle
        Bundle bundle = intent.getExtras();
        //获取绑定数据
        String name = bundle.getString("name");
        int age = bundle.getInt("age");
           

startActivityForResult:启动Activity,结束后返回结果

前面的是跳转时绑定数据,而这里是按返回键时绑定数据到另一个页面,不同的需求。

  • startActivityForResult(Intent, int)

    第一个参数Intent,和普通的startActivity()里的Intent一样,里面放要请求的Activity和可能需要放的数据。

    第二个参数int,是一个请求代码,整型的,这个可以自己随便定义,但这个数要大于等于0才行。因为MainActivity有可能会跳转到多个页面,如果这几个页面使用完之后,都需要返回一些信息,那么就必须要有个标识符来表示返回来过的是哪个页面的信息。

  • setResult(int),setResult(int, Intent)

    第一个参数int,是一个返回代码,整型的,这个也是自己随便定义,用来表示这个页面执行之后是个什么情况,是成功还是失败了,还是其它什么的,反正返回一个整型数,自己知道它的含义就行了。这个数据在Activity类中有常量可以用。

    第二个可选参数是一个Intent,可以用来存放数据。

  • void onActivityResult(int requestCode, int resultCode, Intent data)

    这个方法是请求的Activity完成任务被finish()之后,会调用这个,前提是,你启动那个Activity是通过startActivityForResult()来启动的。

    第一个参数int,是请求代码,就是startActivityForResult()里面的请求代码。

    第二个参数int,是返回代码,就是setResult()方法里面的设置的参数。

    第三个参数Intent,就是setResult(int, Intent)里面的放置数据的Intent。

案例

  • AActivity初始页面:
package com.example.test.jump;

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

import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.example.test.R;
import com.example.test.util.ToastUtil;

public class AActivity extends AppCompatActivity {
    private Button btnA;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);
        btnA = findViewById(R.id.btn_a);
        btnA.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Intent intent = new Intent();
                //显式1
                //intent.setClass(AActivity.this,BActivity.class);
                //显式2
                //intent.setClassName(AActivity.this,"com.example.test.jump.BActivity");
                //显式3
                //intent.setComponent(new ComponentName(AActivity.this,"com.example.test.jump.BActivity"));
                //显式4,最常用
//                Intent intent = new Intent(AActivity.this,BActivity.class);
                 //隐式跳转,需要在AndroidManifest文件中配置
                Intent intent = new Intent();
                intent.setAction("com.b.jump");
                //绑定数据
                Bundle bundle = new Bundle();
                bundle.putString("name","德华");
                bundle.putInt("age",18);
                //将bundle放进intent中
                intent.putExtras(bundle);
                // startActivity(intent);
                //另一种跳转方式,附带请求码,等转发过去的页面finish的时候绑定的数据也会带着这个码,就知道数据是要传给这个页面的
                startActivityForResult(intent,0);

            }
        });
    }
/**
     * 当跳转到的页面finish时就会触发这个方法,在里面可以得到传过来的数据
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        ToastUtil.showMsg(AActivity.this,data.getExtras().getString("B"));
    }
}

           
  • BActivity:跳转到的页面
package com.example.test.jump;

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

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.example.test.R;
import com.example.test.util.ToastUtil;

public class BActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R. layout.activity_b);
        Button btnB = findViewById(R.id.btn_b);
        //获取intent
        Intent intent = getIntent();
        //获取bundle
        Bundle bundle = intent.getExtras();
        //获取绑定数据
        String name = bundle.getString("name");
        int age = bundle.getInt("age");
        ToastUtil.showMsg(BActivity.this,"A中绑定的数据:"+name+":"+age);

        btnB.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                Bundle bundle1 = new Bundle();
                bundle1.putString("B","B中绑定的数据");
                intent.putExtras(bundle1);
                setResult(Activity.RESULT_OK,intent);
                //finish用于结束Activity的生命周期,会调用onDestroy方法.其结果和用户按下返回键是一样的
                finish();
            }
        });
    }

}