摘要:上回书解释了IBinder,这回详细解释一下Parcel,以下是对android sdk 文档的翻议:Parcel是一个容器,它主要用于存储序列化数据,然后可以通过Binder在进程间传递这些数据(要了解为什么要序列化,请参考:http://blog.csdn.net/nkmnkm/archive/2011/05/28/6451699.aspx)。Parcel可以包含原始数据类型(用各种对应的方法写入,比如writeInt(),writeFloat()等),可以包含Parcelable对象,它还包含了一个活动的IBinder对象的引用,这个引用导致另一端接收到一个指向这个IBinder的代理I
阅读全文
摘要:上回书简单描述了进程间传递类对象的原理,这回在讲Parcel之前,先要讲一个东西:IBinder。IBinder是什么呢?首先要明白,Android的远程调用(就是跨进程调用)就是通过IBinder实现的,下面是对android开发文档的翻译。 IBinder是远程对象的基本接口,是为高性能而设计的轻量级远程调用机制的核心部分。但它不仅用于远程调用,也用于进程内调用。这个接口定义了与远程对象交互的协议。不要直接实现这个接口,而应该从Binder派生。IBinder的主要API是transact(),与它对应另一方法是Binder.onTransact()。第一个方法使你可以向远端的IBinde
阅读全文
摘要:Parcel,翻译过来是“打包”的意思。打包干什么呢?是为了序列化。 如果要在进程之间传递一个整数,很简单,直接传就是行了;如果要传一个字符串,就稍微复杂了点:需先分配一块可以容纳字符串的内存,然后将字符串复制到内存中,再传递(新手可能问:为啥不直接把字符串的引用传过去呢?学过C/C++的地球人都知道:进程有自己的内存地址空间,一个进程中的1000地址可能在另一个进程中是100000,java对象的引用跟本上还是内存地址);再如果要传递一个类的实例呢?也是先为类分配内存,然后复制一份再传递可以吗?我认为不可以,我至少可以找到一个理由:类中成员除了属性还有方法,即使属性能完整传过去,但还有...
阅读全文
摘要:#include<stdio.h> #include<string.h> #include<time.h> //#include<conio.h> #include<stdlib.h> #include<windows.h>int isleapyear(int year) //判断该年是 闰年 还是 平年 { if((year%4==0&&year%100!=0) || (year%400==0) ) //判断该年是 闰年 return 1; else return 0; } int firstdayofy
阅读全文
摘要:#include<stdio.h>#include<string.h>#include<time.h>//#include<conio.h>#include<stdlib.h>void main(){ int i,j,x; char p[20],ch; char temp[20]; for(i=0;i<3;i++) { system("cls"); j=0; srand(time(0)); //随即产生一个数 x=rand()%10000+1000; //产生的是一个大于1000的数 printf("
阅读全文
摘要:int CreatMatrix(int *matrix){ int i,j; int buf; for(i=0;i<9;i++) { getElem: srand((unsigned)time(NULL)); buf=rand()%9; for(j=0;j<i;j++) { if(matrix[j]==buf) goto getElem; } matrix[i]=buf; } return OK;}
阅读全文
摘要:#include "stdio.h"int isleapyear(int year){ if((year%4!=0||year%100==0) && (year%400!=0) ) return 0; else return 1;}int firstdayofyear(int year){ return (year+(year-1)/4+(year-1)/400-(year-1)/100)%7;}main(){ char *monthname[13]={" ","一月份","二月份","三
阅读全文