第一篇: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 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_Init
RIL初始化 onRequest
AT请求指令接口(异步方式)
getVersion
获取RIL版本号,当前为“android reference-ril 1.0” onUnsolicited
AT请求指令接口(同步方式)
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上层对外接口
SetOnNITZTime
getIccCardStatus
supplyIccPin
supplyIccPuk
supplyIccPin2
supplyIccPuk2
changeIccPin
changeIccPin2
getCurrentCalls
getPDPContextList dial
getIMSI
getIMEI
getIMEISV
hangupConnection
acceptCall
rejectCall
getLastCallFailCause getLastPdpFailCause getLastDataCallFailCause setMute
getMute
getSignalStrength
getRegistrationState getGPRSRegistrationState getOperator
设置网络身份和时区 获取SIM卡状态 输入PIN码 输入PUK码 输入PIN2码 输入PUK2码 修改PIN码 修改PIN2码 获取当前通话 获取PDP列表 拨号
获取IMSI 获取IMEI 获取IMEISV 挂断电话 接听电话 电话拒接
获取Call失败错误码 获取PDP失败错误码 获取拨号连接失败错误码
设置手机静音模式(静音/非静音)获取手机静音模式(静音/非静音)获取信号强度 获取卡注册状态 获取GPRS注册状态 获取运营商 sendDtmf
startDtmf 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 GsmCall
CallTracker:基类,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、来电处理
接听
internalAnswerCall
PhoneUtils.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系统平台开发 1
Android学习总结 的步骤和方法,从而实现对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本身只是一个框架平台,2
Android学习总结
但是众多插件的支持使得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的源 3
Android学习总结
码管理仓库用的是Git。Android是一个开源手机终端系统,基于Linux内核,我们可以下载一个Git客户端,在Windows下安装Git的客户端软件很方便的,安装完成后,我们建立一个文件夹,就可用于存放将要下载的源码,主机编译工具和仿真环境,对于这些目录和文件我们还要求会背下来,但得了解,了解它们是我们学习Android系统开发更加的轻松了。
要想学习好Android系统的开发,我们光学一些理论性的知识,那是远远不够的,我们得把理论与实践结合起来,才能起到事半功倍的效果,本来对于Android系统开发的学习就应该从实践当中去深入的,在学习的过程中,我们要有足够的耐心和足够的时候,去练习,去实践。在这门课当中的实例,比如,打电话,就让我们眼前一亮了,我们一直以来每天在做的打电话就是这样来的,这个实例提起了我们对Android系统的又一兴趣,Android系统的开发不仅给我们的生活带来了便利,也给我们带来了欢乐。
这以上就是这一段时间来我对Android系统开发的学习的一个总结与一个体会,Android系统的开发真的让我长了不少的知识,也带来了不少的见识,虽然我对于它的掌握还不那么的深,学习的也还不足,但我还是会一直坚持的学习下去,因为它的奇妙,因为我们的生活需要它,它的开发是永无止境的,它的学习也将是永无止境的。
第四篇:Android BroadcastReceiver学习总结
Android BroadcastReceiver学习总结
BroadCast(广播),概念:一种在系统内进行通信的机制.通过这种机制,它能够将系统中的某个进程的信息或者意图传递到其他的对这些信息或者意图感兴趣的进程.广播发送者:想要主动传递自己的信息或者意图给系统或者特定的接收者,以便其作出响应.广播接收者:想要接收系统或者特定进程的某些信息或意图,以便作出相应的响应.Android广播机制包含三个基本要素: 广播(Broadcast)-----用于发送广播。
广播接收器(BroadcastReceiver)-----用于接收广播。
意图内容(Intent)-----用于保存广播相关信息的媒介。
广播的过程:首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用Context.sendBroadcast()、Context.sendOrderBroadcast()方法,把Intent对象以广播的方式发出去。当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的Intentfilter是否与发送的Intent相匹配,若匹配就会调用BroadcastReceiver的void onReceive(Context curContext, Intent broadcastMsg)方法,onReceiver()方法执行完成后,BroadcastReceiver的实例就会销毁。
sendBroadCast():发送普通广播可以在同一时刻被所有接收者收到
优点:消息传递效率高
缺点:各个接收者之间无法通信,无法终止消息传播
sendOrderedBroadCast:发送有序广播
接收者将按预先声明的优先级依次接收广播消息 优先级设置: android:priority(-1000∽1000)数越大级别越高 也可调用IntentFilter对象的setPriority()设置
上一个接收者可往广播中压入数据传递给下一个接收者
任意一个接收者都可终止广播的传播,下一个就不能接收 注意:
如果找不到合适的BroadcastReceiver组件,应用不会有任何问题。onReceiver()方法不能在10秒执行完成,会认为该进程无响应。弹出ANR(application no response)的对话框。
源代码实例如下: 发送普通广播: Aactivity:
protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button =(Button)findViewById(R.id.button1);button.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0){ Intent intent = new Intent();
intent.setAction(“com.coslay.action.CUSTOM_BROADCAST”);intent.putExtra(“msg”,“简单的消息”);sendBroadcast(intent);} });} 程序启动BroadcastReceiver只需要两步: 创建需要启动的BroadcastReceiver的Intent 调用Context的sendBroadcast()或sendOrderedBroadcast()方法来启动指定的BroadcastReceiver BroadcastReceiver:
public class CustomReceiver extends BroadcastReceiver{ @Override public void onReceive(Context arg0, Intent arg1){
Toast.makeText(arg0, “接收到的Intent的Action为:”+arg1.getAction()+“n消息内容是:”+arg1.getStringExtra(“msg”), Toast.LENGTH_LONG).show();} 只要重写BroadcastReceiver的onReceive(Context context,Intent intent)方法即可。然后在如下注册监听器即可。
AndroidManifest.xml:
指定该BroadcastReceiver能匹配的Intent有两种方式: 1.使用代码进行指定: IntentFilter filter = new IntentFilter(“android.provider.Telephony.SMS_RECEIVED”);SomeReceiver receiver = new SomeReceiver();registerReceiver(receiver,filter);2.在AndroidManifest.xml文件中配置。如上所示。发送有序广播: Aactivity:
button2 =(Button)findViewById(R.id.button2);button2.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ Intent intent = new Intent();
intent.setAction(“com.coslay.action.SORTED_BROADCAST”);intent.putExtra(“msg”, “简单的消息”);sendOrderedBroadcast(intent, null);} });BroadcastReceiver:
public class SortedBroadcastReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){
Toast.makeText(context, “接收到的Intent的Action为:”+intent.getAction()+“n消息内容是:”+intent.getStringExtra(“msg”), Toast.LENGTH_LONG).show();//创建一个Bundle对象,并存入数据 Bundle bundle = new Bundle();//将bundle存入结果中
bundle.putString(“first”, “第一个BroadcastReceiver存入的消息”);setResultExtras(bundle);//取消Broadcast的继续传播 //abortBroadcast();} } 优先接收到Broadcast的接收者可以通过 setResultExtras(bundle);方法将处理结果存入Broadcast中,然后传给下一个接收者,下一个接收者通过代码:Bundle bundle = getResultExtras(true)可以获取上一个接收者存入的数据。
AndroidManifest.xml:
接收系统广播(接收开机广播启动服务): BroadcastReceiver如下: public class LaunchReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent){ Intent tIntent = new Intent(context , LaunchService.class);// 启动指定Service context.startService(tIntent);} } Service如下: public class LaunchService extends Service { @Override public IBinderonBind(Intent intent){ return null;} @Override public void onCreate(){ // 定义1秒执行一行输出 new Timer().schedule(new TimerTask(){ @Override public void run(){ System.out.println(“-----” + new Date()+ “-----”);} }, 0, 1000);} } AndroidManifest.xml: BroadcastReceiver可以实现Service与Activity之间的通信: Activity如下: public class MusicBox extends Activity implements OnClickListener { // 获取界面中显示歌曲标题、作者文本框 TextView title, author;// 播放/暂停、停止按钮 ImageButton play, stop;ActivityReceiveractivityReceiver;public static final String CTL_ACTION = “org.crazyit.action.CTL_ACTION”;public static final String UPDATE_ACTION = “org.crazyit.action.UPDATE_ACTION”;// 定义音乐的播放状态,0x11代表没有播放;0x12代表正在播放;0x13代表暂停 int status = 0x11;String[] titleStrs = new String[] { “心愿”, “约定”, “美丽新世界” };String[] authorStrs = new String[] { “未知艺术家”, “周蕙”, “伍佰” }; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.main);// 获取程序界面界面中的两个按钮 play =(ImageButton)this.findViewById(R.id.play);stop =(ImageButton)this.findViewById(R.id.stop);title =(TextView)findViewById(R.id.title);author =(TextView)findViewById(R.id.author);// 为两个按钮的单击事件添加监听器 play.setOnClickListener(this);stop.setOnClickListener(this);activityReceiver = new ActivityReceiver();// 创建IntentFilter IntentFilter filter = new IntentFilter();// 指定BroadcastReceiver监听的Action filter.addAction(UPDATE_ACTION);// 注册BroadcastReceiver registerReceiver(activityReceiver, filter);Intent intent = new Intent(this, MusicService.class);// 启动后台Service startService(intent);} // 自定义的BroadcastReceiver,负责监听从Service传回来的广播 public class ActivityReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent){ // 获取Intent中的update消息,update代表播放状态 int update = intent.getIntExtra(“update”,-1);// 获取Intent中的current消息,current代表当前正在播放的歌曲 int current = intent.getIntExtra(“current”,-1);if(current >= 0){ title.setText(titleStrs[current]);author.setText(authorStrs[current]);} switch(update){ case 0x11: play.setImageResource(R.drawable.play);status = 0x11;break;// 控制系统进入播放状态 case 0x12: // 播放状态下设置使用暂停图标 play.setImageResource(R.drawable.pause);// 设置当前状态 status = 0x12;break;// 控制系统进入暂停状态 case 0x13: // 暂停状态下设置使用播放图标 play.setImageResource(R.drawable.play);// 设置当前状态 status = 0x13;break;} } } @Override public void onClick(View source){ // 创建Intent Intentintent = new Intent(“org.crazyit.action.CTL_ACTION”);switch(source.getId()){ // 按下播放/暂停按钮 case R.id.play: intent.putExtra(“control”, 1);break;// 按下停止按钮 case R.id.stop: intent.putExtra(“control”, 2);break;} // 发送广播,将被Service组件中的BroadcastReceiver接收到 sendBroadcast(intent);} } Service的实例代码如下: public class MusicService extends Service { MyReceiverserviceReceiver;AssetManager am;String[] musics = new String[] { “wish.mp3”, “promise.mp3”, “beautiful.mp3” };MediaPlayermPlayer;// 当前的状态,0x11 代表没有播放 ;0x12代表 正在播放;0x13代表暂停 int status = 0x11;// 记录当前正在播放的音乐 int current = 0; @Override public IBinderonBind(Intent intent){ return null;} @Override public void onCreate(){ am = getAssets();// 创建BroadcastReceiver serviceReceiver = new MyReceiver();// 创建IntentFilter IntentFilter filter = new IntentFilter();filter.addAction(MusicBox.CTL_ACTION);registerReceiver(serviceReceiver, filter);// 创建MediaPlayer mPlayer = new MediaPlayer();// 为MediaPlayer播放完成事件绑定监听器 mPlayer.setOnCompletionListener(new OnCompletionListener()//① { @Override public void onCompletion(MediaPlayermp){ current++;if(current >= 3){ current = 0;} // 发送广播通知Activity更改文本框 Intent sendIntent = new Intent(MusicBox.UPDATE_ACTION);sendIntent.putExtra(“current”, current);// 发送广播,将被Activity组件中的BroadcastReceiver接收到 sendBroadcast(sendIntent);// 准备、并播放音乐 prepareAndPlay(musics[current]);} });super.onCreate();} public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, Intent intent){ int control = intent.getIntExtra(“control”,-1);switch(control){ // 播放或暂停 case 1: // 原来处于没有播放状态 if(status == 0x11){ // 准备、并播放音乐 prepareAndPlay(musics[current]);status = 0x12;} // 原来处于播放状态 else if(status == 0x12){ // 暂停 mPlayer.pause();// 改变为暂停状态 status = 0x13;} // 原来处于暂停状态 else if(status == 0x13){ // 播放 mPlayer.start();// 改变状态 status = 0x12;} break;// 停止声音 case 2: // 如果原来正在播放或暂停 if(status == 0x12 || status == 0x13){ // 停止播放 mPlayer.stop();status = 0x11;} } // 发送广播通知Activity更改图标、文本框 Intent sendIntent = new Intent(MusicBox.UPDATE_ACTION);sendIntent.putExtra(“update”, status);sendIntent.putExtra(“current”, current);// 发送广播,将被Activity组件中的BroadcastReceiver接收到 sendBroadcast(sendIntent);} } private void prepareAndPlay(String music){ try { // 打开指定音乐文件 AssetFileDescriptorafd = am.openFd(music);mPlayer.reset();// 使用MediaPlayer加载指定的声音文件。mPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());// 准备声音 mPlayer.prepare();// 播放 mPlayer.start();} catch(IOException e){ e.printStackTrace();} } } 1应用程序配置全屏 应用程序配置全屏: android:theme=“@android:style/Theme.NoTitleBar.Fullscreen” /> 【bug】 但是系统提示的是: android:style/Theme_NoTitleBar_Fullscreen ——错误的配置 Android的bug。 去掉标题栏: android:theme=“@android:style/Theme.NoTitleBar” 2 Dialog Dialog dialog = new AlertDialog.Builder(LoginActivity.this) .setTitle(“退出确认”) .setMessage(“确定退出程序?”) .setPositiveButton(“确定”,new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog,@Override int which){})new DialogInterface.OnClickListener(){ //事件处理} public void onClick(DialogInterface dialog,.setNeutralButton(“取消”,int which){//取消 } }).create();dialog.show(); 3只有竖屏 4线程 new Thread(){public void run(){} try {} sleep(3000);// 等待三秒,自动进入软件主窗口 Intent intent = new Intent(MainActivity.this,LoginActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);finish();e.printStackTrace();} catch(Exception e){ }.start(); 5Tabhost 总结 // 生成一个TabSpec对象,这个对象代表了一个页 TabHost.TabSpec listSpec = tabHost.newTabSpec(“tabSpecTag”); 在listSpec添加其他属性时 通过 // 设置该页的indicator listSpec.setIndicator(bookTab); 此bookTab 是一个View对象 例如布局 布局里面可以套View 这样实现自定义选项卡的效果 6获取在layout布局中xxx.xml的实例 LayoutInflatermInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); mInflater.inflate(R.layout.item1, null); 此处item1就是 一个布局文件第五篇:Android 学习总结1(范文)