android activity之间传递对象,Android Activity之间的数据传递

一、通过startActivity来进行Activity的传值

在Android中,如果我们要通过一个Activity来启动另一个Activity,可以使用 startActivity(Intent intent)方法来传入一个Intent对象,这个Intent对象我们可以精确的指定我们需要跳转的Activity上,或者通过Intent对象来指定我们要完成的一个action操作,同时我们可以通过intent来携带一些值,进而来Activity见跳转的时候也可以把值传过去。通过setClass方法来指定我们要跳转的ActivityIntent intent=new Intent(this,SecondActivity.class);

intent.putExtra(key,value);

startActivity(intent);

//或者

Intent intent=new Intent();

intent.setClass(MainActivity.this,SecondActivity.class);

intent.putExtra(key,value);

startActivity(intent);通过setAction方法来我们要完成的一个action操作Intent  intent = new Intent();

intent.setAction("com.example.android_intent.second");

intent.putExtra(key,value);

startActivity(intent);

通过这种方式可以来指定我们的Intent对象要完成某个操作,这个操作可以是启动一个Activity,我们可以在AndroidManifest.xml中在

这样我们的Intent对象,在启动时,就会找到名字为 com.example.android_intent.second 的

我们来看看如何在Activity对象中进行值的传递,也是通过 Intent 对象的各种putExtra方法来进行传递:

MainActivity:Intent intent=new Intent(this,SecondActivity.class);

intent.putExtra("nv_name","小龙女");

Bundle bundle=new Bundle();

bundle.putString("nan_name","杨过");

intent.putExtra("bundle",bundle);

startActivity(intent);

SecondActivity:Intent intent = getIntent();

textView1.setText(intent.getStringExtra("nv_name"));

Bundle bundleExtra = intent.getBundleExtra("bundle");

textView2.setText(bundleExtra.getString("nan_name"));

第二个Activity对象中,可以通过 getIntent() 方法来得到跳转到这个Activity的Intent对象,然后通过 Intent 对象的各种 getXXExtra 方法来得到我们的传过来的值。这样我们就可以实现Activity之间的传值。这里插入一句题外话,Intent传值与Bundle传值有什么区别?

二、通过startActivityForResult方法来得到Activity的回传值

在一些情况下,我们通过 A activity跳转到 B activity上,这时希望 A activtiy能从 B activity上得到一些返回值,这个时候我们就不能使用startActivity方法了,而是使用 startActivityForResult方法来完成我们的操作。这样的场景在实际开发中还是很常见的,比如说A activity中做了一个查询的功能,查询向后台请求数据假设需要传入一个时间字段,不传的话默认是当前时间,B activity中可以设置时间,那我们就可以在根据B activity 传回来的时间,在A activity 中就会有不同的查询结果。

下面我们来模拟完成下提的需求:

MainActivity:package com.example.activitytest;

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.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private Button button;

private TextView textView;

private int REQUEST_GET_TIME=0;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

button= (Button) findViewById(R.id.btn_click);

textView= (TextView) findViewById(R.id.tv_time);

button.setOnClickListener(this);

}

@Override

public void onClick(View view) {

//        Intent intent=new Intent();

//        intent.setClass(MainActivity.this,SecondActivity.class);

//        startActivity(intent);

Intent intent=new Intent(this,SecondActivity.class);

//第一个参数是Intent对象,第二个requestCode指定我们的一个启动标志值,因为我们可能有多个按钮,如果都是跳转到同一个Activity对象上,

//我们需要对其进行标志,才知道是哪个Activity对象跳转过来的。

startActivityForResult(intent,REQUEST_GET_TIME);

}

/**

* 所有的Activity对象的返回值都是由这个方法来接收

* requestCode    If >= 0, this code will be returned in onActivityResult() when the activity exits.

* @param requestCode 表示的是启动一个Activity时传过去的requestCode值

* @param resultCode 表示的是启动后的Activity回传值时的resultCode值

* @param data 表示的是启动后的Activity回传过来的Intent对象

*/

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if(requestCode==REQUEST_GET_TIME&&resultCode==RESULT_OK){

textView.setText(data.getStringExtra("cur_time"));

}

}

}

SecondActivity:package com.example.activitytest;

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.widget.TextView;

import java.text.SimpleDateFormat;

import java.util.Date;

public class SecondActivity extends AppCompatActivity {

private TextView textView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_second);

textView= (TextView) findViewById(R.id.tv_cur_time);

String curTime=getCurTime();

textView.setText(curTime);

Intent intent=new Intent();

intent.putExtra("cur_time",curTime);

