【Android的从零单排开发日记】之入门篇(十二)——Android组件间的数据传输

组件我们有了,那么我们缺少一个组件之间传递信息的渠道。利用Intent做载体,这是一个王道的做法。还有呢,可以利用文件系统来做数据共享。也可以使用Application设置全局数据,利用组件来进行控制数据。

一、Intent数据传递

  1. 那么首先是简单的跳转。我们可以借助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里面的字符串 
  2. 那么接下来是如何接受从目标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;
                        }         
    
                 } 

二、文件系统做数据共享

  1. 通过 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数据存储(下)
  2. 除了比较方便的shared_prefs,也可以创建自定义文件,方法是Context.openFileOutput(),可以在/data/data /package_name/files/目录下创建指定的文件,除此以外,和上面提到的shared_prefs都一样。不过操作起来就复杂一些了。要 读取用这种方式创建的文件,可以用Context.openFileInput()方法。
  3. 此外,还可以在SD卡上操作文件,通过标准的java.io包内的API就可以。不过要注意的是,SD卡内采用的是FAT文件系统,所以不支持linux 的文件读写权限控制,这点和shared_prefs与file不太一样。如果需要对文件进行读写权限控制,就不能采用写入SD卡的方式。
  4. 也可以用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" .../>

四、组件控制数据

  1. 第一个当然是正统的ContentProvider组件了,怎么使用它,请看这篇博文,这里就不再讲述了。Android四大组件之ContentProvider
  2. service也可以充当数据控制的组件,毕竟service是在后台运行,当它与Activity绑定时,activity就可以从里面获取数据(前提是service没有被销毁)。详情:Android四大组件之Service
  3. 广播组件也可以,更可以使用sendOrderedBroadcast(intent, null, BroadcastReceiver(), null, Activity.RESULT_OK, null, null);方法对返回的数据进行处理.这个方法是在原有的广播序列的末尾再加一个广播,并作为最后的一个广播,可以对返回的信息进行处理。详情:Android四大组件之Broadcast Receiver

五、结束语

呼~从写第一篇博文开始,到现在已经一个月了,不知不觉中时间就过去了呢。期间断断续续地写了十几篇博文,不过写的好也罢,写的不好也罢,反正博主感觉自己收获很大,和以前的想要什么功能就去学什么那样片段式的学习相比,现在这种全面学习感觉好多了。

到这里为止,Android入门篇的组件部分就基本上完毕了,当然里面还有很多内容可以深究,这方面要大家自己挖掘了。那么接下来就是Android的控件部分了,额,一想到那么多的控件头都大了,不过基本原理都是相通的,举一反三嘛~好了,如果有什么问题也可以联系我一起探讨学习,最后希望大家Have a good day.

 ========================================

