美文网首页Android技术进阶Android技术知识Android开发
Android activity六种数据传递类型+【示例详细解说

Android activity六种数据传递类型+【示例详细解说

作者: 谁动了我的代码 | 来源:发表于2022-11-17 16:50 被阅读0次

    概述

    在开发中,我们经常涌用到Activity,那么既然用到了Activity,就一定免不了在两个或者多个Activity之间传递数据。这里我们先说一说原理,然后在看看代码和例子。

    情况A:我们需要从Activity_1启动并传递数据到Activity_2,Activity_2只需要接收来自Activity_1 的数据,但并不用做其他操作。

    情况B:我们需要从Activity_1 启动Activity_2,同时希望Activity_2在销毁的时候向Activity_1传递数据。

    首先我们来说一说情况A。

    • 情况A是比较简单的,其实就Activity_1利用Intent的putExtra();方法来携带数据,然后Activity_2通过Intent的getExtra()方法来获取Activity_1传递过来的数据。
    • 情况B比较麻烦一点点,但也是很简单。就是利用startActivityForResult()这个方法来启动Activity_2,然后Activity_2在利用Intent和setResult()方法来向Activity_1传送数据,最后,Activity_1通过回调方法onActivityResult()来接收Activity_2数据。

    我们先来看看运行截图吧


    然后我们看看代码,由于布局文件很简单。这里就不贴出布局文件了。就看看两个Activity的代码

    package app.linfeng.com.myapplication;
    
    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
    
        private Button bt_next;
        private Button bt_nextforreustl;
    
          @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            bt_next = (Button) findViewById(R.id.bt_next);
            bt_nextforreustl = (Button) findViewById(R.id.bt_nextforresult);
    
            bt_next.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    /**
                     * 通过intent携带数据,传递给下一个活动
                     */
                    Intent intent = new Intent(MainActivity.this,SecondAcitvity.class);
                    intent.putExtra("data","这个送给SecondActivity的礼物");
                    startActivity(intent);
                }
            });
    
            /**
             * 跳转到SecondActivity,并希望SecondActivity在销毁的时候放回数据
             *
             * */
            bt_nextforreustl.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this,SecondAcitvity.class);
                    /**
                     * 请求码唯一就可以了。这里传入1
                     */
                    startActivityForResult(intent,1);
                }
            });
    
    }
        /**
         * 这个方法用于接收SecondActivty在销毁的时候回调的方法
         */
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
            switch (requestCode){
                case 1:
                    if(resultCode == RESULT_OK){
                        String str = data.getStringExtra("GiveData");
                        Toast.makeText(MainActivity.this,str,Toast.LENGTH_SHORT).show();
                    }
                    break;
                default:
            }
        }
    }
    package app.linfeng.com.myapplication;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class SecondAcitvity extends AppCompatActivity {
    
        private Button bt_showData;
        private Button bt_giveData;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second_acitvity);
    
            bt_showData = (Button) findViewById(R.id.bt_showdata);
            bt_giveData = (Button) findViewById(R.id.bt_backdata);
    
            /**
             * 通过intent来接收上一个活动传递过来的数据
             */
            Intent intent = getIntent();
            final String str = intent.getStringExtra("data");
            if(str==null){
                bt_showData.setEnabled(false);
                bt_giveData.setEnabled(true);
            }else{
                bt_showData.setEnabled(true);
                bt_giveData.setEnabled(false);
            }
    
            bt_showData.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(SecondAcitvity.this,str,Toast.LENGTH_SHORT).show();
                }
            });
    
            /**
             * 给MainActivyt回赠礼物
             */
            bt_giveData.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent();
                    intent.putExtra("GiveData","这是回赠给MainActivity的礼物");
                    setResult(RESULT_OK,intent);
                    finish();
                }
            });
    
        }
    
        /**
         * 用户点击放回键盘的时候需要返回数据
         */
        @Override
        public void onBackPressed() {
            Intent intent = new Intent();
            intent.putExtra("GiveData","这是回赠给MainActivity的礼物");
            setResult(RESULT_OK,intent);
            finish();
        }
    
    }
    

    看到这里,相信大家也都清楚了吧。

    Android Activity之间传递数据的6种方式

    使用Inten的putExtra传递

    第一个Activity中

    //创建意图对象
     Intent intent = new Intent(this,TwoActivity.class);
     //设置传递键值对
     intent.putExtra("data",str);
     //激活意图
     startActivity(intent);
    

    第二个Activity中

    // 获取意图对象
     Intent intent = getIntent();
     //获取传递的值
     String str = intent.getStringExtra("data");
     //设置值
     tv.setText(str);
    

    使用Intention的Bundle传递

    第一个Activity中

    //创建意图对象
     Intent intent = new Intent(MainActivity.this,TwoActivity.class);
     //用数据捆传递数据
     Bundle bundle = new Bundle();
     bundle.putString("data", str);
     //把数据捆设置改意图
     intent.putExtra("bun", bundle);
     //激活意图
     startActivity(intent);
    

    第二个Activity

    //获取Bundle
     Intent intent = getIntent();
     Bundle bundle = intent.getBundleExtra("bun");
     String str = bundle.getString("data");
     tv.setText(str);
    

    使用Activity销毁时传递数据

    第一个Activity中

      Intent intent = new Intent(MainActivity.this,TwoActivity.class);
      //用一种特殊方式开启Activity
     startActivityForResult(intent, 11);
    //设置数据
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     super.onActivityResult(requestCode, resultCode, data);
     String str = data.getStringExtra("data");
     tvOne.setText(str);
    }
    

    第二个activity中

    //设置返回的数据
     Intent intent = new Intent();
     intent.putExtra("data", edtOne.getText().toString().trim());
     setResult(3, intent);
     //关闭当前activity
     finish();
    

    SharedPreferences传递数据

    第一个Activity中

    SharedPreferences sp = this.getSharedPreferences("info", 1);
     //获取sp编辑器
     Editor edit = sp.edit();
     edit.putString("data", str);
     edit.commit();
     //创建意图对象
     Intent intent = new Intent(MainActivity.this,TwoActivity.class);
     //激活意图
     startActivity(intent);
    

    第二个Activity中

    SharedPreferences sp = this.getSharedPreferences("info", 1);
     //设置数据
     tv.setText(sp.getString("data", ""));
    

    使用序列化对象Seriazable

    工具类

    import java.io.Serializable;
    class DataBean implements Serializable {
     private String name;
     private String sex;
     public String getName() {
     return name;
     }
     public void setName(String name) {
     this.name = name;
     }
     public String getSex() {
     return sex;
     }
     public void setSex(String sex) {
     this.sex = sex;
     }
    }
    

    第一个Activity

    //创建意图
     Intent intent = new Intent(MainActivity.this,TwoActivity.class);
     DataBean bean = new DataBean();
     //通过set方法把数据保存到DataBean对象中
     bean.setName("啦啦");
     bean.setSex("男");
     intent.putExtra("key", bean);
     startActivity(intent);
    

    第二个Activity

    Intent intent = getIntent();
     //反序列化数据对象
     Serializable se = intent.getSerializableExtra("key");
     if(se instanceof DataBean){
      //获取到携带数据的DataBean对象db
      DataBean db = (DataBean) se;
      tv.setText(db.getName()+"==="+db.getSex());
     }
    

    使用静态变量传递数据

    第一个Activity

    Intent intent = new Intent(MainActivity.this,TwoActivity.class);
      TwoActivity.name="牛逼";
      TwoActivity.str="你说";
      startActivity(intent);
    

    第二个Activity

    //静态变量
    protected static String name;
    protected static String str;
    tv.setText(str+name);
    

    以上所述是给大家介绍的关于Android Activity之间传递数据的6种方式,希望对大家有所帮助,如果大家有任何疑问或者想在Android开发中继续进阶自己的,可以参考获取《Android核心技术PDF》学习,里面内容包含30 多个技术文档,供大家学习进步。

    文末

    基本数据类型传递

    String 不是基本数据类型,Java 的基本数据类型有且仅有8种,Intent 都做了很好的支持。这8种基本类型都有自己的包装类型(Wrap Class,复杂类型),而且包装类型也实现了 Serializable 接口(后面再说),使得 Intent 也能很好<typo id="typo-7751" data-origin="的" ignoretag="true">的</typo>支持包装类型。 8种基本类型及其包装类对应关系如下:

    相关文章

      网友评论

        本文标题:Android activity六种数据传递类型+【示例详细解说

        本文链接:https://www.haomeiwen.com/subject/iznyxdtx.html