setResult(RESULT_OK,intent);

this.finish();

}

private String getCurTime() {

long currentTimeMillis = System.currentTimeMillis();

SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy年MM月dd日 HH:mm");

return simpleDateFormat.format(new Date(currentTimeMillis));

}

}

下面是效果图:

38039fc61ebca807ba09fdaec2575ce6.png

另外需要提到的是,上面都是传一些系统自带的数据类型,如果想传一个对象或者对象的数组怎么办呢?还是可以用Intent传值,不过要对传递的对象作一些特殊处理,可以参考这篇博客: intent可以传递的数据类型

三、先把数据存在本地,然后在下一个Activity中从本地取。

这种方式涉及到数据存储,Android数据的四种持久化存储方式SharedPreferences、SQLite、Content Provider和File,该方式的缺点就是要占用本地的资源,优点是数据可以在多个Activity之间共享。关于这种Activity之间的传值以后会专门写一篇博客介绍,这里先谈下Activity之间传值的几种方式的主线。这里推荐一篇博客,可以大概了解下Android的几种数据存储方式

四、使用EventBus框架

越来越多的项目开发中使用到EventBus这个框架,那什么是EventBus呢?用github开源文档上的介绍就是:一个Android平台的事件总线框架, 它简化了Activity、Fragment、Service等组件之间的交互,很大程度上降低了它们之间的耦合,使得我们的代码更加简洁,耦合性更低,提升我们的代码质量。

开发中我们都知道,很多时候要在Activty与Activty间,Activty与Fragment等之间传递数据进行交互,操作起来很不方便,我们以前可能会用到接口回调,或是用观察者模式来实现,或是发广播等等。这们操作不仅仅代码量大,而且代码耦合性高,性能不佳,也不便于维护。例如:两个Fragment之间的通信你会怎么实现? 按照Android官方给的建议的解决方法如下: Communicating with the Activity,思路就是Activity实现某个接口,然后在Fragment-A关联上Activity之后将Activity强转为接口类型,然后在某个时刻Fragment中回调这个接口,然后再从Activity中调用Fragment-B中方法。这个过程是不是有点复杂呢? 如果你也这么觉得,那也就是你继续看下去的理由了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[UE4]更新UI的三种方式

一、函数绑定 二、属性绑定 只会列出匹配的数据类型。 三、事件驱动更新 啦啦啦啦啦 结论:函数和属性绑定的原理都是每帧都去调用绑定的函数/属性,效率比较低下,一般不推荐使用。事件驱动更新的效率最好,性能最好。 在正式的产品开…

使用handler倒计时