作者:cpacm
出处:(http://www.cnblogs.com/cpacm/p/3946586.html

时间: 2024-12-26 12:45:21

【Android的从零单排开发日记】之入门篇(十二)——Android组件间的数据传输的相关文章

【Android的从零单排开发日记】之入门篇(四)——Android四大组件之Activity

在Android中,无论是开发者还是用户,接触最多的就算是Activity.它是Android中最复杂.最核心的组件.Activity组件是负责与用户进行交互的组件,它的设计理念在很多方面都和Web页面类似.当然,这种相似性主要体现在设计思想上.在具体实现方面,Android的Activity组件有自己的设计规范,同时,它能够更简便地使用线程.文件数据等本地资源. 一.Activity 的生命周期 Activity 的生命周期是被以下的函数控制的. 1 public class Activity

【Android的从零单排开发日记】之入门篇(六)——Android四大组件之Broadcast Receiver

广播接受者是作为系统的监听者存在着的,它可以监听系统或系统中其他应用发生的事件来做出响应.如设备开机时,应用要检查数据的变化状况,此时就可以通过广播来把消息通知给用户.又如网络状态改变时,电量变化时都可以通过广播来通知用户.要做比喻的话,广播就像是我们的感官,能够有效且快速的从外界获取信息来反馈给自身. 一.广播的功能和特征 广播的生命周期很短,经过 调用对象—实现onReceive—结束 整个过程就结束了.从实现的复杂度和代码量来看,广播无疑是最迷你的Android 组件,实现往往只需几行代码

【Android的从零单排开发日记】之入门篇(三)——Android目录结构

本来的话,这一章想要介绍的是Android的系统架构,毕竟有了这些知识的储备,再去看实际的项目时才会更清楚地理解为什么要这样设计,同时在开发中遇到难题,也可以凭借着对Android的了解,尽快找出哪些模块和设计能够帮助解决该问题.但想了一下,这毕竟是入门篇,若没有实际项目开发经验的人看了之后肯定是一头雾水,所以就决定将其搁浅到大家熟悉Android之后再为大家介绍. 那么今天的主题是Android的目录结构,将系统架构比作人的骨骼架构的话,目录结构就像是人的各个器官,彼此功能各不相同,却能有序地

【Android的从零单排开发日记】之入门篇(五)——Android四大组件之Service

这几天忙着驾校考试,连电脑都碰不到了,今天总算告一段落了~~Service作为Android的服务组件,默默地在后台为整个程序服务,辅助应用与系统中的其他组件或系统服务进行沟通.它跟Activity的级别差不多,但不能自己运行只能后台运行.service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等, 总之服务总是藏在后台的. ps:Service运行在主线程中的,所

【Android的从零单排开发日记】之入门篇(八)——Android数据存储(下)

废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基于数据库的应用.Android的数据库应用,依托于当下最流行的开源嵌入式数据库SQLite.在Android中,应用的数据库文件是该应用私有的,存储在应用数据目录下的databases子目录内.从代码结构来看,Android的数据库实现可以分成两个层次,在底层通过C++调用SQLite的接口来执行S

【Android的从零单排开发日记】之入门篇(七)——Android数据存储(上)

在讲解Android的数据源组件——ContentProvider之前我觉得很有必要先弄清楚Android的数据结构. 数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也是开发平台必须提供的基础功能.不光是在Android平台上,在其他的平台上,数据的存储永远是不可缺少的一块.Android的数据存储是构建在Linux的文件系统上,它充分利用Linux的账号系统来限定应用对数据的访问,部署了一套安全和灵活并重的数据存储解决方案.Android的文件框架,以及各种数据

【Android的从零单排开发日记】之入门篇(一)——开发环境的搭建

写给自己的话:至此,大学的时光已经剩下一年的时光,下一年等毕业设计结束后就算是正式地踏入社会.自己学android也不过几个月的时间,为了更好管理文档,写点东西记录下自己曾经做过的点点滴滴是一个不错的选择,接下来都会将我自己所学所感一一记录下来,算是给后来的我一份复习的资料和还算不错的回忆. 开始正题吧,android环境的安装,网上很多教程,本来不想写这章的,后来帮同学配置时想想有个总结也是不错的,所以就写了这篇满是链接的文章. 一.需要准备的文件 JDK 官方网站 http://www.or

【Android的从零单排开发日记】之入门篇(九)——Android四大组件之ContentProvider

数据源组件ContentProvider与其他组件不同,数据源组件并不包括特定的功能逻辑.它只是负责为应用提供数据访问的接口.Android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等).如果把第三方应用比作一个黑盒子的话,ContentProvider就像是从里面延伸出来的管道,从这个管道,应用可以把一些数据共享出来,我们也可以往里面输送数据.但是里面怎么处理数据我们看不到,也管不着.并且这个管道是有规范标准的,不是它规定的数据你塞不进

【Android的从零单排开发日记】之入门篇(十一)——Android的Intent机制

继续我们的Android之路吧.今天我要介绍的是Android的Intent. 对于基于组件的应用开发而言,不仅需要构造和寻找符合需求的组件,更重要的是要将组件有机的连接起来,互联互通交换信息,才能够最终提供应用所期望的服务.而为了能够更好地实现组件复用,充分地利用每一个组件的能力,就需要这些组件连接的模式足够灵活和统一,并且可以进行动态地扩展.所以Android提供了利用Intent对象建立连接并实现组件通信的模式.Intent对象是Android组件连接的核心,集中体现了整个组件连接模型的设