【Android开发日记】之入门篇(十二)——Android组件间的数据传输
组件我们有了,那么我们缺少一个组件之间传递信息的渠道。利用Intent做载体,这是一个王道的做法。还有呢,可以利用文件系统来做数据共享。也可以使用Application设置全局数据,利用组件来进行控制数据。
一、Intent数据传递
- 那么首先是简单的跳转。我们可以借助bundle这个容器来存放我们想要传递的数据。
Intent intent = new Intent();
intent.setClass(activity1.this, activity2.class); //描述起点和目标
Bundle bundle = new Bundle(); //创建Bundle对象
bundle.putString("tag", "Activity1发来的数据"); //装入数据
intent.putExtras(bundle); //把Bundle塞入Intent里面
startActivity(intent); //开始切换另一个接受数据
Intent intent = this.getIntent(); //获取已有的intent对象
Bundle bundle = intent.getExtras(); //获取intent里面的bundle对象
string = bundle.getString("tag"); //获取Bundle里面的字符串 - 那么接下来是如何接受从目标Activity返回的处理结果。这里有两种方式,一是在onRestart方法里面接受处理结果,方法实现和Activity2接受从Activity1发来的数据处理一样。另一种方式,是采用应答模式切换。这里,主要下第二种方式。应答模式切换和普通的切换不同在于,普通的是有去没回,应答则是有来有往。代码实现也不一样:
从Activity1 切换到Activity2:startActivityForResult(intent,0);从Activity2返回到 Activity1:setResult(RESULT_OK, intent)。接受返回结果:protected void onActivityResult()。具体代码如下:
发送方:Intent intent = new Intent();
intent = intent.setClass(Activity1.this, AnotherActivity.class);
Bundle bundle = new Bundle();
bundle.putString("string","cpacm");
intent.putExtras(bundle);
startActivityForResult(intent,0); //只有这里不同,这里的0是请求码,用于返回数据的识别
//Activity1.this.finish(); //不能用finish,会触发onDestroy();接收方:
Intent intent = new Intent();
intent = intent.setClass(AnotherActivity.this, Activity1.class);
Bundle bundle = new Bundle();
bundle.putInt("result", "Activity2的处理结果");
intent.putExtras(bundle);
AnotherActivity.this.setResult(RESULT_OK, intent); //RESULT_OK是返回状态码
AnotherActivity.this.finish(); //会触发onDestroy();发送方接受消息:(其中requestCode是请求码,可以根据请求码的不同来区分不同的处理模块)
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(resultCode) { //根据状态码,处理返回结果
case RESULT_OK:
Bundle bundle =data.getExtras(); //获取intent里面的bundle对象
String result = bundle.getInt("result");
break;
default:
break;
} }
二、文件系统做数据共享
- 通过 Context.getSharedPreferences(String fileName,int mode)方法,可以打开一个xml文件,文件的位置在/data/data/package_name/shared_prefs /fileName.xml,如果不存在,则会自动创建。可以对该文件进行读写操作,在应用内的各组件之间共享数据。如果将mode设置为 Context.MODE_WORLD_READ或者Context.MODE_WORLD_WRITE,则还可以被其他应用访问到。不过这不是 android推荐的方式,要实现跨应用共享数据,推荐的方式是用ContentProvider实现 。具体实现方法可以看以前写的文章Android数据存储(上)和Android数据存储(下)。
- 除了比较方便的shared_prefs,也可以创建自定义文件,方法是Context.openFileOutput(),可以在/data/data /package_name/files/目录下创建指定的文件,除此以外,和上面提到的shared_prefs都一样。不过操作起来就复杂一些了。要 读取用这种方式创建的文件,可以用Context.openFileInput()方法。
- 此外,还可以在SD卡上操作文件,通过标准的java.io包内的API就可以。不过要注意的是,SD卡内采用的是FAT文件系统,所以不支持linux 的文件读写权限控制,这点和shared_prefs与file不太一样。如果需要对文件进行读写权限控制,就不能采用写入SD卡的方式。
- 也可以用android自带的SQLite数据库来做数据持久化,主要用到的类包括SQLiteOpenHelper和SQLiteDatabase。
三、Application设置全局数据
在java中,我们使用全局变量时一般都会使用静态变量,然后public类型,让所有类都可以使用这些变量。当然在Android也可以这样做。不过在这里说的是我们可以使用Application来管理这些变量。Application类是一个基类,这个基类的作用是为了获取整个应用程序的状态。 我们可以自己继承或实现这个类,当你要使用自己拓展的application类的时候,只要在manifest.xml中 的<application>标签中name应用自己定义的类就行了,这样做的结果是:当你的应用程序或者包所在的进程创建的时候,这个类就 会被实例化。
使用的方法很简单,首先继承Application类再去把它重写,主要重写里面的onCreate方法,就是创建的时候,初始化变量的值。然后在整个应用中的各个文件中就可以对该变量进行操作了。
启动Application时,系统会创建一个PID,即进程ID,所有的Activity就会在此进程上运行。那么我们在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局变量的值,换句话说,我们在某一个Activity中改变了这些全局变量的值,
那么在同一个应用的其他Activity中值就会改变。这样我们就达到了控制全局变量的目的。(当然application不仅仅局限于这里,它可以配合开发者设置更多的功能)
下面一个小例子:
public class MyApp extends Application{ private String learn;
public String getLearn(){
return learn;
}
public void setLearn(String s){
this.learn= s;
} @Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
setLearn("cpacm"); //初始化全局变量
}
}
上面就是一个继承了Application类的简单使用,我们只是新建了一个字符串变量。没有全局,也没有静态,要使用它必须要通过MyApp才行。
接下来看看我们怎么使用它:
public class mainActivity extends Activity { private MyYApp myApp; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myApp= (MyYApp) getApplication(); //获得自定义的应用程序YApp
Log.d("TEST", "InitLabel:"+myApp.getLearn()); //将我们放到进程中的全局变量拿出来,看是不是我们曾经设置的值 myApp.setLearn("ahaha"); //修改一下
Log.d("TEST", "ChangeLabel:"+myApp.getLearn()); //看下,这个值改变了没有
}
}
最后在配置文件中注册自己定义的App
<!-- 在这里,将默认的Application设置成自己做的MyApp-->
<application android:name="MyApp" .../>
四、组件控制数据
- 第一个当然是正统的ContentProvider组件了,怎么使用它,请看这篇博文,这里就不再讲述了。Android四大组件之ContentProvider。
- service也可以充当数据控制的组件,毕竟service是在后台运行,当它与Activity绑定时,activity就可以从里面获取数据(前提是service没有被销毁)。详情:Android四大组件之Service
- 广播组件也可以,更可以使用sendOrderedBroadcast(intent, null, BroadcastReceiver(), null, Activity.RESULT_OK, null, null);方法对返回的数据进行处理.这个方法是在原有的广播序列的末尾再加一个广播,并作为最后的一个广播,可以对返回的信息进行处理。详情:Android四大组件之Broadcast Receiver
五、结束语
呼~从写第一篇博文开始,到现在已经一个月了,不知不觉中时间就过去了呢。期间断断续续地写了十几篇博文,不过写的好也罢,写的不好也罢,反正博主感觉自己收获很大,和以前的想要什么功能就去学什么那样片段式的学习相比,现在这种全面学习感觉好多了。
到这里为止,Android入门篇的组件部分就基本上完毕了,当然里面还有很多内容可以深究,这方面要大家自己挖掘了。那么接下来就是Android的控件部分了,额,一想到那么多的控件头都大了,不过基本原理都是相通的,举一反三嘛~好了,如果有什么问题也可以联系我一起探讨学习,最后希望大家Have a good day.
========================================作者:cpacm
出处:(http://www.cpacm.net/2015/03/26/Android开发日记(九)——Android组件间的数据传输/)
【Android开发日记】之入门篇(十二)——Android组件间的数据传输的更多相关文章
- Bootstrap入门(十二)组件6:导航标签页
Bootstrap入门(十二)组件6:导航标签页 1.标签页 2.胶囊式标签页 3.垂直展示 4.两端对齐的标签页 5.禁用的链接 6.添加下拉菜单 先引入本地的CSS文件和JS文件(注:1. ...
- C++入门篇十二
成员变量和成员属性: 静态成员函数和静态成员变量是不属于对象的,所以不占有空间,非静态成员是属于对象的,占有存储空间,空类大小1 #include "pch.h" #include ...
- 【Android开发日记】之入门篇(十四)——Button控件+自定义Button控件
好久不见,又是一个新的学期开始了,为什么我感觉好惆怅啊!这一周也发生了不少事情,节假日放了三天的假(好久没有这么悠闲过了),实习公司那边被组长半强制性的要求去解决一个后台登陆的问题,结果就是把 ...
- 【Android开发日记】之入门篇(七)——Android数据存储(上)
在讲解Android的数据源组件——ContentProvider之前我觉得很有必要先弄清楚Android的数据结构. 数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也 ...
- 【Android开发日记】之入门篇(九)——Android四大组件之ContentProvider
数据源组件ContentProvider与其他组件不同,数据源组件并不包括特定的功能逻辑.它只是负责为应用提供数据访问的接口.Android内置的许多数据都是使用ContentProvider形式,供 ...
- 【Android开发日记】之入门篇(十三)——Android的控件解析
Android的控件都派生自android.view.View类,在android.widget包中定义了大量的系统控件供开发者使用,开发者也可以从View类及其子类中,派生出自定义的控件. 一.An ...
- 【Android开发日记】之入门篇(十一)——Android的Intent机制
继续我们的Android之路吧.今天我要介绍的是Android的Intent. 对于基于组件的应用开发而言,不仅需要构造和寻找符合需求的组件,更重要的是要将组件有机的连接起来,互联互通交换信息,才能够 ...
- 【Android开发日记】之入门篇(一)——开发环境的搭建
写给自己的话:至此,大学的时光已经剩下一年的时光,下一年等毕业设计结束后就算是正式地踏入社会.自己学android也不过几个月的时间,为了更好管理文档,写点东西记录下自己曾经做过的点点滴滴是一个不错的 ...
- 【Android开发日记】之入门篇(八)——Android数据存储(下)
废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基 ...
随机推荐
- 20135239益西拉姆 Linux内核分析 进程的描述和进程的创建
[益西拉姆 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] 第六周 进程的描述 ...
- CJOJ 2482 【POI2000】促销活动(STL优先队列,大根堆,小根堆)
CJOJ 2482 [POI2000]促销活动(STL优先队列,大根堆,小根堆) Description 促销活动遵守以下规则: 一个消费者 -- 想参加促销活动的消费者,在账单下记下他自己所付的费用 ...
- Linux crontab 命令格式与举例
每五分钟执行 */5 * * * * 每小时执行 0 * * * * 每天执行 0 0 * * * 每周执行 0 0 * * 0 每月执行 0 0 1 ...
- 2018 “百度之星”程序设计大赛 - 初赛(A)度度熊学队列 list rope
c++ list使用 #include <cstdio> #include <cstdlib> #include <cmath> #include <cstr ...
- for循环 底层工作原理
for 循环是对容器进行迭代的过程. 什么是迭代? 迭代就是从某个容器对象中逐个地读取元素,直到容器中没有更多元素为止. for 循环的步骤是什么? 先判断对象是否为可迭代对象,不是的话直接报错,抛出 ...
- 线性回归,感知机,逻辑回归(GD,SGD)
线性回归 线性回归是一个回归问题,即用一条线去拟合训练数据 线性回归的模型: 通过训练数据学习一个特征的线性组合,以此作为预测函数. 训练目标:根据训练数据学习参数(w1,w2, ... , wn,b ...
- [Java] I/O底层原理之一:字符流、字节流及其源码分析
关于 I/O 的类可以分为四种: 关于字节的操作:InputStream 和 OutPutStream: 关于字符的操作:Writer 和 Reader: 关于磁盘的操作:File: 关于网络的操作: ...
- 浏览器内核控制meta name="renderer" 说明文档
https://blog.csdn.net/adc_god/article/details/51531263
- 简单几招,解决jQuery.getJSON的缓存问题
今天做测试工作,发现了一个令我费解的问题,jquery的getJson方法在firefox上运行可以得到返回的结果,但是在ie8上测试,竟发现没有发送请求,故不能取到任何返回的结果,经历了一翻周折,找 ...
- 【转】java格式化输出 printf 例子
[转]java格式化输出 printf 例子 转自http://www.cnblogs.com/TankMa/archive/2011/08/20/2146913.html#undefined imp ...