转自:http://www.jb51.net/article/37227.htm

本篇文章是对activity之间数据传递的方法进行了详细的分析介绍,需要的朋友参考下
1  基于消息的通信机制 Intent--------boudle,extra
用这种简单的形式,一般而言传递一些简单的类型是比较容易的,如int、string等
详细介绍下Intent机制
Intent包含两部分:
1 目的【action】-------要去到哪里去
2 内容【category、data】----------路上带些什么,区分性数据和内容性数据
简单数据传递:

复制代码代码如下:

Intent intent = new Intent(LoginActivity.this, MainActivity.class);
intent.putExtra("flag", flag);
startActivity(intent);
/
String flag = "   ";
Intent intent1 = this.getIntent();  
flag = intent1.getStringExtra("flag");
/

数据类型有限,遇到不可序列化的数据Bitmap,Inputstream,或者是LinkList链表等数据类型就不太好用了
2 利用static静态数据,public static成员变量
我们千万不要以为Davlik虚拟机的垃圾回收器会帮助我们回收不需要的内存垃圾。事实上,回收器并不可靠,
尤其是手机上,是更加的不可靠。 因此,除非我们要使自己的程序变得越来越糟糕,否则尽量远离static。
注:如果经常使用static的Bitmap、Drawable等变量。可能就会抛出一个在Android系统中非常著名的异常(
以前budget这个单词一直记不住什么意思,自从经常抛出这个异常后,这个单词终于烂熟于心了,)
ERROR/AndroidRuntime(4958): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
注:如果经常使用static的Bitmap、Drawable等变量。可能就会抛出一个在Android系统中非常著名的异常(
以前budget这个单词一直记不住什么意思,自从经常抛出这个异常后,这个单词终于烂熟于心了,)
3 基于外部存储的传输 ,File/Preference/Sqlite,如果要针对第三方应用需要Content provider
作为一个完成的应用程序,数据存储操作是必不可少的。因此,Android系统一共提供了四种数据存储方式。
分别是:SharePreference、SQLite、Content Provider和File。由于Android系统中,数据基本都是私有的的
,都是存放于“data/data/程序包名”目录下,所以要实现数据共享,正确方式是使用Content Provider。
SQLite: SQLite是一个轻量级的数据库,支持基本SQL语法,是常被采用的一种数据存储方式。Android
为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的API。
SharedPreference: 除SQLite数据库外,另一种常用的数据存储方式,其本质就是一个xml文件,常用于
存储较简单的参数设置。
File: 即常说的文件(I/O)存储方法,常用语存储大数量的数据,但是缺点是更新数据将是一件困难的
事情。
ContentProvider: ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制。一个
应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制。并且此种方式忽略了底层的数据存储
实现,ContentProvider提供了一种统一的通过Uri实现数据操作的方式。
详细介绍使用过程
File 通过文件内容的读取传递数据
Preference: SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值
对数据,通常用来存储一些简单的配置信息
SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。实现
SharedPreferences存储的步骤如下:
一、根据Context获取SharedPreferences对象
二、利用edit()方法获取Editor对象。
三、通过Editor对象存储key-value键值对数据。
四、通过commit()方法提交数据。

复制代码代码如下:

   SharedPreferences sp=getSharedPreferences("login",0);//login存储文件名
   SharedPreferences.Editor se=sp.edit();;
   se.putString("server", logEdit.getText().toString());
   se.putString("port", portEdit.getText().toString());
   se.commit();
/
  SharedPreferences ps=getSharedPreferences("login",0);//login是存储文件  
  server=ps.getString("server", "");
  port=ps.getString("port", "");

logEdit.setText(server);
  portEdit.setText(port);
/
ContentProvider

其步骤为:
1. 在当前应用程序中定义一个ContentProvider。
2. 在当前应用程序的AndroidManifest.xml中注册此ContentProvider
3. 其他应用程序通过ContentResolver和Uri来获取此ContentProvider的数据。
在程序A中,继承ContProvider类,并重写其中的方法

复制代码代码如下:

