问题驱动模式下的Android学习总结 part 01 时间:2019-05-12 03:56:47 收藏本文下载本文作者:会员上传 简介:写写帮文库小编为你整理了多篇相关的《问题驱动模式下的Android学习总结 part 01》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《问题驱动模式下的Android学习总结 part 01》。 第一篇:问题驱动模式下的Android学习总结 part 01 CryStal: 1 自己在看Mars-chen的Android视频 感觉不错 自己也总结了点学习笔记 是以视频顺序总结的简单知识点总结 感觉如果可以做出下面几个小任务那么视频中的知识点也就没有问题了 比较喜欢这种任务问题驱动式的学习模式: 目录: 001 Android系统的体系结构:.......................................................................2 002 Android和iPhone对比.........................................................................3 003 Android的四个非常重要的组件...............................................................3 004 Android的开发环境................................................................................4 005 Android赚钱方式....................................................................................4 006 Android开发环境的搭建.........................................................................4 007 开发一个最简单的Android实例程序.......................................................5 008 Android项目的目录结构.........................................................................5 009 Activity的主要作用/简述Activity...................................................6 010 设计一个简单的Activity.......................................................................6 011 Layout配置文件的几个简单的标签和其配置............................................6 012 将Activity和布局文件关联并简单在程序中修改空间............................7 013 简述Intent.............................................................................................8 014 为Button添加一个监听器实现点击按钮时激发短信发送程序...................9 015 TextView / EditText / Button / Intent / Menu 使用方法...10CryStal: 2 001 Android系统的体系结构:Android底层是一个Linux内核 有很多的驱动程序 提供一操作系统的最核心最基础的功能Linux之上是一些程序包 一般是C和C++编写的 比如OpengGL(做图形)SQLite(基于文本的数据库)以及一个Java虚拟机(是谷歌开发的手机版)之上是应用程序框架(Application Framework)Java 编写提供了开发程序的最基本的框架最上面的是Applications 这个就是我们要写的CryStal: 3002 Android和iPhone对比开发环境上 整个系统的基础上 开发语言 开发许可证开发出的程序的下载方式 对flash的支持 手机生产厂商 ……003 Android的四个非常重要的组件Activity: 负责处理外观 是应用程序的界面Intent: 负责应用程序之间传输数据的Service: 承担数据处理工作 在后台运行 是不可见的 Content Provider : 为应用程序提供数据 是一组接口CryStal: 4004 Android的开发环境Android SDK Eclipse Eclipse plugin for android:ADT005 Android赚钱方式出售程序(与google分成)添加广告(主流的赚钱方式)006 Android开发环境的搭建Android SDK的安装http://developer.android.com/index.html 需要使用翻墙软件 在SDK目录下选择相应的版本就可以了下载的SDK其实只是SDK的安装工具而已 运行后可以选择下载对应的下载信息SDK亦可以直接拷贝使用(建议将各个版本的SDK都下载下来 android7 就是2.1 android8 就是2.2)将tools中有很多可执行文件 将其目录添加到path中ADT的安装和配置ADT 是 Eclipse插件 所以有Eclipse和jdk Jdk建议jdk 6.0 比较快 Eclipse推荐3.5以上ADT插件可以在Eclipse->help->Install new plugin->从网路上下载 路径官网上有介绍 https//dl-ssl.google.com/android/eclipse也可以找到压缩包解压后直接拷贝到Eclipse目录下的plugin下 在Window-> Preferences-> android-> sdk的安装路径Android模拟器的配置在Android SDK and AVD Manager 里面添加new 而后启动CryStal: 5007 开发一个最简单的Android实例程序New Android Project 配置Build Target(版本兼容问题)Application name : 应用程序的名字 Package name: 每一个应用程序有一个包名 存入手机的时候是的目录结构有关 Create Activity: 开发工具辅助创建 Min SDK Version : 4 最低SDK版本008 Android项目的目录结构Src: 源文件Gen:开发工具自动生成的 R.java 很重要 用于资源的查找 Android.jar android开发环境的Jar包 Assets:放置文件 任何的Res放置文件 有子目录结构 而且所有文件都会在R.java中生成id 可以在程序中查找Drawable-hdpi 放图片 高分辨率Drawable-ldpi 放图片 低分辨率Drawable-mdpi 放图片 中分辨率字程序会自动选择使用何种分辨率Layout: 布局文件 用于负责Activity的布局.xml格式 不可以使用大写名 Values: 包含着一些基础的文本信息的存储 有利于程序的国际化 AndroidManifest.xml Android程序的总的配置文件 如图 用于设置初始化CryStal: 6 009 Activity的主要作用/简述Activity Activity是负责Android中的显示效果 Activity是由很多控件组成 它是一种很重要的用户接口 由于手机的屏幕和硬件特性 合理恰当的设计Activity显得尤为重要010 设计一个简单的Activity 1 一个Activity就是一个类 并且要继承android.app.Activity 2 重写void onCreate(Bundle saveInstaceState);Activity被首次调用的时候 系统就会调用这个Activity的onCreate()方法 3 在manifest中注册Activity Activity要在Application标签下 比较重要的信息是 Activity的名字(类名)标签 个别的Activity还需要配置为程序的入口Activity 4 为Activity添加布局文件 里面包含很多控件 并在onCreate()中将这个Activity与这个布局文件关联011 Layout配置文件的几个简单的标签和其配置Android:orientation 组织结构 垂直/水平vertical/Honer…Android:layout_width 宽度 安内容扩展 填充父控件Android:layout_height 高度 图示:Android:id 可以通过程序查询到这个组建 eg:”+id/XXX”Android:text 可以调用strings.xml中的内容 eg:@string/XXX 按钮 … …CryStal: 7 012 将Activity和布局文件关联并简单在程序中修改空间Public void onCreate(Bundle saveInstanceState){ Super.onCreate(saveInstanceState);//Activity与布局文件的关联setContentView(R.layout.main);TextView myTextView =(TextView)findViewById(R.id.XXX);myTextView.setText(“我对我自己的空间设置的新值”);} 图示:CryStal: 8 013 简述Intent Intent用于Android程序中的数据传递 可以实现Activity之间的传递 传递方式如下Intent(意图)详细叙述: Intent负责Android的数据传输 有点想web中的请求 传输的信息包括 Intent的作用不仅仅在Activity之间 还有很多 Component name : 决定Intent启动那些组建Action : 决定Intent启动了新的组建后 这个组建需要做哪些行为 Date : URI….不是很懂Extras : 额外的 键值对 用于存储简单的传输数据 Flags 使用较少 Category 使用较少CryStal: 9014 为Button添加一个监听器实现点击按钮时激发短信发送程序//声明一个Button Private Button myButton = null;//获取到这个Button myButton =(Button)findViewById(R.id.myButton);//为Button添加监听器myButton.setOnClickListener(new MyButtonListener());//设计监听器内部类: Class MyButtonListener implements onClickListener{ Public void onClick(View v){ //点击按钮后的内容:生成一个Intent对象: Intent intent = new Intent();intent.putExtra(“键”,”值”);//都是字符串 取得的方法是:getIntent.getStringExtra(“键”)是在另一个Activity中//同过当前的Activity到OtherClass的Activity} }014-图示:Intent.setClass(MyClass.this,OtherClass.class);//发送Intent意图MyClass.this.startActivity(intent);CryStal: 10 015 TextView / EditText / Button / Intent / Menu 使用方法 开发一个Activity(两个,一个是初始化 一个是跳转)2 在manifest中配置 在layout中添加布局文件 包括各个细节信息和文本值 4 在Activity中与配置文件关联 添加Button监听器 并在监听器中添加跳转事件 6 在跳转后的Activity中处理putExtra信息 并显示 为整个程序添加一个menu并实现点击退出选项后 关闭当前Activity 退出系统 1-6 之前有所讲述 不详写了 7: menu的添加和事件的添加@Overridepublic boolean onCreateOptionsMenu(Menu menu){} @Overridepublic boolean onOptionsItemSelected(MenuItem item){ 为了确保menu的操作有效不要将menuitem的id设置成相同的值!!? 待考证 If(item.getItemId == 1){ } } return super.onOptionsItemSelected(item);finish();// 好像是不是退出程序只是结束当前的Activity 待考证menu.add(0, 2,2, “第0组 第二项”);//(组的id 当前菜单项的id ,排序, 显示的内容)menu.add(1, 1, 2, “第1组 第二项”);menu.add(1, 2, 1, “第1组 第一项”);menu.add(0, 1, 1, “第0组 第一项”);menu.add(1, 3, 3, “第1组 第三项”);menu.add(1, 4, 4, “第1组 第四项”);menu.add(1, 5, 5, “第1组 第五项”);return super.onCreateOptionsMenu(menu);//当排序相同时 会按源代码编写顺序加载//做完这些基本上这几个空间的简单使用也就会了第一部分结束感谢mars-chen的视频 , 此部分文档对应该视频第一部分1-6节,个人能力有限,文档内容绝对准确性本人无法保证,仅供参考,希望可以对其他Android爱好者有所帮助第二篇:Android学习总结Android学习总结零零碎碎的总结:1.客户端的功能逻辑不难,UI界面也不难,但写UI花的时间是写功能逻辑的两倍.2.写代码前的思考过程非常重要,即使在简单的功能,也需要在本子上把该功能的运行过程写出来.3.要有自己的知识库,可以是一个工具类,把写过的,看过的好的代码放进去,也可以是一个笔记本软件.因为只有放在知识库里的东西,才是你最重要的财富.4.如果你想做自由职业者,你需要学英语,因为在国外的盈利比国内多很多.如果你想进大公司,好公司,你需要学英语.你想深入学习android,但中文的android文章太少了,你查查百度,到处都是copy来copy去的hellword,所以,你需要学英语.如果你想出国,你需要学英语.5.Http协议要研究透彻.http的信息头有什么信息,分别代表什么,信息体有什么信息,代表什么,都要搞的明明白白.scoket也是一样.6.在eclipse里的layout文件都有graphical Layout.通过这个好好的把UI调整好.7.Android里的junit每次运行都会打包新的apk到设备上跑.效率非常慢.如果是跟android无关的测试,最好自己建立一个单纯的java项目做测试.8.面试的时候不要觉得自己提的薪水太高,物以稀为贵明白吗?不管你的期望薪资多少,都有可能实现,这只是时间问题.9.如果一家小公司通过猎头找到你,即使公司在小,也比外面那些40,50人的公司还要好.不要觉得公司不行,担心会倒闭.放心吧,至少活1年是没问题的.10.不要把自己绑在android上,有空也研究下IOS(最近小弟就准备研究ios,刚买了6本书...).11.移动互联网最少还有10年的快速增长.android最少还有两年的快速增长.走android这条路是不会错的.12.有空多学点开放平台的SDK.比如新浪微博,腾讯微博,淘宝平台,支付宝移动支付平台,快钱移动支付平台等等..这些都是不愁没市场的.13.即使技术再差,也要发布一个应用到market上去.因为这样你才了解做一个应用的逻辑.14.每个月拿到薪水省500-1000元出来.这些钱投在买学习资料,去培训班上课...在培训班,花再多的钱也是值得的.15.你真正的价值在项目经验和对底层的认识上.不要忽略基础知识.16.如果有空把Android的源代码看一下.底层的东西很枯燥,但这些很值得学.17..程序员其实是艺术家.代码重构和设计模式,是非常非常重要的东西,必须要学18.不要去维护一个项目,要去做一个项目.19.一开始不要轻易去大公司,虽然大公司是可以让你呆一辈子的.但你的起点低,以后成就也低.20:每天早上提前20分钟上班,5分钟把今天的工作计划写好.15分钟用来看各大It论坛的新闻.21:如果以前没做过java,那就把SSH看下,自己搭建一个小服务器.这是为了接私活用.22:PS一定要学,接私活用.23:多下载市面上好的应用,每天都用,只有这样你才能了解市场.现在所有的APK都可以反编译,看源代码麻烦,但看layout和图片很容易,所以....你懂的.24.要有羞耻心.25.老板仅仅要求你把东西做完,需求完成.但你必须对自己要更严格一点.写一段代码,从网上复制一份代码,并不是可以用就行了,你还必须明白他的原理,为什么这样就可以?这才是对你最有用的地方,这也是你今后薪资增长的保证.26.要懂得舍得.移动领域发展太快,必要时必须要用钱换时间.不然你会远远落后别人(我之前花了4000大洋去培训班学IOS三天).27.要明白自己想要什么,什么才能最大性价比提高你的能力.对我来说,能让我提高最大的,就是Android和IOS同时会,并且自己可以做架构设计.28.看android技术书籍最快的学习方法,先通读一次.然后把书本上的demo一个一个写出来.不要觉得太容易不去写.很多东西都是这样,看起来简单,但做起来难.最后再对照自己写出来的程序代码去理解书本的意思.29.应用和游戏是2个方向,没有一个公司会同时做游戏又做应用,即使是外包公司,大多也只做一块.专精一个就可以了.30.每次做完一个项目,要强迫自己做总结,通过这个项目,我学到了什么新技术?犯了哪些SB错误?31.一家小公司,如果有正式财务部,那肯定是正规的,不要担心欠薪问题.如果没有,就说不准了.bbs.12580life.com第三篇:Android学习总结 20110325专题Android学习总结在这段时间主要对Android平台有了一定的了解,对一些简单的设计也有了一定的掌握Android概念Android是一个基于Linux核心的开放手持设备(主要是手机)平台操作系统,与Windows Moble、Symbian等手机操作系统处于同一级别。“Android大奖赛“首页上列出的可能设计方向多媒体工具社交网络新闻、资讯工具环保、慈善协作生产力工具Android Developer Challenge(ADC)游戏实时资讯服务崭新的用户界面您想到的应用程序项目构架src/:源代码(sourse)目录“src”目录包含了“Android应用程序”各个程序源文件。对于上例 ”Bmi.java”是新 序项目中的主要程序块。gen/:自动生成(Generate)目录gen目录中存放所有自动生成的文件。最关键就是R.java,这个文件是自动产生的,与”res”目录下的XML文件内容同步更新。Android<版本号>/:参考函数目录此目录的作用是将AndroidSDK里所有可呼叫的类、方法函数,分门别类的列出,好方便开发者来参考。assert/:对此目录目前还不是太懂 res/:资源(Resource)目录res目录存放所有程序中用到的资源文件。在里边还有两个经常访问的目录,分别 “layout/:页面布局(layout)目录”和“values/:参数值(values)目录”“AndroidManifest.xml”是Android应用程序的功能列表,每个应用程序都在这个文件中,列出该程序所提供的功能。我完成的BMI程序此程序是我参考书上的例子所完成的程序。BMI,英文全称:Body Mass Index,中文名称:身高体重指数,是一个计算值,整个程序的思路是当我们在对应的文本框内输入身高(cm)、体重(kg),输入完成后按下“计算BMI”键,屏幕上就会显示计算结果,并弹出“你应该节食”、或“你应该多吃点”等健康建议的信息框。健康指标的计算方法是:身高(height)/(体重(weight)/100)只要BMI值超过25时就算偏胖、BMI值低于20就算偏瘦,介于这之间算正常。下面是我完成的程序界面:计算得到的BMI值是20.57,在20—25之间,体型正常。由于我对两个文本框内输入的内容进行了限制,因此只容许输入数字BMI值为25.56,信息框弹出“你该节食了”在界面的下侧有一个“健康小常识按钮”,当点击此按钮时,会链接到一个有关健康生活小常识的网页上:在每次点击“计算BMI值”按钮后首先会弹出一个消息框,消息框中包括两个按 钮,当点击确认按钮时消息框消失;当点击首页按钮时会连接到相应的网页下图为点击消息框确认按钮后显示的网页:总结通过这段时间的学习,对于Android平台的整个基本框架有了一定的了解,对程序整个运 及相互之间的调用流程也有了一定的掌握,但感觉自己java基本功比较薄弱,还得进一步学习。由于目前还没有什么想法,我打算在后面的一段时间内主要还是继续掌握这方面知识,做一个类似于计算器之类的小软件,以巩固我这方面的知识。在查阅资料方面我还有点欠缺,尤其比较怕读英文资料,这方面还得加强。第四篇:Android RIL&Call学习总结Android RIL与Call代码学习总结前言本文分五部分:Android电信业务系统、RIL、Telephony APP Framework、Phone APP、Android通话简单流程。1、Android电信业务系统主要叙述Android整个电信业务系统的软件架构。2、RIL主要叙述Android Radio Interface Layer相关要点,涉及的代码主要放在hardwareril目录下。3、Telephony APP Framework主要简述电信业务系统Framework部分代码相关要点,涉及的代码主要放在frameworksbasetelephony目录下。4、Phone APP主要叙述Android的电话业务模块,涉及的代码主要放在packagesappsPhone目录下。5、Android通话简单流程主要叙述从上层Phone APP发起电话的函数调用流程。一、Android电话业务系统简单的说由三部分组成:Telephony Application(Java)+ Telephony Frameworks(Java)+ RIL(C/C++)二、RIL RIL(Radio Interface Layer),是Android电信业务系统和底层硬件之间的抽象层,Android提供该层方便用户移植。手机每次请求相应的电信服务,如电话、短信、网络连接等,都是通过AT指令与底层硬件进行交互的,拿电话来讲,用户请求拨打电话,需要向RIL发送相关的请求,接着RIL按照用户的请求,调用相应的AT指令发送接口给底层发送AT指令,完成用户拨打电话的流程。简单的说,对RIL的移植,主要是针对不同的设备针对AT指令做相应的修改。1、RIL移植层的三个组成部分1)Vendor RIL 提供AT指令发送接口 2)RIL Daemon 加载RIL相关的库同时初始化RIL,注册RIL相关函数接口。同时,RILD也是上层和底层RIL的调用中转站。3)RIL JNI Layer RIL JNI接口,提供上层Telephony APP Framework调用2、RIL的初始化流程加载ril.lib RIL_Init() RIL_register(),详细可见ridl.c中的main()函数。3、RIL接口的调用方式有两种方式:主动请求(Solicited)和被动请求(Unsolicited)1)主动请求2)被动请求void(*OnUnsolicitedResponse)(int unsolResponse, const void *data,size_t datalen);4、涉及的主要源代码文件1)reference-ril.c 本文件涉及的重要内部函数及功能 requestRadioPower开启通讯模块 requestQueryNetworkSelectionMode 查询网络模式 requestGetCurrentCalls获取当前通话 requestDial请求呼叫 requestWriteSmsToSim写入短信至SIM卡 requestHangup挂断电话 requestSignalStrength获取信号强度 requestRegistrationState获取卡注册状态 requestOperator获取运营商名称 requestSendSMS请求发送短信 requestSetupDataCall拨号上网 requestSMSAcknowledge短信回报requestEnterSimPin请求输入SIM PIN码 requestSendUSSD请求USSD业务 本文件提供给ril.cpp调用的外部接口 RIL_InitRIL初始化 onRequestAT请求指令接口(异步方式)getVersion获取RIL版本号,当前为“android reference-ril 1.0” onUnsolicitedAT请求指令接口(同步方式)2)ril.cpp 该文件主要提供ril.java调用接口,实现RIL的JNI调用方式、RIL Event管理机制 实现了供上层调用的接口 typedef struct {int requestNumber;void(*dispatchFunction)(Parcel &p, struct RequestInfo *pRI);int(*responseFunction)(Parcel &p, void *response, size_t responselen);} CommandInfo;具体执行的操作可以看头文件ril_commands.h 举一个例子:拨打电话,对应的requestNumber为RIL_REQUEST_DIAL,对应的dispatchFunction为dispatchDial,对应的responseFunction为responseFunction。 RIL Event管理与ril_event.cpp的Event接口配合实现RIL Event管理 RIL_startEventLoop rilEventAddWakeup eventLoop ril_event_init ril_event_set ril_event_add ril_event_del 4)rild.c rild的主要初始化工作都在main函数中进行。5、RIL JNI上层对外接口SetOnNITZTimegetIccCardStatussupplyIccPinsupplyIccPuksupplyIccPin2supplyIccPuk2changeIccPinchangeIccPin2getCurrentCallsgetPDPContextList dialgetIMSIgetIMEIgetIMEISVhangupConnectionacceptCallrejectCallgetLastCallFailCause getLastPdpFailCause getLastDataCallFailCause setMutegetMutegetSignalStrengthgetRegistrationState getGPRSRegistrationState getOperator设置网络身份和时区 获取SIM卡状态 输入PIN码 输入PUK码 输入PIN2码 输入PUK2码 修改PIN码 修改PIN2码 获取当前通话 获取PDP列表 拨号获取IMSI 获取IMEI 获取IMEISV 挂断电话 接听电话 电话拒接获取Call失败错误码 获取PDP失败错误码 获取拨号连接失败错误码设置手机静音模式(静音/非静音)获取手机静音模式(静音/非静音)获取信号强度 获取卡注册状态 获取GPRS注册状态 获取运营商 sendDtmfstartDtmf stopDtmf sendSMS deleteSmsOnSim writeSmsToSim发送DTMF Start DTMF Stop DTMF 发送短信删除SIM卡短信 保存短信至SIM卡6、RIL机制RIL类有三个内部类:RILRequest、RILSender、RILReceiver,这三个内部类共同实现上层的电信业务操作请求。RILRequest,电信服务请求,上层应用通过该类与RIL JNI层进行消息的交互,同时RIL JNI层也通过该类与RIL底层进行消息的交互; RILSender,实现上层请求的命令发送 RILReceiver,负责接收底层的Response 以下是dial的RIL调用序列 上层调用dial 设置Request请求并发送至RILSender消息处理队列RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result);…send(rr); RILSender消息处理队列消息队列收到EVENT_SEND后往mSocket里边填写相应请求 RILD从mSocket中读取相应的请求为RIL_REQUEST_DIAL,并设置相应的event 执行dispatchDial onRequest requestDial发送AT指令底层给予responseVoid的响应RILD向mSocket填写相应的响应信息,并往RILReceiver消息队列发送 processResponse processSolicited responseVoid(JNI)三、Telephony APP Framework概述电信业务Framework涉及Call、SMS、SIM卡、PDP等,代码分为两个部分,一个是SDK API,一个是平台内部类,不对外开放。这部分简单的说,就是上层电信业务与底层RIL的中间层。1、Internal Class 1)ADN(Abbreviated Dialing Numbers,缩位拨号)相关的类 AdnRecord AdnRecordCache AdnRecordLoader 2)Call相关的类Call:基类,GsmCall和CdmaCall都由该基类扩展实现 CdmaCal GsmCallCallTracker:基类,GsmCallTracker和CdmaCallTracker都由这个基类进行扩展实现 GsmCallTracker: CdmaCallTracker PhoneBase:基类,CDMAPhone和GSMPhone都由这个基类扩展实现 CDMAPhone GSMPhone Phone:电话操作的一些接口 CallerInfo CallerInfoAsyncQuery CallForwardInfo:呼叫转移CallFailCause:GSM Call失败错误码 CallFailCause:CDMA Call失败错误码 3)数据连接相关类DataConnection:基类,GsmDataConnection和CdmaDataConnection都基于该类扩展实现 GsmDataConnection CdmaDataConnection DataConnectionTracker:基类,CdmaDataConnectionTracker和GsmDataConnectionTracker都基于该类进行扩展实现 CdmaDataConnectionTracker GsmDataConnectionTracker 4)SIM卡相关类IccCard:基类,RuimCard和SimCard都由该类进行扩展实现 RuimCard SimCard IccRecords:基类,RuimRecords和SIMRecords都基于该类进行扩展实现 RuimRecords SIMRecords IccProvider IccUtils 5)SMS相关类SMSDispatcher:实现发送短信SmsMessageBase:基类,SmsMessage由该类扩展实现 SmsMessage:短信PDU包解析2、SDK API Class 实现SDK API接口,具体架构见SDK API文档四、Phone APP Android自带一个Phone App,实现了GSM/CDMA的通话功能,这部分代码放在packagesappsPhone目录下。Phone APP开机就运行了,可以从AndroidManifest.xml设置的应用权限看出来。开机做如下初始化工作:A、初始化Telephony Framework B、Power、Ringer、Keyboard、状态栏、SIM卡的注册工作 C、CallNotifier、PhoneUtils初始化工作 具体可以参见onCreate Phone APP有如下几个重要的类 PhoneApp requestWakeState:判断手机是否可休眠 wakeUpScreen:唤醒手机PhoneAppBroadcastReceiver:内部类,可以实时监测手机的状态,飞行模式、蓝牙耳机等。 PhoneUtils 电话基本组件接口,实现电话的一些基本操作,如Dial、Answer、Hangup、Hold等 placeCall:电话呼出 Hangup:挂断电话 answerCall:接听电话setMute/ setMuteInternal:静音 turnOnSpeaker:免提showIncomingCallUi:显示来电界面 InCallScreen 该类实现通话界面流程,主要如下:case R.id.menuAnswerAndHold,保持当前通话并接听: internalAnswerCall PhoneUtils.answerCall(mPhone)case R.id.menuAnswerAndEnd,结束当前通话并接听:internalAnswerAndEnd PhoneUtils.answerAndEndActive(mPhone)case R.id.menuAnswer,接听:internalAnswerCall PhoneUtils.answerCall(mPhone)case R.id.menuIgnore,忽略:internalHangupRingingCall PhoneUtils.hangupRingingCall(mPhone)case R.id.menuSwapCalls,切换通话:internalSwapCalls PhoneUtils.switchHoldingAndActive(mPhone)case R.id.menuMergeCalls,合并通话: PhoneUtils.mergeCalls(mPhone)case R.id.menuManageConference,管理电话会议:setInCallScreenMode(InCallScreenMode.MANAGE_CONFERENCE)case R.id.menuShowDialpad,显示拨号键盘: onShowHideDialpad mDialer.openDialer(true)case R.id.menuSpeaker,免提:onSpeakerClick PhoneUtils.turnOnSpeaker case R.id.menuBluetooth,蓝牙: onBluetoothClick case R.id.menuMute,静音:onMuteClick PhoneUtils.setMute case R.id.menuHold,通话保持: onHoldClick case R.id.menuAddCall,添加通话: PhoneUtils.startNewCall(mPhone)case R.id.menuEndCall,结束通话: internalHangup PhoneUtils.hangup(mPhone) DTMFTwelveKeyDialer 该类实现DTMF processDtmf:发送DTMF clearDigits:清除DTMF键码 startDtmfTone:播放DTMF Tone stopDtmfTone:停止播放DTMF Tone CallNotifier 继承于Handler,用来实时监测通话状态并通知Phone Application,如PHONE_NEW_RINGING_CONNECTION(来电),PHONE_INCOMING_RING(来电响铃),PHONE_DISCONNECT(通话挂断),PHONE_BATTERY_LOW(电池电量低),具体相对应的处理可参见handleMessage CallFeaturesSetting 实现通话设置,此外该类包含一个内部类VoiceMailProviderSettings用来实现语音信箱的设置 CallCard/ InCallTouchUi 这两个类都是继承于FrameLayout,Phone用来实现通话自身的布局需求。updatePhotoForCallState:更新替代图片(如果通话号码有设置特定代替图片的)updateDisplayForConference:通话UI更新(用于电话会议)updateDisplayForPerson:通话UI更新getCallFailedString:获取通话失败错误字符串 displayOnHoldCallStatus:显示通话保持UI displayMainCallStatus:更新通话UI updateState:更新通话状态(供外部类调用) BluetoothHandsfree/BluetoothHeadsetService 实现通话蓝牙耳机功能,其实现核心是BluetoothHeadsetService,在PhoneApp 创建的时候会启动它。BluetoothHeadsetService 通过接收底层蓝牙服务的状态消息来改变自身状态,同时它也会监听通话的状态变化。onBluetoothEnabled:开启蓝牙设备 onBluetoothDisabled:关闭蓝牙设备 connectHeadset:连接蓝牙设备 audioOn:开启audio audioOff:关闭audio redial:通过蓝牙设备重播电话 updateBatteryState:更新电池强度 updateSignalState:更新信号强度五、Android通话简单流程1、拨打流程(以电话本入口为例)进入电话本,以某个联系人发起呼叫,此时进入TwelveKeyDialer类的onClick函数case R.id.dialButton分支,启动OutgoingCallBroadcaster Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//以新的TASK启动 OutgoingCallBroadcaster发出Broadcast Announcement sendOrderedBroadcast(broadcastIntent, PERMISSION,new OutgoingCallReceiver(), null, Activity.RESULT_OK, number, null);收到Broadcast后,进入OutgoingCallReceiver中的doReceive启动InCallScreen 进入internalResolveIntent mInCallInitialStatus = internalResolveIntent(getIntent());placeCall PhoneUtils.placeCallVia/ PhoneUtils.placeCall Connection cn = phone.dial(number);Phone是Interface,所属的dial接口是在PhoneBase的子类GSMPhone中实现 进入GsmCallTracker类中的dial函数 mCT.dial(newDialString);调用CommandsInterface的dial接口cm.dial(pendingMO.address, clirMode, obtainCompleteMessage());CommandsInterface的dial接口是在RIL.java中实现的 调用JNI接口dial ……后续就是RIL JNI与libril的交互过程,见RIL机制2、来电流程CallNotifier的消息处理队列会收到PHONE_NEW_RINGING_CONNECTION onNewRingingConnection响铃或震动(来电自动接听也在里边处理)显示来电界面InCallScreen PhoneUtils.showIncomingCallUi();3、来电处理 接听internalAnswerCallPhoneUtils.answerCall(mPhone)关闭来电铃声等,进入接听流程phone.acceptCall()调用GsmCallTracker的acceptCall mCT.acceptCall();调用CommandsInterface acceptCall 接口 cm.acceptCall(obtainCompleteMessage())调用RIL JNI接口acceptCall向底层发送请求……后续就是RIL JNI与libril的交互过程,见RIL机制 挂断 internalHangup PhoneUtils.hangup(mPhone) 调用GsmCallTracker的handup 调用CommandsInterface hangupConnection接口cm.hangupConnection(conn.getGSMIndex(), obtainCompleteMessage());调用RIL JNI接口hangupConnection向底层发送挂断请求 ……后续就是RIL JNI与libril的交互过程,见RIL机制 通话保持恢复PhoneUtils.switchHoldingAndActive(mPhone) 添加一个新通话,实现多方通话 PhoneUtils.startNewCall(mPhone)Android_Phone源代码来电流程解读***************************CallNotifier***************************本类extends Handler并且implements CallerInfoAsyncQuery.OnQueryCompleteListener电话状态改变之后本类会接到Message,然后本Handler通过Message的不同,进入不同的case:然后调用不同的方法处理各种状态改变。同时实现了OnQueryCompleteListener接口,当来电的时候会帮助执行查询操作,比如查询并调用Ringer设置响铃方式。当来电时,本类会接受到一个PHONE_NEW_RINGING_CONNECTION(Message.what),然后调用对应的方法onNewRingingConnection(),该方法又会调用startIncomingCallQuery()方法,该方法就查询用户设置的铃声(可能是系统的,也可能是用户自定义的),如果查询完成则直接调用onQueryComplete().假如执行超时的话,将会发送一个延时Message,延时后将默认调用系统的铃声。假如在延时发送Message过程中Query已经完成,由于CallNotifier实现了OnQueryCopleteListener,就会自动调用onQueryComplete()方法,该方法将会首先把可能存在的延时Message给Remove,以防止再次设置铃声。接着调用onCustomRingQueryComplete()方法。然后该方法里面会调用Ringer的ring()方法启动响铃。********************************Ringer*************************** Ringer的ring()方法会启动相应的响铃方式。响铃之后将会又Message发送,其内容为PHONE_STATE_CHANGED*******************************InCallScreen**********************InCallScreen将会接受到发送的PHONE_STATE_CHANGED消息,然后调用onPhoneStateChanged()方法该方法将更新屏幕,CallNotifier的onCustomRingQueryComplete里也会通过PhoneUtils.showIncomingCallUi()来启动InCallScreen屏幕。然后由InCallScreen处理,处理方式与前面打电话的大体一致,不过该类第一次调用时执行了onCreate()方法,但是以后执行都是从onNewIntent()开始.第五篇:Android的学习总结Android学习总结Android的学习总结现在对于Android的学习已有斗个学期了,但它对我来说其实还是一个大大的谜,还有待我去对它一一揭晓。在还没有学习Android这门课之前,当听到别人谈到它时,知道它离我们很近,但是它给我的感觉却是那么的神奇,一直就是在听说着关于Android系统怎么怎么的新闻,知道它就在我的生活中,离我很近,我也在用它,但还是总有一种很遥不可及的感觉,觉得它不在我的思想里,所以呢,对于这门课《Android系统开发与实践》的学习很是期待的。在上一个学期快要结束的时候,就听到老师说了一下,说下一个学期我们可能会学习Android系统的开发,他还说这个Android系统的开发很值得学习,很值得我们去探索,说这个Android还一直在开发中,是一项很好玩的系统,当时就很是兴奋了,总是会在想Android系统到底是怎样的,它是如何的深入我们的生活,又是如何的到我们所用的这些设备当中的,这一切都让我感到很好奇。就这样带着一系列的问题走进了 这个学期,终于就要与它见面了,这门课也就在这样的背景下,这样的一种环境下走进了我的课堂,它给了我一种兴奋感,对于它的出现,我很是期待的,一开始老师就给我们讲解了一些关于Android的知识,也给我们展示了Android系统开发的平台,真的给了我一种奇妙的感觉,它不仅有编译,它还有一个模拟器,就和我们用的手机一模一样,上面也有简单的几个图标:电话、短信等等,真的感觉到了不可思议,感觉到一种神秘,Android系统的开发就是在这样的一个平台上完成的,你可以对它进行你想要的修改,只要是你想到的,你都可以支尽情的尝试,这让人兴奋。这门课的学习从这里就这样开始了,《Android系统开发与实践》这本课本它是以讨论Android系统平台为基础,并结合实例讲解教程和实践指导类教材。本书中全方位的讲解了Google开放移动应用平台Android的各种特性,深入探讨了应用程序的基本组件、界面布局的基础,结合Internet实现通讯录的设计和发送短信实例详细介绍了Android系统平台开发 1Android学习总结 的步骤和方法,从而实现对Android系统的平台开发的深入了解。基于嵌入式技术的Android是目前增长速度最快的智能3G手机操作系统,其底层系统是以Linux内核为基础,用C语言开发;中间层包括函数库library和虚拟机Dalvik,用C++语言开发;上层应用软件,包括通话程序,短信程序等,用Java语言开发。所以,要想好好的学习Android系统的开发,那就必须掌握C++和Java语言,它们都是基础。Android学习并不是那么的容易,你得很努力很认真的去学习,但如果只是浅浅的了解,那就简单得多,但并不是这样的,你得更加深入的去学习,你才算是懂一点。Linux是Android开发的基础,Linux是一套免费使用和自由传授的类UNIX操作系统,它速度快,运行稳定,对硬件的配置要求低,兼具了其他系统的优点,最关键是可以免费使用,所以Linux得到了迅猛的发展,我们学习Android的开发就得了解Linux,它常用的一些操作命令是我们必须要理解和掌握的,比如说:su命令,它是最基本的命令之一,常用于不同用户间切换。例如,如果登录用户为user1,要切换为user2,则用如下命令——$su user2 就行了;pwd命令,用于显示用户当前所在的目录;cd命令,不仅显示当前状态,还改变当前状态,它的用法跟DOS下的cd命令基本一致;ls命令,它跟DOS下的dir命令一样,用于建立磁带备份系统,目前广泛用于建立文件发布档案;gzip命令,用于压缩文件;mkdir命令,用于建立目录,跟DOS下的md命令用法几乎一样的;cp命令,用于复制文件或目录;rm命令,用于删除文件或目录;mv命令,用于移动文件和更多文件;reboot命令,重启命令;halt命令,关闭命令。这些都是我们学习Android系统所必须掌握的。Android系统的开发更离不开Java,Java是一种简单的,面向对象的,分布式的,解释执行的,健壮的,安全的,结构中立的,可移植的,高效率的,多线程的和动态的语言,Java在Android平台开发中的应用起到了很关键的作用,Android的开发需要Java的上引动开发工具,Eclipse开发工具就是目前最主流的Java开发工具,Eclipse本身只是一个框架平台,2Android学习总结但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性,许多软件开发商以Eclipse为框架开发自己的IDE。Android的学习真的不是那么容易的,就一个平台的搭建就已经难到了我,就这样一个开发平台它得有一个Java的环境,还要有IDE等等,花了一大半的时间终于搭建了一个框架,它的一些插件必须要在线的升级,就是说必须要有网才行,这是一件很难熬的事,但等到搭建好后,那是一种成就感,通过学习让我知道了Android系统也有它的不足之处:安全和隐私,由于手机与互联网的紧密联系,个人隐私很难得到保护,互联网的深入发展也将会带来新一轮的隐私危机;运营商仍然能够影响到Android手机;同类机型用户减少:在不少手机论坛都会有针对某一型号的资源,而对于Android平台手机,由于厂商丰富,产品类型多样,这样使用同一款机型的用户越来越少,缺少统一机型的程序强化;过分依赖开发商,缺少标准的配置等等的,这些的不足都在等待我们去探索。Android系统平台的结构有:应用程序层,应用程序框架层,运行库层,Linux内核层。只有了解了这些才能助我们更好的学习Android系统,Android系统开发的相关环境必须安装并配置好,这是一个细活:第一得安装Java环境,然后还得修改Javadoc的link。第二设置环境变量,第三就安装repo,第四得在线下载Android源码并更新,第五是编译Android源码并得到~/project/Android/cupcake/out目录,第六在模拟器上运行编译好的Android源码,第七编译linux kernel,第八是编译模块,第九编译SDK。这个安装步骤我们得一步一步的做好,如果有哪一步做错了,就会影响到最终的结果。当你把所有的准备工作做好后,创建一个新的Android项目,你就会有一点点的兴奋与成就感,那是一种很自豪的一种享受。在Android系统的开发过程当中我们要了解和熟悉源码的获得,源码树结构分析、Android源码简要分析、还有Android的移植,作为一个Android开发者,必要的时候阅读下Android源码可以拓宽一下自己的视野和对Android的认知程度,Google的Android的源 3Android学习总结码管理仓库用的是Git。Android是一个开源手机终端系统,基于Linux内核,我们可以下载一个Git客户端,在Windows下安装Git的客户端软件很方便的,安装完成后,我们建立一个文件夹,就可用于存放将要下载的源码,主机编译工具和仿真环境,对于这些目录和文件我们还要求会背下来,但得了解,了解它们是我们学习Android系统开发更加的轻松了。要想学习好Android系统的开发,我们光学一些理论性的知识,那是远远不够的,我们得把理论与实践结合起来,才能起到事半功倍的效果,本来对于Android系统开发的学习就应该从实践当中去深入的,在学习的过程中,我们要有足够的耐心和足够的时候,去练习,去实践。在这门课当中的实例,比如,打电话,就让我们眼前一亮了,我们一直以来每天在做的打电话就是这样来的,这个实例提起了我们对Android系统的又一兴趣,Android系统的开发不仅给我们的生活带来了便利,也给我们带来了欢乐。这以上就是这一段时间来我对Android系统开发的学习的一个总结与一个体会,Android系统的开发真的让我长了不少的知识,也带来了不少的见识,虽然我对于它的掌握还不那么的深,学习的也还不足,但我还是会一直坚持的学习下去,因为它的奇妙,因为我们的生活需要它,它的开发是永无止境的,它的学习也将是永无止境的。