点击button暂停 public class MainActivity extends AppCompatActivity {BindView(R.id.button)Button button;BindView(R.id.first_textview)TextView textView;Handler mHandler;volatile boolean flagtrue;Object objectnew Object();MThread mThread;Overrideprotected voi…

android实现3种定位的切换,Android 滑动定位+吸附悬停效果实现

在前两篇文章中,分别介绍了tablayoutscrollview 和 tablayoutrecyclerview 实现的滑动定位的功能,文章链接:Android 实现锚点定位Android tabLayoutrecyclerView实现锚点定位仔细看的话,这种滑动定位的功能,还可以整体…

unity mmd不支持android,MMD模型导入Unity的解决方案

前言学了Unity后,总是感觉缺少资源,包括人物、物品模型、动作数据、贴图、特效,各种插件,还被骗去学了几天各种美术软件。说起模型和动作数据,就又想到MMD,毕竟有那么现成的资源,虽然不能商用&a…

android中的 listview,Android中ListView的初步认识(一)

ListView是安卓开发中常用的组件之一,它的作用是在一个垂直的列表中展现出所需的项目。接下来,我们看一下ListView的实现方法:第一种 是常见的在XML中定义然后在activity中使用findViewById来获取的方式(这个相当基础了,直接代码)…

android开发app初始化,安卓快速开发框架(一)XBaseAndroid初始化使用

XBaseAndroid如果您需要使用最新版可以去github查看。该文章描述的是1.0.9.4版本。使用AndroidStudio 3.0创建一个新的安卓项目如果您不知道如何创建,请猛戳此处。配置仓库引用项目结构.png点击build.gradle(Project),添加以下maven仓库。allprojects {r…

Python之模块与包(下)

1、什么是包 #官网解释 Packages are a way of structuring Python’s module namespace by using “dotted module names” 包是一种通过使用‘.模块名’来组织python模块名称空间的方式。 #具体的:包就是一个包含有__init__.py文件的文件夹,所以其实我…

接口测试学习——操作MySQL

第一步要导入第三方的jar包。(jemeter不能直接连接MySQL) 操作方法就是点击“测试计划”,右侧展开的页面中选择【浏览】,选择MySQL的jar包。导入即可。 第二步:创建数据库链接的配置:MySQL的路径URL、端口号…

html5网页自动滚动,Html5 滚动穿透的方法

问题背景:网站需要在移动端完成适配,针对移动端H5以及web端采用的都是bluma这种flex布局解决方案在H5中使用的列表采用的是 react-virtualized 来绘制表格为了展示表格中单行数据的具体详情,通常的解决方案是采用新页面或者是弹窗来完成。这里采用的是弹…

mac如何看html5视频播放器,苹果Mac系统看HTML5视频教程介绍

上一回,小编教了大家一个Mac用 HTML5 免费看优酷和土豆等付费视频,这回小编又找到一个用HTML5看视频的好方法,很多很好用的资源,你可以在Mac上看各种地方台的直播以及乐视、凤凰卫视、TVB、东森等港澳台电视节目哦!大部…

html中设置负边距的意义,css负边距之详解

自从1998年CSS2作为推荐以来,表格的使用渐渐退去,成为历史。正因为此,从那以后CSS布局成为了优雅代码的代名词。对于所有设计师使用过的CSS概念,负边距作为最少讨论到的定位方式要记上一功。这就像是在线纹身-每个人都会做&#x…

warning: expression result unuesd 可能原因是函数忘了加括号,

转载于:https://www.cnblogs.com/chulin/p/9082833.html

vue基础18(vue-cli脚手架项目中组件的使用)

vue-cli脚手架项目中组件的使用 在webpack-simple模板中,包括webpck模板。一个.vue文件就是一个组件。 为什么会这样呢?因为webpack干活了!webpack的将我们所有的资源文件进行打包。同时webpack还能将我们的html(template&#xf…

js和layerjs配合实现的拖拽表格列

前几天想着实现表格列的拖拽 写了个例子 一直不完美 经过修改感觉还算完美了 拖拽过程不会复制文字并且还能实现layerjs本身自带的表格排序功能。 1、首先引入layer.css jquery layui.all.js 2、布局页面 <div class"divT"> <table class"l…

计算机应用中的CAI,????按计算机应用的分类,CAI应属于()应用。

按计常见的企业法律组织形式有()&#xff1f;算机属于recoil固有的、应用I应应用本来的按计cant help but算机属于Destruction of the original forest leads to the ___ of many plants.应用I应应用flocks of的同义词按计Many birds ___ southeast in winter.支持、算机属于供…

(tmp 8) 0xff;

以下是阅读他人文章后&#xff0c;个人对计算 (tmp >> 8) & 0xff; 的理解&#xff1a; 将tmp转为二进制数 6322040->11000000111011101111000,向右移16位&#xff08;清掉该16位&#xff09;&#xff0c;且左边用0补足16位 00000000000000001100000&#xff0c;将…

请对比html与css的异同,css3与css2的区别是什么?

CSS为HTML标记语言提供了一种样式描述&#xff0c;定义了其中元素的显示方式。CSS在Web设计领域是一个突破。利用它可以实现修改一个小的样式更新与之相关的所有页面元素。CSS2.0是一套全新的样式表结构&#xff0c;是由W3C推行的&#xff0c;同以往的CSS1.0或CSS1.2完全不一样…

MySQL数据导入导出(一)

今天遇到一个需求&#xff0c;要用自动任务将一张表的数据导入另一张表。具体场景及限制&#xff1a;将数据库A中表A的数据导入到数据库B的表B中&#xff08;增量数据或全量数据两种方式&#xff09;&#xff1b;体系1和体系2只能分别访问数据库A和数据库B。附图&#xff1a; 实…

360桌面计算机,360桌面管理软件

360桌面管理是从360安全卫士中单独提取出来&#xff0c;让你无需安装360安全卫士就能快速使用桌面助手整理自己的桌面。【功能特色】1、一键整理桌面&#xff0c;眨眼之间变清爽360桌面助手采用收纳盒进行分类管理&#xff0c;支持一键整理电脑桌面&#xff0c;用户只要点击“桌…

基于51的串行通讯原理及协议详解(uart)

串行与并行通讯方式 并行&#xff1a;控制简单&#xff0c;传输速度快。线多&#xff0c;长距离成本较高且同时接受困难。 串行&#xff1a;将数据字节分成一位一位的行驶在一条传输线上进行传输。如图&#xff1a; 同步与异步串行通讯方式 同步串行通讯方式&#xff1a;同步…