android类图
⑴ 如何看Android的UML图
一.认识android的架构
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 Looper; Looper.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 ring 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();
}
}
⑵ android建模要类图和用例图吗
我没有visio的,只有trufun的一套完整的UML视图案例,不仅仅是用例图,类图,还有活动图,状态图,序列图等等。
你可以去trufun下载,公开的。
⑶ android 类图 intent 是什么关系
先看下java中对Vector的描述:(对Vector熟悉的下面这段可不看)
Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。
从 Java 2 平台 v1.2 开始,此类改进为可以实现 List 接口,使它成为 Java Collections Framework 的成员。与新 collection 实现不同,Vector 是同步的。
之前看think in java 中也有提到,Vector与List相比,主要的区别就在于,Vector是同步的,List是异步的,Vector在迭代的时候是不能对队里的数据进行增删操作的,否则会抛出异常,同理,在单一线程条件下,Vector的效率较之ArrayList等会更低,因此在Android平台下可能也不太会使用到该类。
下面就是重点了,先看下Vector的类图:
可以看到Vector是实现了Serializable接口的,所以很显然,Intent是可以传递这样的数据的,但是在实践中还是发现问题了,当我在Activity A中将Vector数据put进入intent的bundle中时,在Activity B中去取出数据(getSerializable)时,将其强转为Vector,程序会报错,cant Cast ArrayList to Vector(不能将Arraylist转换为Vector类型),见鬼了,后来去搜了下,stackflow上也有哥们问到这样的问题,有人猜测是所有Collection数据在进入Intent后,都被Android强转为Arraylist了,这里我还没有查询Android源码,但根据表现出来的问题也基本是这样的,哪位大神可以看下源码。
所以,结论就是,尽量不要在Android中使用Vector,如果确实因为线程同步的问题必须使用,那当你看到那个类转换异常时也不要惊讶,老老实实把它先用Arraylist盛放起来,再转回到Vector,或者程序的参数或者返回值接口不要写死为Vector,使用List这种泛型,这样也比较有利于程序的扩展。
⑷ 如何看Android的UML 图
UML并不算高深下面给段定义: UML从考虑系统的不同角度出发,定义了用例图、类图、对象图、状态图、活动图、序列图、协作图、构件图、部署图等9种图。这些图从不同的侧面对系统进行描述。系统模型将这些不同的侧面综合成一致的整体,便于系统的分析和构造。尽管UML和其它开发工具还会设计出许多派生的视图,但上述这些图和其它辅助性的文档是软件开发人员所见的最基本的构造。 辅助性视图用来描述出你脑中的想法。推荐工具axure rp7.0 或者process on。
⑸ 如何生成类图对android的studio
让键入CTRL +ALT +S(或去首选项),然后进入插件选项卡中,点击“浏览库”按钮,然后搜索Visual Paradigm SDE for IntellIJ (Community edition) Modelling Case Tool只是安装它。你需要从现在安装适当的软件,它应该工作得很好。 我想这UML类图仅适用于终极版。
⑹ powerdesigner怎么生成android eclipse类图
打开PowerDesigner软件,选择菜单文件->建立新模型,或者敲击键盘ctrl+N
弹出建立新模型窗口,模型类型选择Object-Oriented Model,图选择Class Diagram,输入模型名称,例如ObjectOrientedModel_1,选择对象语言为Java,点击OK
PowerDesigner会创建名称为ObjectOrientedModel_1的模型工程,在Palette面板中会列出可以操作组件符号,对于类图来说,主要使用的是Class(类),Interface(接口)及部分关系组件等
单击Palette工具栏中的Class图标,在工作区中点击即创建一个类。单击Palette工具栏中的箭头(pointer),双击类图的图形符号,打开类属性(Class Properties)窗口。
在类属性窗口中的General和Detail页签中可以设置类的基本属性、类属性、类方法,例如机动车类
再单击Palette工具栏中的Class图标,在工作区中点击即创建另一个类,并设置类名、类属性、类方法,例如小汽车类
单击Palette工具栏中的Genaralization图标,点击小汽车类,并拖动鼠标到机动车类,实现小汽车类继承机动车类
双击小汽车类图标,弹出类属性窗口,选中预览(preview)页签,即可看到类生成的java代码
⑺ android一个列表页面的类图怎么画
工具!必须依赖工具,市面上有太多的UML工具,你只需要找一款支持逆向工程的,即将代码转换成UML的数据结构,然后将类图或时序图一步步的绘制出来。bouml,一个Linux上的免费工具(Ubuntu12.10开始就不免费了,所以推荐在12.04上安装使用)。如果你不想从头开始,请访问github上的samchen2009/android_uml,那里有一份reverse过的Android4.3,以及里面所有的UML图。