本人一个人的中国通讯工具的发展史

精雕细琢尽显质感 近期高品质手机推荐|魅族|三星_新浪科技_新浪网
精雕细琢尽显质感 近期高品质手机推荐
  如今的智能手机已经不单单是通讯工具,可以说是“衣食住行”都无法离开,甚至手机都成为一个人的“象征”。当然这个象征不是身份和地位,而是生活品质。精致的生活是我们每个人都梦寐以求的,而一部精雕细琢、品质出众的手机却不是很常见。新浪手机就为大家介绍几款近期的高品质手机,感兴趣的朋友不可错过。
  nubia(
  nubia布拉格S采用了弧形金属边框,搭配双2.5D玻璃的设计,号称“深圳最美手机”,圆润的机身也为手机带来了更舒适的握感。nubia布拉格S厚度仅为6.8毫米,重量为135克,机身相当轻薄。
点击图片查看nubia布拉格S 双4G详细资料
  nubia布拉格S采用5.2英寸1080P全高清Super AMOLED屏,搭载高通骁龙615处理器,内置3GB运行内存和64GB机身存储空间,并支持最大128GB的存储卡扩展。
点击图片查看nubia布拉格S 双4G详细资料
  nubia布拉格S前置800万像素,后置1300万像素的镜头组合,运行基于Android 5.1系统的nubia UI 3.0,电池容量为2200毫安时,支持快速充电,支持眼纹识别,可以通过扫描眼球静脉纹路识别用户的身份,通过眼纹识别,我们可以加密手机应用,保护用 户资料安全。
  nubia布拉格S 双4G
  参考价格:2399元
启动速度将更快、照片将更清晰、日程提醒将更易设置。
该机仍保持了全键盘特色,但它的实体键盘是固定的。
出错原因是苹果公司使用了过期的安全证书去验证应用。
大部分用户都使用智能手机拍照,GoPro正在被边缘化。
参考价格3698元
双曲面屏幕
参考价格未上市
参考价格2699元
骁龙820旗舰芯片
超高性价比
造型无革新
参考价格未上市
可更换电池
独立模块设计从Activity的启动理解Binder通信
大学四年毕业以后就开始从事Android 软件开发,说好的我要一个人的毕业旅行也不得不因为很多的原因被搁置,正式进入公司从事了”挨踢”男的工作。不管怎样,毕竟兴趣就这个,开始好好工作吧。
随着对android的深入,很多疑惑也越来越多,比如framework怎么和android系统服务(system service)进行通信的,这就牵扯到android的通信机制了,即Binder(IPC)通信机制。
1.Binder的通信模型
Binder框架定义了四个角色:Server,Client,ServiceManager(以后简称SMgr)以及Binder驱动。其中Server,Client,SMgr运行于用户空间,驱动运行于内核空间。这四个角色的关系和互联网类似:Server是服务器,Client是客户终端,SMgr是域名服务器(DNS),驱动是路由器。
由于android初级开发者从Framework 层理解Binder通信原理会感觉十分困难,我也是慢慢从初级向中级前进,于是我做了一个简化的图这样便于大家的理解。
上图是从一个android Application启动activity来引出Binder的通信机制,下面我们随着源码一步一步的分析。
2.源码分析
首先给一个关于Application是怎么启动Activity的整体时序图,跟着时序图这样有助于源码步骤的理解。
当一个应用程序启动一个界面展示的时候依托的就是Activity,我们跟着时序图进入Activity中查看关键代码
public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
if (mParent == null) {
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options);
if (ar != null) {
mMainThread.sendActivityResult(
mToken, mEmbeddedID, requestCode, ar.getResultCode(),
ar.getResultData());
当调用startActivity时候,实际上调用的是Instrumentation里面的execStartActivity()方法,于是我们继续跟踪代码;
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Fragment target,
Intent intent, int requestCode, Bundle options) {
IApplicationThread whoThread = (IApplicationThread) contextT
if (mActivityMonitors != null) {
synchronized (mSync) {
final int N = mActivityMonitors.size();
for (int i=0; i&N; i++) {
final ActivityMonitor am = mActivityMonitors.get(i);
if (am.match(who, null, intent)) {
am.mHits++;
if (am.isBlocking()) {
return requestCode &= 0 ? am.getResult() : null;
intent.migrateExtraStreamToClipData();
intent.prepareToLeaveProcess();
int result = ActivityManagerNative.getDefault()
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mWho : null,
requestCode, 0, null, options);
checkStartActivityResult(result, intent);
} catch (RemoteException e) {
return null;
紧接着调用ActivityManagerNative.getDefault().startActivity();那ActivityManagerNative.getDefault()这个对象到底是什么呢?我们继续跟踪源码可以知道原来是通过ServiceManager得到一个activity的服务,最后通过asInterface(b)返回一个IActivityManager 接口。
private static final Singleton&IActivityManager& gDefault = new Singleton&IActivityManager&() {
protected IActivityManager create() {
IBinder b = ServiceManager.getService("activity");
if (false) {
Log.v("ActivityManager", "default service binder = " + b);
IActivityManager am = asInterface(b);
if (false) {
Log.v("ActivityManager", "default service = " + am);
那我们接下来看看asInterface()方法里面做了什么
* Cast a Binder object into an activity manager interface, generating
* a proxy if needed.
static public IActivityManager asInterface(IBinder obj) {
if (obj == null) {
return null;
IActivityManager in =
(IActivityManager)obj.queryLocalInterface(descriptor);
if (in != null) {
return new ActivityManagerProxy(obj);
通过源码我们可以知道,原来返回的是一个ActivityManagerProxy类,这个类的作用就是实现Client 和Service之间通信的代理。那接下来继续跟踪ActivityManagerProxy发现他是IActivityManager 的实现类。
class ActivityManagerProxy implements IActivityManager
public ActivityManagerProxy(IBinder remote)
public IBinder asBinder()
public int startActivity(IApplicationThread caller, String callingPackage, Intent intent,
String resolvedType, IBinder resultTo, String resultWho, int requestCode,
int startFlags, ProfilerInfo profilerInfo, Bundle options) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeStrongBinder(caller != null ? caller.asBinder() : null);
data.writeString(callingPackage);
intent.writeToParcel(data, 0);
data.writeString(resolvedType);
data.writeStrongBinder(resultTo);
data.writeString(resultWho);
data.writeInt(requestCode);
data.writeInt(startFlags);
if (profilerInfo != null) {
data.writeInt(1);
profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
data.writeInt(0);
if (options != null) {
data.writeInt(1);
options.writeToParcel(data, 0);
data.writeInt(0);
mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);//重点代码
reply.readException();
int result = reply.readInt();
reply.recycle();
data.recycle();
这里很关键的一句代码 mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);这个mRemote就是Binder对象了,就是通信的关键,在这重载transact();具体实现如下:
1.向服务端线程以消息机制发送调用信息;
2.挂起当前线程,等待服务端执行完毕发送通知(notify);
3.接到通知,继续客户端线程,并返回执行结果。
值得注意的是,客户端视乎直接调用服务端的Binder,而事实上是通过Binder驱动进行了中转,就存在两个Binder对象,一个是服务端的Binder对象,另一个是Binder驱动中的Binder对象,不同之处在于Binder驱动中的对象不会产生额外的线程。
同时要进行Binder的远程服务调用时,服务函数的参数要么是一个原子类,要么必须继承Parcel类,否则不会传递。而且传递的数据添加到包裹中和包裹返回的数据必须是有序的,这个顺序是服务端和客户端事先约定好的。
传递数据的插入过程:
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeStrongBinder(caller != null ? caller.asBinder() : null);
data.writeString(callingPackage);
intent.writeToParcel(data, 0);
data.writeString(resolvedType);
data.writeStrongBinder(resultTo);
data.writeString(resultWho);
data.writeInt(requestCode);
data.writeInt(startFlags);
从mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0)发送的消息START_ACTIVITY_TRANSACTION跟踪我可以知道服务端对数据的处理是在ActivityManagerNative类中
public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
throws RemoteException {
switch (code) {
case START_ACTIVITY_TRANSACTION:
data.enforceInterface(IActivityManager.descriptor);
IBinder b = data.readStrongBinder();
IApplicationThread app = ApplicationThreadNative.asInterface(b);
String callingPackage = data.readString();
Intent intent = Intent.CREATOR.createFromParcel(data);
String resolvedType = data.readString();
IBinder resultTo = data.readStrongBinder();
String resultWho = data.readString();
int requestCode = data.readInt();
int startFlags = data.readInt();
ProfilerInfo profilerInfo = data.readInt() != 0
? ProfilerInfo.CREATOR.createFromParcel(data) :
Bundle options = data.readInt() != 0
? Bundle.CREATOR.createFromParcel(data) :
int result = startActivity(app, callingPackage, intent, resolvedType,
resultTo, resultWho, requestCode, startFlags, profilerInfo, options);
reply.writeNoException();
reply.writeInt(result);
Binder的解析数据的方法是enforceInterface();而插入数据使用的writeInterfaceToken();最后通过消息机制调用startActivity()方法进入到ActivityManagerService,即
public int startActivity(IBinder whoThread, String callingPackage,
Intent intent, String resolvedType, Bundle options) {
checkCaller();
int callingUser = UserHandle.getCallingUserId();
IApplicationThread appT
synchronized (ActivityManagerService.this) {
tr = recentTaskForIdLocked(mTaskId);
if (tr == null) {
throw new IllegalArgumentException("Unable to find task ID " + mTaskId);
appThread = ApplicationThreadNative.asInterface(whoThread);
if (appThread == null) {
throw new IllegalArgumentException("Bad app thread " + appThread);
return mStackSupervisor.startActivityMayWait(appThread, -1, callingPackage, intent,
resolvedType, null, null, null, null, 0, 0, null, null,
null, options, callingUser, null, tr);
这就是囫囵吞枣的Binder的分析,由于能力有限,后续会更加深入的去学习Binder(IPC)通信机制,个人觉得以Activity的启动流程来掌握Binder通信,这样更容易上手和接受,由于Binder通信在android初级开发者理解起来是最困难的,以此博客,记录自己的学习心得。后续会写对Binder更深入的文章。
*逆风的方向,更适合飞翔。*
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!已收藏本页面
挖地挖到的。远古时期人类使用的通讯工具。变成洛基亚化石了,今天出土了[臭美]
明明就是给掉没凝固的混凝土里面了[doge]
应该不是真品,连二维码都没有。
诺基亚这波广告很强势
远古时代也有诺基亚,别闹了好吗[doge]
你可能喜欢的图片笑话
最受欢迎的爆笑笑话
扫码下载糗事百科app> 问题详情
对于一个小型的软件开发项目,一个人就可以完成需求分析、设计、编码和测试工作。但随着软件项目规模
悬赏:0&答案豆
提问人:匿名网友
发布时间:
对于一个小型的软件开发项目,一个人就可以完成需求分析、设计、编码和测试工作。但随着软件项目规模的增大,需要有多人共同参与同一软件项目的工作。当几个人共同承担软件开发项目中的某一任务时,人与人之间必须通过交流来解决各自承担任务之间的(20)问题,即通信问题。通信需花费时间和代价,会引起软件错误(21),(22)软件生产率。如果一个软件开发小组有n人,每两个人之间都需要通信,则共有(23)条通信路径。假设一个人单独开发软件,生产率是5000行/人年,且在每条通信路径上耗费的工作量是250行/人年。若4个人组成一个小组共同开发软件,则小组中每个人的软件生产率为(24)。若小组有6名成员,则小组中每个成员的软件生产率为(25)。因此,有人提出,软件开发小组的规模不能太大,人数不能太多,一般在(26)人左右为宜。A.分配B.管理C.接口D.协作请帮忙给出正确答案和分析,谢谢!
权威推荐: & &
为您推荐的考试题库
您可能感兴趣的试题
1(73)A.降低B.增加C.不变D.不确定2(74)A.降低B.增加C.不变D.不确定3(75)A.n(n+1)/2B.n(n-1)/2C.n(n-1)(n-2)/6D.n2/24(76)A.4875B.4375C.4625D.5735
我有更好的答案
电脑、移动端同步直播
请先输入下方的验证码查看最佳答案
图形验证:
验证码提交中……
每天只需0.4元
选择支付方式
支付宝付款
郑重提醒:支付后,系统自动为您完成注册
请使用微信扫码支付(元)
支付后,系统自动为您完成注册
遇到问题请联系在线客服QQ:
恭喜你被选中为
扫一扫-免费查看答案!
请您不要关闭此页面,支付完成后点击支付完成按钮
遇到问题请联系在线客服QQ:
恭喜您!升级VIP会员成功
提示:请截图保存您的账号信息,以方便日后登录使用。
常用邮箱:
用于找回密码
确认密码:欢迎来到作文网!
全站搜索:
工具作文,未来的交通工具作文,未来的通讯工具作文,写工具的作文
 有关工具的作文大全。交通工具作文,未来的交通工具作文,写一种交通工具作文,未来的工具作文,二年级交通工具作文,未来的通讯工具作文,家乡的交通工具作文,交通工具的变化作文,写
有关工具的作文大全。交通工具作文,未来的交通工具作文,写一种交通工具作文,未来的工具作文,二年级交通工具作文,未来的通讯工具作文,家乡的交通工具作文,交通工具的变化作文,写...新疆之行,我见识了一些有趣的代步工具。
在南疆我看到最多的交通工具就是驴,马路上、集市里、小道边、公路旁,驴无处不在。
听说驴是南疆重要的交通工具,除了市区,城郊和县城到处都是。驴只要拉着车就是多功能的交通工具,可以载物、载人。在南疆尤其是...未来的交通工具什么样子?我们谁也不知道。今天我设计一个我自己的交通工具.天牛汽车。一般汽车是用汽油和燃气,我的天牛只要用太阳光的能量就能快速行驶。它没有方向盘,是电脑触摸屏,和...未来的交通工具和现在的交通工具大不相同。因为现在的石油储量越来越少,未来的科学家就研发出了能利用太阳的能量来做动力的交通工具,这样不但可以大大的节约能源,而且可以环保。未来的交通工具比现在的方便多了,它长有像直升飞机一样的螺旋桨,像轮船一样的发动机,还有...万能工具箱作文550字 光阴荏苒,日月如梭,转眼间已是2036年了,我已经是一名杰出的科学家了。我发明了许多实用的东西,如多功能笔太阳能电池、超能飞行鞋其中最有特色的要属万能工具箱了...未来的交通工具100字 雨花实小二(5)班 长大了,想制造一种汽车,这种汽车和现在的汽车不一样。它能够在地上行驶,给它安装一个潜水器能在海里行驶。装一个隐形的折叠翅膀,能在空中飞行,...为确保生产、在配备必要的生产工具的同时,须加强工具领用的管理,以降低成本,提高企业经济效益。特制定如下规定:一、负责采购工具的部门无论是直接采购,还是委托采购,都必须确保工具质量,不得购进劣质工具,以次充好。凡新添门类,在试用中发现质量不符合要求,立即退...今天是星期天,爸爸妈妈要带我去阳澄湖郊游。一大早我迅速来到小区的太阳能燃料储备车库,车子的仪表盘上显示车子已备足了太阳能燃料。 爸爸坐上驾驶座打开了GPS液晶显示屏,说出了阳澄湖...【情 景】
  我在教二年级《巧用画图工具》这一课时,请学生分别在画图上画:水果、动物、人物,进行简单的评价后,我用涂涂绕绕的方法把学生画的这三样东西重新诠释,请学生观察我的画法,学生觉得很新奇,他们形容:“像龙卷风一样的!”但我发现,学生只是掌握了这种绘...卫生部落的生活哲理 武昌区实验小学五(E)班 王咏懿(第三讲) 抹布 抹布是一个喜欢干净的小姑娘,她最最最喜欢做的事是——泡“温泉”。瞧,水是她的沐浴露,洗洁精是她的高级洁净BB霜,...关交际工具普通话的手抄报 :天天说普通话 讲好普通话对我们的口语交通会变得更加方便,可以痛快的交流。手抄报的主要内容:说普通话的好处、描写四季的古诗名词、为什么要说普通话、普...未来的交通工具周记500字 哇哈!2088年的新型的交通工具现身了。它的名字交三合一什么叫三合一呢?应为它是由三种交通工具融合的哦! 第一种:飞机 现在的科技可发达了,世界上到处都是车。...周记未来的交通工具500字 坐在车子里,看着美丽的晚霞,十分惬意,但忽然被刺耳的汽车喇叭声给惊醒了。我感到十分扫兴,但谁叫这年头车多,路堵呢!这车主急呀。只有拿喇叭撒气儿,叭叭叭...语文必备工具及成立兴趣小组的建议
1、学习工具:
每个学生都要有&四个一&:一本现代汉语词典、一本摘抄本、一本字帖、一本高考优秀作文。
2、语文学习兴趣小组:
a、成立文学社,在校园内形成浓厚的读书、写作的氛围;
b、印发一中语文学习刊物,主要内容...未来的交通工具_飞行器作文200字 我设计了一个未来的交通工具,名字叫飞行器。 它有一双乌一样的翅膀和三个能滑行的轮子,飞行器的上方有一个绿色的螺旋桨,它的体积不太大,里面设有三四...未来的交通工具_一年级想象作文50字 我希望未来的电动车是能吸收人体静电的,因为四季人体都有静电,所以这样的电是应该不会用完的,如果自己的用完了,还可以吸收别人身上的静电。 这样...教材分析:   本节课选自《九年义务小学信息技术第二册》,本课以学生的动手、动脑、创新为主引导线,让学生自己学会利用画图程序,不但可以方便地画出直线,还可以画出曲线,认识曲线工具的图标。利用它,可以画出带有一个或两个弯儿的光滑曲线。本节课的一个重点是:激起...为了充实暑假生活,开阔视野,锻炼自己的社会实践能力,把自己的所学知识与实际工作相结合起来,经过一番努力,七月中旬,我来到**工具有限公司实习。
  **工具有限公司是一家机械及行业设备的企业,是经国家相关部门批准注册的企业,主营工具、刀具、刃具,公司位于中国*...我的发明_未来的交通工具作文250字 我设计了一个未来的交通工具,名字叫飞行器。 它有一双乌一样的翅膀和三个能滑行的轮子,飞行器的上方有一个绿色的螺旋桨,它的体积不太大,里面设有三...未来的交通工具_关于未来的想象作文200字 我未来的交通工具是一辆金光灿灿的高速快音,它用起来可方便极了,它不怕碰、不怕撞,还跑得很快很快。 它可以下海潜水、可以在天上飞、地上跑,...初中信息技术教师说课稿一、说教材的地位和作用本节内容主要介绍了视频编辑的三种常用方法,以及6种常用的视频编辑软件。内容的实用性是连接信息知识运用和学生接受操作的纽带,有利于培养学生的感知能力,动手能力,本节知识设置合理,内容丰富,具有很强的实用性和可操作性...教学目标:
1.通过教学使学生认识各种计算工具,对算盘和计算器有一定的了解。
2.培养学生学习数学的兴趣。
3.使学生感受生活中处处有数学。
教学重难点:认识算盘、计算器,计算器的使用。
教学关键:能够自学了解算盘与计算器的...说课稿:大班科学活动《劳动者的工具》 分析与思考:所谓工具,指的是人类在生产劳动时所使用的器具。它具有针对性使用对象或范围的特点,是人类在劳动实践中的智慧结晶。工具广泛存在于生活及各行各业中。人的一生都离不开工具的使用。对于大班幼儿来说,他的生活周围也充满...第九课时 课题计算工具的认识与使用课型新授 教学目标 知识与技能:1、使学生简单了解计算工具的发展(结绳记事、算筹等)2、向学生介绍我国的传统计算工具算盘,及其计算方法。3、使学生...
四年级下册语文第七单元作文大全,四年级下册第七单元作文,...
关于春游的日记大全。小学生春游日记,春游日记50字,春游日...

我要回帖

更多关于 通讯工具的发展史 的文章

 

随机推荐