Android 学习之路 1:如何在Activity之间传递数据

简介:

传递数据

  • 新建 Activity

在项目中右键,选择 New,继续选择中下方的 Activity,最后是 Blank Activity。

此时 Android Studio 会为我们自动添加一个对应的布局文件,为布局文件中的 TextView 添加 ID,以便后续使用。

  • 用Intent 发送数据

在主布局文件中新建一个 Button 控件,并在主类中定义它,然后为它设置 Click 的监听事件。

    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this,Main2Activity.class);
                i.putExtra("Thanks","Thank you for reading my blog.");
                startActivity(i);
            }
        });
    }
  • 用 Intent 接收数据

接下来再之前创建的 Activity 中同样新建一个 Intent 进行接受即可。和发送试用的 putExtra 类似,接受也可以用 getStringExtra 。当然了,正对不同的数据类型可以用不同的方法。

private TextView tv;                                 

@Override                                            
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);              
    setContentView(R.layout.activity_main2);         

    Intent i = getIntent();                          
    tv = (TextView)findViewById(R.id.tv);            
    tv.setText(i.getStringExtra("Thanks"));          
}                                                                                            

传递 Bundle 包

在两个 Activity 之间也可以用 Bundle 包来进行数据的传递,相比上一种方式,这一种可以包含更多的数据,你可以将其认为是一个集合,这也正符合“包”的概念。

  • 新建 Bundle

  • Bundle 可以嵌套 Bundle

  • 对 Intent 对象使用 putExtras 方法

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(MainActivity.this,Main2Activity.class);
            Bundle a = new Bundle();
            a.putString("Thanks", "Thank you for reading my blog.");
            Bundle b = new Bundle();
            b.putString("Android","Google");
            b.putString("Windows","Microsoft");
            a.putBundle("bundle",b);
            i.putExtras(a);
            startActivity(i);
        }
    });
}
  • 根据相应的 Key 值获取相应的Bundle数据
@Override                                                                       
protected void onCreate(Bundle savedInstanceState) {                            
    super.onCreate(savedInstanceState);                                         
    setContentView(R.layout.activity_main2);                                    

    Intent i = getIntent();                                                     

    Bundle a2 = i.getExtras();                                                  

    tv = (TextView)findViewById(R.id.tv);                                       

    tv.setText(String.format("%s Android属于%s,Windows属于%s",                      
            a2.getString("Thanks"),                                             
            a2.getBundle("bundle").getString("Android"),                        
            a2.getBundle("bundle").getString("Windows")));                      
}                                                                               

传递自定义对象

Android 开发过程中自然少不了“类”了,那么这种数据又如何传输呢。

  • 切记:一定要执行序列化,即加上“implements Serializable”
public class Source implements Serializable{
    private int source;
    private String ID;

    public int getSource() {
        return source;
    }

    public void setSource(int source) {
        this.source = source;
    }

    public String getID() {
        return ID;
    }

    public void setID(String ID) {
        this.ID = ID;
    }

    public Source(String ID, int source) {
        this.source = source;
        this.ID = ID;
    }
}

相应有了前面的了解,大家都可以直接猜到如何使用了,那我就不再啰嗦了。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(MainActivity.this,Main2Activity.class);
            i.putExtra("source",new Source("Player",1000));
            startActivity(i);
        }
    });
}
@Override                                                     
protected void onCreate(Bundle savedInstanceState) {          
    super.onCreate(savedInstanceState);                       
    setContentView(R.layout.activity_main2);                  

    Intent i = getIntent();                                   

    Source s = (Source) i.getSerializableExtra("source");     

    tv = (TextView) findViewById(R.id.tv);                    

    tv.setText(String.format("ID是%s,得分是%d",                   
            s.getID(), s.getSource()));                       
}                                                             

从Activity返回数据

用户需要与应用进行交互,应用需要将用户输入的数据进行返回,所以……

在主 Activity 中定义 Button 和 TextView,前者用于导航至次 Activity , 后者用于显示返回的数据。

在次 Activity 中定义 Button 和 EditText,前者用于确认并返回至主 Activity,后者用于用户输入。

在次 Activity 中:

  • 同样用 Intent 传递数据

  • 用 setResult 设置返回结果

  • 最后用 finish

private Button button ;                                         
private EditText editText;                                      

@Override                                                       
protected void onCreate(Bundle savedInstanceState) {            
    super.onCreate(savedInstanceState);                         
    setContentView(R.layout.activity_main2);                    

    editText = (EditText)findViewById(R.id.editText);           
    button = (Button)findViewById(R.id.button2);                
    button.setOnClickListener(new View.OnClickListener() {      
        @Override                                               
        public void onClick(View v) {                           
            Intent i = new Intent();                            
            i.putExtra("info",editText.getText().toString());   
            setResult(0, i);  // 0表示成功                          
            finish();                                           
        }                                                       
    });                                                         
}                                                               

在主 Activity 中:

  • 用 startActivityForResult 进行导航,并请求结果
    private Button button;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView)findViewById(R.id.textView);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this,Main2Activity.class);

                startActivityForResult(i,0);
            }
        });
    }
  • 重载 onActivityResult 方法,并通过 data 参数获取数据。
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        textView.setText(data.getStringExtra("info"));
    }

好了,Activity 之间就是这么传递数据的……

零点半了……睡觉……

目录
相关文章
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1408 4
|
8月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
540 11
|
10月前
|
存储 XML Java
Android 文件数据储存之内部储存 + 外部储存
简介:本文详细介绍了Android内部存储与外部存储的使用方法及核心原理。内部存储位于手机内存中,默认私有,适合存储SharedPreferences、SQLite数据库等重要数据,应用卸载后数据会被清除。外部存储包括公共文件和私有文件,支持SD卡或内部不可移除存储,需申请权限访问。文章通过代码示例展示了如何保存、读取、追加、删除文件以及将图片保存到系统相册的操作,帮助开发者理解存储机制并实现相关功能。
2468 2
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
846 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
Java Maven 开发工具
第一个安卓项目 | 中国象棋demo学习
本文是作者关于其第一个安卓项目——中国象棋demo的学习记录,展示了demo的运行结果、爬坑记录以及参考资料,包括解决Android Studio和maven相关问题的方法。
289 7
第一个安卓项目 | 中国象棋demo学习
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
303 6
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
355 3
|
缓存 前端开发 Android开发
Android实战之如何截取Activity或者Fragment的内容?
本文首发于公众号“AntDream”,介绍了如何在Android中截取Activity或Fragment的屏幕内容并保存为图片。包括截取整个Activity、特定控件或区域的方法,以及处理包含RecyclerView的复杂情况。
317 3
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
190 0
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
777 0

热门文章

最新文章