http://www.doc88.com/p-3953907355808.html
道客巴巴,这篇文章写的也挺不错,有味道,突出重点讲解清晰,必须参考。
思路
1通过共享appication做处理
2 先转换成json,第二个activity再转换回list
3 Parcelable Serializable
public class SerializableMap implements Serializable {
ArrayList<Map<String, Object>> listMap;
//get set方法
}
最后通过putSerializable("listMap
", SerializableMap获得listMap);
-------------------------------------------
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这个单词一直记不住什么意思,自从经常抛出这个异常后,这个单词终于烂熟于心了,)
以前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()方法提交数据。
///
///
ContentProvider
其步骤为:
1. 在当前应用程序中定义一个ContentProvider。
2. 在当前应用程序的AndroidManifest.xml中注册此ContentProvider
3. 其他应用程序通过ContentResolver和Uri来获取此ContentProvider的数据。
在程序A中,继承ContProvider类,并重写其中的方法
在其AndroidManifest.xml中声明此ContentProvider,其中authorities属性定义了此ContentProvider的Uri
标识。
<provider android:name=".MyProvider" android:authorities="com.test.MyProvider"/>
在应用程序B中,通过ContentResolver获取程序A的ContentProvider中的数据。
再观察两个应用程序的结构,A的程序结构,可以清楚看到其有一个名为“test_db.db3”的数据库,B的程
序结构,其并没有任何数据库用于存储数据。由此图,可以确定应用程序B中查询出来的数据结果是来自于应
用程序A。
以上就是ContentProvider的使用方式,这种存储方式相比SQLite和SharedPreferences,其复杂性是显而易见
的,但是在处处可见“云”的今天,程序间的数据交互需求令ContentProvider存储机制变成必不可少的一部
分。
context与service之间的传输,如Activity与Service之间的通信
5 基于Application Context
在一个activity初始化一个ArrayList<HashMap<Sting,Map>>对象,然后经过一个tableactivity,在传递到另
package net.blogjava.mobile1;
上面两段代码可以在任何的Service、Activity中使用。全局的
Android开发之IPC进程间通信-AIDL介绍及实例解析
一、IPC进程间通信 IPC是进程间通信方法的统称,Linux IPC包括以下方法,Android的进程间通信主要采用是哪些方法呢?
1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
2. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
3. 报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4. 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
5. 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。 6. 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
二、AIDL(Android Interface Definition Language) AIDL - Android Interface Definition Language - Android 接口定义语言。因为在Android中,应用程序运行在各自独立的进程里。应用程序之间是不能访问对方的内存空间的。有时为了实现进程间的通信,要用到PCI机制。Android支持PCI机制,但是需要Android能读懂的序列化数据(marshaling/un marshaling of data). AIDL就是为了描述这样的数据产生的,它是一种接口定义语言。语法类似JAVA,.aidl文件里面写的是公布给客户端接口声明。 本文中,为了吸取客户端,服务器端两个android 项目的经验,将两段整合到一个android项目里,这样可能会比较清晰。下面就看看实例解析吧。
三、AIDL介绍及解析
1.AIDL介绍 在Android中,每个应用(Application)执行在它自己的进程中,无法直接调用到其他应用的资源,这也符合“沙箱”的理念。所谓沙箱原理,一般来说用在移动电话业务中,简单地说旨在部分地或全部地隔离应用程序。关于沙箱技术我们这里就不多做介绍了。因此,在Android中,当一个应用被执行时,一些操作是被限制的,比如访问内存,访问传感器,等等。这样做可以最大化地保护系统,免得应用程序“为所欲为”。那我们有时需要在应用间交互,怎么办呢?于是,Android需要实现IPC协议。然而,这个协议还是有点复杂,主要因为需要实现数据管理系统(在进程或线程间传递数据)。Android为我们实现了自己的IPC,也就是AIDL。
2.定义AIDL接口 AIDL是IPC的一个轻量级实现,用了对于Java开发者来说很熟悉的语法。Android也提供了一个工具,可以自动创建Stub(类构架,类骨架)。当我们需要在应用间通信时,我们需要按以下几步走: a. 定义一个AIDL接口 b. 为远程服务(Service)实现对应Stub c. 将服务“暴露”给客户程序使用
3.实例解析 AIDL的语法很类似Java的接口(Interface),只需要定义方法的签名。 AIDL支持的数据类型与Java接口支持的数据类型有些不同 a. 所有基础类型(int, char, 等) b. String,List,Map,CharSequence等类 c. 其他AIDL接口类型 d. 所有Parcelable的类 下面以一个加法器为例来做解析。 (1)创建工程,创建AIDL接口:新建一个文件,命名为IAdditionService.aidl 即可
package com.czm.hellosumaidl;
interface IAdditionService{
int add(int value1,int value2);
}
一旦文件被保存,Android的AIDL工具会在 gen/com/android/hellosumaidl
这个文件夹里自动生成对应的 IAdditionService.java 这个文件。
因为是自动生成的,所以无需改动。
这个文件里就包含了 Stub ,我们接下来要为我们的远程服务实现这个Stub。 (2)实现远程服务 首先我们新建一个类,取名叫AdditionService.java 。为了 实现我们 的服务,我们需要让 这个 类中的 onBind方法返回一个 IBinder 类的对象。这个 IBinder 类的对象就代表了远程服务的实现。为了实现这个服务,我们要用到自动生成的子类 IAdditionService.Stub 。在其中,我们也必须实现我们之前在AIDL文件中定义的 add() 函 数。下面是我们远程服务的代码: 复制代码
public class AdditionService extends Service
{ @Override public void onCreate()
{ super.onCreate(); }
@Override public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return new IAdditionService.Stub() {
@Override
public int add(int value1, int value2) throws RemoteException {
// TODO Auto-generated method stub
return value1 + value2; } }; }
@Override public void onDestroy() {
super.onDestroy(); } }
复制代码(3)提供服务(“暴露”服务给使用者) 一旦实现了服务中的onBind方法 ,我们就可以把客户程序(在这里是MainActivity.java )与服务连接起来了。为了建立这样的一个链接 ,我们需要实现 ServiceConnection 类。我们在 MainActivity.java 创建一个内部类 AdditionServiceConnection ,这个类继承 ServiceConnection 类,并且重写了它的两个方法:
onServiceConnected 和 onServiceDisconnected。
下面给出 内部类的代码: 复制代码class AdditionServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder boundService) { // TODO Auto-generated method stub service = IAdditionService.Stub.asInterface((IBinder) boundService); Toast.makeText(MainActivity.this, "Service connected", Toast.LENGTH_SHORT).show(); } @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub service = null; Toast.makeText(MainActivity.this, "Service disconnected", Toast.LENGTH_SHORT).show(); } }复制代码
(4)相关代码及效果截图 MainActivity.java的全部代码如下: 复制代码package com.czm.hellosumaidl; import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast; public class MainActivity extends Activity { IAdditionService service; AdditionServiceConnection connection; EditText value1; EditText value2; TextView result; Button buttonCalc; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); initService(); buttonCalc = (Button) findViewById(R.id.buttonCalc); value1 = (EditText) findViewById(R.id.value1); value1.setText("23"); value2 = (EditText) findViewById(R.id.value2); value2.setText("24"); result = (TextView) findViewById(R.id.result); buttonCalc.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { int v1, v2, res = -1; v1 = Integer.parseInt(value1.getText().toString()); v2 = Integer.parseInt(value2.getText().toString()); try { res = service.add(v1, v2); } catch (RemoteException e) { e.printStackTrace(); } result.setText(Integer.valueOf(res).toString()); } }); } @Override protected void onDestroy() { super.onDestroy(); releaseService(); } /* * This function connects the Activity to the service */ private void initService() { connection = new AdditionServiceConnection(); Intent i = new Intent(); i.setClassName("com.czm.hellosumaidl",com.czm.hellosumaidl.AdditionService.class.getName()); boolean ret = this.bindService(i, connection, Context.BIND_AUTO_CREATE);