
Android其本质就是在标准的Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的application framework,所有的应用程序都是基于JAVA的application framework之上。
android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
二.搭建环境
搭建开发环境
对国内的开发者来说最痛苦的是无法去访问android开发网站。为了更好的认识世界,对程序员来说,会翻墙也是的一门技术,带你去领略墙外的世界,好了,不废话了, 国内开发者访问(androiddevtools) 上面已经有了所有你要的资源,同时可以下载到我们的主角framework
但是这样的搭建只能去阅读源代码,我们无法去更进一步去实现自己的rom,我们看到锤子的系统在早期的开放rom是自己从新实现了framework的代码,现在看起来他成功了,所以我们还要去搭建android系统的源码编译环境。
搭建源码编译环境
三.开始主题
在一开始写c程序的时候都有一个运行的入口,比如
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std
//这里的main就是应用的入口
int main(int argc, const char * argv[]){
return 0
}
在计算机网络原理中我们用socket实现一个服务器端,不断的接听客户端的访问,而且他的代码是这样实现的:
#include <winsock2.h>
#pragma comment(lib, "WS2_32.lib")
#include <stdio.h>
void main()
{
WORD wVersionRequested//版本号
WSADATA wsaData
int err
wVersionRequested = MAKEWORD(2, 2)//2.2版本的套接字
//加载套接字库,如果失败返回
err = WSAStartup(wVersionRequested, &wsaData)
if (err != 0)
{
return
}
//判断高低字节是不是2,如果不是2.2的版本则退出
if (LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion) != 2)
{
return
}
//创建流式套接字,基于TCP(SOCK_STREAM)
SOCKET socSrv = socket(AF_INET, SOCK_STREAM, 0)
//Socket地址结构体的创建
SOCKADDR_IN addrSrv
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY)//转换Unsigned long型为网络字节序格
addrSrv.sin_family = AF_INET//指定地址簇
addrSrv.sin_port = htons(6000)
//指定端口号,除sin_family参数外,其它参数都是网络字节序,因此需要转换
//将套接字绑定到一个端口号和本地地址上
bind(socSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR))//必须用sizeof,strlen不行
listen(socSrv, 5)
SOCKADDR_IN addrClient//字义用来接收客户端Socket的结构体
int len = sizeof(SOCKADDR)//初始化参数,这个参数必须进行初始化,sizeof
//循环等待接受客户端发送请求
while (1)
{
//等待客户请求到来;当请求到来后,接受连接请求,
//返回一个新的对应于此次连接的套接字(accept)。
//此时程序在此发生阻塞
SOCKET sockConn = accept(socSrv, (SOCKADDR*)&addrClient, &len)
char sendBuf[100]
sprintf(sendBuf, "Welcome %s to JoyChou",
inet_ntoa(addrClient.sin_addr))//格式化输出
//用返回的套接字和客户端进行通信
send(sockConn, sendBuf, strlen(sendBuf)+1, 0)//多发送一个字节
//接收数据
char recvBuf[100]
recv(sockConn, recvBuf, 100, 0)
printf("%s\\n", recvBuf)
closesocket(sockConn)
}
}
他采用了一个while死循环去监听客户端的请求。
先上源代码
public final class ActivityThread {
public static void main(String[] args) {
SamplingProfilerIntegration.start()
CloseGuard.setEnabled(false)
Environment.initForCurrentUser()
EventLogger.setReporter(new EventLoggingReporter())
Security.addProvider(new AndroidKeyStoreProvider())
final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId())
TrustedCertificateStore.setDefaultUserDirectory(configDir)
Process.setArgV0("<pre-initialized>")
Looper.prepareMainLooper()
//从中可以看到为app开辟了一个线程进入了looper之中
ActivityThread thread = new ActivityThread()
thread.attach(false)
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler()
}
AsyncTask.init()
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"))
}
Looper.loop()
throw new RuntimeException("Main thread loop unexpectedly exited")
}
}
看到源码失望了,没有一个while循环啊,其实用了他方法实现
//用一个looper的机制循环监听响应
Looper.prepareMainLooper()
Looper.loop()
进一步深入代码
public static void loop() {
final Looper me = myLooper()
if (me == null) {
throw new RuntimeException("No LooperLooper.prepare() wasn't called on this thread.")
}
final MessageQueue queue = me.mQueue
Binder.clearCallingIdentity()
final long ident = Binder.clearCallingIdentity()
// 在这里看到了一个循环监听消息
for () {
Message msg = queue.next()// might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return
}
Printer logging = me.mLogging
if (logging != null) {
logging.println(">>>>>Dispatching to " + msg.target + " " +
msg.callback + ": " + msg.what)
}
msg.target.dispatchMessage(msg)
if (logging != null) {
logging.println("<<<<<Finished to " + msg.target + " " + msg.callback)
}
// Make sure that during the course of dispatching the
// identity of the thread wasn't corrupted.
final long newIdent = Binder.clearCallingIdentity()
if (ident != newIdent) {
Log.wtf(TAG, "Thread identity changed from 0x"
+ Long.toHexString(ident) + " to 0x"
+ Long.toHexString(newIdent) + " while dispatching to "
+ msg.target.getClass().getName() + " "
+ msg.callback + " what=" + msg.what)
}
msg.recycleUnchecked()
}
}
成功的怼对方一次是什么感受一个字简洁明了的介绍感受就是爽啊!贼爽啊!超级爽!
我天性是个爱闹爱嗨的活泼人物,但是呢,上了大学之后这性子就收敛了许多,这里的许多指的可能是有七八分的样子吧。
因为准备去上大学的那段时间里,无论是家人还是朋友都是满满的担心,说我在家里在朋友身边被宠被惯习惯了,怕进了大学跟人家关系不容易相处好。因为像我这种性子喜欢的人就是喜欢的不行,讨厌的人就是恨不得打骂我来解气。
然后呢,我就谨听教诲,极收敛自己,做个听话的不哭不闹安安静静的好孩子。
俗话说林子大了什么鸟都有,但是你就是想不明白怎么什么鸟都在大学里遇到了呢,头疼。但是依旧不可否认的是大学是个有趣的地方,可以见到认识许许多多形形色色的人,当然包括那些个奇葩(翻白眼)。
那么大学里面跟你最有交集的就是室友宝宝们了呀,这一个个奇葩疯子如果不是上了大学我可能只是在各种狗血影视剧里看见。
刚步入大学就开始苦逼的军训生活,然后呢,经历过军训的或者说经历过比较严谨的军训的孩子们都懂军训有多累人,那中午教官一说解散就累的要立刻马上躺到床上休息才能救活自己一命了,什么吃饭啊都是次要的事了。
但是呢,总是有那么一个精力极好的宝宝,大家都躺着睡觉休息,人家躺着玩手机,玩手机就算了还要带大家一起听,放个音乐啊打局游戏放游戏音啊看影视剧放外音啊。然后提醒她吧,人家也听,调小声音不过半分钟就再次开外音甚至于声音更大了,这个憋火啊!
可是呢,我都已经是要乖要安安静静的做个温柔的不惹事的孩子了,所以说我尽力忍着,又可是呢其他人忍不住啊,直接语气冲了起来。然后大家就气氛尴尬,她也识相的关了声音。本来以为经过这次事她也就认识到了宿舍生活需要大家互相理解。
然而呢,只是我们以为而已!她还是一如既往的在每天大家都午休睡觉的那个时间点准时的放外音。然后我们其他几个人想都是室友,关系闹僵了也不好就尽力忍了,但是人家非但不领情还就是故意要试探你们的底线在哪!
于是乎,我忍不住了。一天,她还是这样的扰人,我刚刚睡着就被她手机声音吵醒,喊着她提醒了一句,她没听见,我又声音大点喊她,她还是没听见,我又又几乎用喊相距甚远的声音喊她,才知道人家是装作没听见!啊啊啊,真的好气好气。于是固执的我非要喊到她应我,她旁边床位的室友提醒她我在喊她,她无辜的说她没听见!!
好吧,这就算了,我说你现在听见了,能不能把声音关了或者你戴耳机,我们都要休息了,她哦了一声就关小了声音。好吧,这也算有点回应了。但是!但是!还是不过半分钟人家任性般的把声音开的老大,直接震醒了刚刚准备进入睡梦刚要去找寻周公的我们。我直接问她什么意思,人家也带着极不爽的语气说我以为你们睡着了。我勒个去,你们家睡着了是睡死了吗,睡着了你放这么大的声音就吵不醒了吗?简直过分!我带着怒火的喊道,怼的她没说半个字。
终于,这才算奏效了啊。后来讨论我们室友都说亏了我那次的怼,她才算改了这点。
在大家互相理解互相包容的情况下我们慢慢的走过了两年,也都习惯了彼此的疯癫奇葩,更被感染了不少奇葩疯癫,不知是好还是坏哈哈哈。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)