public class MyProvider extends ContentProvider{
     @Override
     public int delete(Uri uri, String selection, String[] selectionArgs) {
         // TODO Auto-generated method stub
         return 0;
     }

@Override
     public String getType(Uri uri) {
         // TODO Auto-generated method stub
         return null;
     }

@Override
     public Uri insert(Uri uri, ContentValues values) {
         return null;
     }

//在Create中初始化一个数据库
     @Override
     public boolean onCreate() {
         SQLiteDatabase db = this.getContext().openOrCreateDatabase("test_db.db3", 
Context.MODE_PRIVATE, null);
         db.execSQL("create table tab(_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT 
NULL)");
         ContentValues values = new ContentValues();
         values.put("name", "test");
         db.insert("tab", "_id", values);
         db.close();
         return true;
     }

//实现query方法
     @Override
     public Cursor query(Uri uri, String[] projection, String selection,
             String[] selectionArgs, String sortOrder) {
         SQLiteDatabase db = this.getContext().openOrCreateDatabase("test_db.db3", 
Context.MODE_PRIVATE, null);
         Cursor c = db.query("tab", null, null, null, null, null,null);
         return c;
     }

@Override
     public int update(Uri uri, ContentValues values, String selection,
             String[] selectionArgs) {
         // TODO Auto-generated method stub
         return 0;
     }
 }

在其AndroidManifest.xml中声明此ContentProvider,其中authorities属性定义了此ContentProvider的Uri
标识。
<provider android:name=".MyProvider" android:authorities="com.test.MyProvider"/>
在应用程序B中,通过ContentResolver获取程序A的ContentProvider中的数据。

复制代码代码如下:

public class MainActivity extends Activity {
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);

//获取上下文
         Context ctx = MainActivity.this;
         //获取ContentResolver对象
         ContentResolver resolver = ctx.getContentResolver();
         //获取Uri对象
         Uri uri = Uri.parse("content://com.test.MyProvider");
         //获取数据
         Cursor c = resolver.query(uri, null, null, null, null);
         c.moveToFirst();
         for(int i=0; i<c.getCount(); i++){
             int index = c.getColumnIndexOrThrow("name");
             String src = c.getString(index);
             Log.d("", src);
             c.moveToNext();
         }
     }
 }

再观察两个应用程序的结构,A的程序结构,可以清楚看到其有一个名为“test_db.db3”的数据库,B的程序结构,其并没有任何数据库用于存储数据。由此图,可以确定应用程序B中查询出来的数据结果是来自于应用程序A。
以上就是ContentProvider的使用方式,这种存储方式相比SQLite和SharedPreferences,其复杂性是显而易见的,但是在处处可见“云”的今天,程序间的数据交互需求令ContentProvider存储机制变成必不可少的一部分。
4 基于Ipc的通信机制
context与service之间的传输,如Activity与Service之间的通信
5 基于Application  Context
在一个activity初始化一个ArrayList<HashMap<Sting,Map>>对象,然后经过一个tableactivity,在传递到另
外一个activity,一开始直接考虑用putExtra,测试发现数据只能传递一次,就考虑用Application传递
Java里面通常是用一个static的变量(例如singleton之类的)来同步activity之间(程序里面类之间)的状态。在android里面比较靠谱的做法是用application context来关联这些状态。
每个activity都是context,里面包含了运行时的状态。同样application也有一个context,android会保证这个context是唯一的实例。

复制代码代码如下:

package net.blogjava.mobile1;
import android.app.Application;
import android.graphics.Bitmap;
public class MyApp extends Application
{
    private Bitmap mBitmap;
    public Bitmap getBitmap()
    {
        return mBitmap;
    }
    public void setBitmap(Bitmap bitmap)
    {
        this.mBitmap = bitmap;
    }

}
<application android:name=".MyApp" android:icon="@drawable/icon" android:label="@string/app_name">
</application>

获得Bitmap对象的代码:

复制代码代码如下:

    ImageView imageview = (ImageView)findViewById(R.id.ivImageView);

MyApp myApp = (MyApp)getApplication();

imageview.setImageBitmap(myApp.getBitmap());

上面两段代码可以在任何的Service、Activity中使用。全局的

转载于:https://www.cnblogs.com/cugwx/p/3795025.html

解析activity之间数据传递方法的详解相关推荐

  1. Android零基础入门第83节:Activity间数据传递方法汇总

    2019独角兽企业重金招聘Python工程师标准>>> 在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间 ...

  2. android数据回传的代码,android Activity之间数据传递 Parcelable和Serializable接口的使用...

    Activity之间传数据时,为了避免麻烦,往往会将一些值封装成对象,然后将整个对象传递过去.传对象的时候有两种情况,一种是实现Parcelable接口,一种是实现Serializable接口. 0. ...

  3. 数据库中关于删除重复数据的方法的详解

    相信大家在实际开发中在数据库方面都遇到过很多重复数据的问题,今天就和大家谈谈关于删除重复数据的方法,为了更加直观的和更容易的掌握方法我就从建表开始到插入重复数据到删除重复数据的核心sql语句给大家演示 ...

  4. Vue中同级组件之间的通讯方法(详解)

    比如我想在userVue.vue中调用headVue中的方法 1.首先先创建一个avatarRealTime.js,来打开组件之间的通讯接口 avatarRealTime中代码如下:引入vue,暴露出 ...

  5. 【好文推荐】Activity之间的数据传递方法汇总

    在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间数据的传递方法. 1.通过 Intent 传递 我们在进行 Activit ...

  6. 小程序页面之间数据传递的五种方法

    小程序页面之间数据传递的五种方法 目录 小程序页面之间数据传递的五种方法 **使用 `wx.navigateTo()` 时,在 url 中拼接,这种方法适用于数据量少的情况** **使用 `wx.na ...

  7. # android开发:4-1、Activity启动方式、生命周期、不同activity的数据传递

    4.Activity活动简介 什么是Activity: 如何创建Activity: Activity启动方式: Activity的生命周期: 不同Activity之间数据的传递: 什么是Activit ...

  8. android php 实时通信,Android_Android实现Activity之间通信的方法,本文实例讲述了Android实现Activi - phpStudy...

    Android实现Activity之间通信的方法 本文实例讲述了Android实现Activity之间通信的方法.分享给大家供大家参考.具体如下: 在一个Activity中可以使用系统提供的start ...

  9. Android解析xml的方法,Android中解析XML格式数据的方法

    XML介绍:Extensible Markup Language,即可扩展标记语言 一.概述 Android中解析XML格式数据大致有三种方法: SAX DOM PULL 二.详解 2.1 SAX S ...

最新文章

  1. JSR303(Bean Validation 1.0)
  2. VTK:PolyData之WarpVector
  3. 如何让一个对话框全屏对话框
  4. open a BP will trigger text load - COM_TEXT_MAINTAIN - READ_TEXT
  5. linux centos7.2 nodeJs全局安装
  6. 域名和服务器销售WHMCS和HTML5模板 – Hostlar
  7. 如何更快获取想要的设计资源?
  8. java模拟银行_java模拟银行交易系统程序
  9. kettle spoon判断增量更新_【论文推荐】张斌等:基于改进 SOINN 算法的恶意软件增量检测方法...
  10. 基于tcpdf将html转成pdf
  11. 新国标电动车怎么选?绿源INNO7了解一下吧
  12. python比较火的培训机构
  13. NginxWebUI--强大的nginx可视化配置工具
  14. python 成语接龙-连接数据库
  15. 订货宝 html源码,订货宝新功能,代客下单等一大波移动管理端功能
  16. excel 两组数据交点_数据分析入门:8种常用的数据分析方法
  17. 举世无双语音合成系统 VITS 发展历程(2023.03.31 SNAC)
  18. 矩阵方程求解内置函数
  19. Attribute Changer的几种形态
  20. 制作dns服务器,宽带提速方法 制作dns服务器提速宽带 -电脑资料

热门文章

  1. vnpy通过jqdatasdk初始化实时数据及历史数据下载
  2. 如何做出酷炫且实用的可视化大屏?Excel和PPT该淘汰了
  3. 为什么Python是数据科学领域最受欢迎的语言之一?
  4. linux防火墙能阻止cc攻击吗,linux csf 防火墙 防止少量的ddos cc攻击很有效
  5. Python算术运算符目录
  6. oracle result_cache_max_size,当设置RESULT_CACHE_MAX_SIZE参数并且重启过database后,Query Result Cache 还是被禁用的。...
  7. 轻量化网络:Xception
  8. 定义一个圆形类Circle
  9. 第九讲 博弈论在机制设计中的应用练习题
  10. ubuntu中安装caffe docker 镜像【不用自己配环境,一键搞定,快速进入caffe学习】