安卓实例源码
‘壹’ python 能开发 Android 应用吗
python可以开发Android应用。
Python是一种解释型脚本语言,可以应用于以下领域:
1、Web 和 Internet开发;
2、科学计算和统计;
3、人工智能;
4、教育;
5、桌面界面开发;
6、软件开发;
7、后端开发。
(1)安卓实例源码扩展阅读:
操作系统与应用程序的沟通桥梁,应用分为两层:函数层(Library)和虚拟机(Virtual Machine)。 Bionic是 Android 改良libc的版本。
Android 同时包含了Webkit,所谓的Webkit 就是Apple Safari 浏览器背后的引擎。Surface flinger 是就2D或3D的内容显示到屏幕上。Android使用工具链(Toolchain)为Google自制的Bionic Libc。
Android采用OpenCORE作为基础多媒体框架。
Open CORE可分7大块:PVPlayer、PVAuthor、Codec、PacketVideo Multimedia Framework(PVMF)、Operating System Compatibility Library(OSCL)、Common、OpenMAX。
Android 使用skia 为核心图形引擎,搭配OpenGL/ES。skia与Linux Cairo功能相当,但相较于Linux Cairo, skia 功能还只是雏形的。
2005年Skia公司被Google收购,2007年初,Skia GL源码被公开,Skia 也是Google Chrome 的图形引擎。
Android的多媒体数据库采用sqlite数据库系统。数据库又分为共用数据库及私用数据库。用户可通过ContentResolver类(Column)取得共用数据库。
Android的中间层多以java 实现,并且采用特殊的Dalvik 虚拟机(Dalvik Virtual Machine)。Dalvik虚拟机是一种“暂存器型态”(Register Based)的Java虚拟机,变量皆存放于暂存器中,虚拟机的指令相对减少。
Dalvik虚拟机可以有多个实例(Instance), 每个Android应用程序都用一个自属的Dalvik虚拟机来运行,让系统在运行程序时可达到优化。Dalvik 虚拟机并非运行Java字节码(Bytecode),而是运行一种称为.dex格式的文件。
参考资料:网络-Android
‘贰’ 求安卓手机终端模拟器adb指令
1. 显示系统中全部Android平台:
android list targets
2. 显示系统中全部AVD(模拟器):
android list avd
3. 创建AVD(模拟器):
android create avd --name 名称 --target 平台编号
4. 启动模拟器:
emulator -avd 名称 -sdcard ~/名称.img (-skin 1280x800)
5. 删除AVD(模拟器):
android delete avd --name 名称
6. 创建SDCard:
mksdcard 1024M ~/名称.img
7. AVD(模拟器)所在位置:
Linux(~/.android/avd) Windows(C:\Documents and Settings\Administrator\.android\avd)
8. 启动DDMS:
ddms
9. 显示当前运行的全部模拟器:
adb devices
10. 对某一模拟器执行命令:
abd -s 模拟器编号 命令
11. 安装应用程序:
adb install -r 应用程序.apk
12. 获取模拟器中的文件:
adb pull
13. 向模拟器中写文件:
adb push
14. 进入模拟器的shell模式:
adb shell
15. 启动SDK,文档,实例下载管理器:
android
16. 缷载apk包:
adb shell
cd data/app
rm apk包
exit
adb uninstall apk包的主包名
adb install -r apk包
17. 查看adb命令帮助信息:
adb help
18. 在命令行中查看LOG信息:
adb logcat -s 标签名
19. adb shell后面跟的命令主要来自:
源码\system\core\toolbox目录和源码\frameworks\base\cmds目录。
20. 删除系统应用:
adb remount (重新挂载系统分区,使系统分区重新可写)。
adb shell
cd system/app
rm *.apk
21. 获取管理员权限:
adb root
22. 启动Activity:
adb shell am start -n 包名/包名+类名(-n 类名,-a action,-d date,-m MIME-TYPE,-c category,-e 扩展数据,等)。
23、发布端口:
你可以设置任意的端口号,做为主机向模拟器或设备的请求端口。如:
adb forward tcp:5555 tcp:8000
24、复制文件:
你可向一个设备或从一个设备中复制文件,
复制一个文件或目录到设备或模拟器上:
adb push
如:adb push test.txt /tmp/test.txt
从设备或模拟器上复制一个文件或目录:
adb pull
如:adb pull /addroid/lib/libwebcore.so .
25、搜索模拟器/设备的实例:
取得当前运行的模拟器/设备的实例的列表及每个实例的状态:
adb devices
26、查看bug报告:
adb bugreport
27、记录无线通讯日志:
一般来说,无线通讯的日志非常多,在运行时没必要去记录,但我们还是可以通过命令,设置记录:
adb shell
logcat -b radio
28、获取设备的ID和序列号:
adb get-proct
adb get-serialno
29、访问数据库SQLite3
adb shell
sqlite3
‘叁’ 结构型模式-安卓源码实战之的Proxy(代理)、Delegate(委托)
Proxy和Delegate的设计思想是相同的,可以一起讨论。前面是代理模式的简要介绍,后面是具体源码实战。
以下基础知识摘抄自《设计模式-可复用面向对象软件的基础》Proxy章节
为其他对象提供一种代理以控制对这个对象的访问
当创建某一具体对象RealSubject开销很大时,应该根据需要进行创建,当真正需要到这个RealSubject对象时在进行创建,此时就需要用到代理Proxy 。
例如需要在文档中嵌入 图形对象的文档编辑器功能 ,然而 创建图形文档编辑器的开销很大也不是每一个文档都需要用到图形文档编辑器 。所以我们使用另外一个对象(即图像Proxy) 代替 真正的图形文档编辑器。 Proxy可以代替一个图形文档编辑器,并且在真正需要的时候负责实例化这个图形文档编辑器对象。
只有当文档编辑器点击 图形文档编辑器 代理Proxy的图标以启动功能时,图形代理Proxy才创建真正的 图形文档编辑器 对象
上面说过,代理(委托)模式是为了避免直接创建开销大的资源而不使用,采用的一种代理模式以便于真正使用时在实例化。
在 PhoneWindowManager 中使用 KeyguardServiceDelegate 来代理 KeyguardService 的功能( KeyguardService 由 KeyguardServiceWrapper 包装器进行包装)
PhoneWindowManager 需要使用到 KeyguardService 的功能,但是在创建 PhoneWindowManager 时就实例化 KeyguardService 没必要且开销大,因为还没用到 KeyguardService 的功能。直接创建 KeyguardService 会浪费 binder线程池 资源,所以应该在需要使用的时候再创建,所以引入 KeyguardServiceDelegate 。
PhoneWindowManager 并没有直接创建 KeyguardService 对象,而是创建了代理对象 KeyguardServiceDelegate 。 后面 PhoneWindowManager 需要使用到 KeyguardService 的功能时,通过调用 KeyguardServiceDelegate.bindService 将 KeyguardService 的 binder 对象转化为 接口 封装到 KeyguardServiceWrapper 包装器,最后将 KeyguardServiceWrapper 赋值到 KeyguardServiceDelegate 的成员变量,完成整个代理模式的架构。
最终的方法调用流程:
PhoneWindowManager -> KeyguardServiceDelegate ->KeyguardServiceWrapper->KeyguardService
通过创建KeyguardServiceDelegate来避免直接创建KeyguardService而不使用带来不必要的开销。属于延迟加载。
[SystemServer.java]
众所周知SystemServer用来完成服务的创建和初始化过程。
一:WindowManagerService.main();启动了WMS,可以看到new PhoneWindowManager()传入WMS的main方法中,它将被赋值到成员变量WindowManagerPolicy mPolicy;
二:wm.onInitReady();调用WMS的init方法,这里是KeyguardServiceDelegate的创建流程
[WindowManagerService.java]
[WindowManagerService.java]
调用PhoneWindowManager.init方法
[PhoneWindowManager.java]
这里可以看到,在PhoneWindowManager.init函数中并没有直接创建KeyguardService对象,而是创建了代理对象KeyguardServiceDelegate。在后面需要使用到KeyguardService的功能时,通过调用KeyguardServiceDelegate.bindService将KeyguardService的binder对象转化为接口封装到KeyguardServiceWrapper包装器,最后将包装器赋值给KeyguardServiceDelegate的成员变量
[KeyguardServiceDelegate.java]
[SystemServer.java]
[SystemServer.java]
[WindowManagerService.java]
mPolicy指的是WindowManagerPolicy。而PhoneWindowManager实现了WindowManagerPolicy接口。mPolicy的赋值在WMS的构造函数中就已经完成了。而WMS的启动在systemServer中。
[PhoneWindowManager.java]
[PhoneWindowManager.java]
[PhoneWindowManager.java]
调用context.bindServiceAsUser(...)来绑定服务,重点关注以下几点
通过指定ComponentName来绑定服务。可以看到KeyguardServiceDelegate所在包名为
/frameworks/base/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
寻找resources.getString(com.android.internal.R.string.config_keyguardComponent)的定义位置
[/frameworks/base/core/res/res/values/config.xml]
可以看到config_keyguardComponent对应启动的就是 KeyguardService 这个服务。通过 ServiceConnection 去指定拿到 KeyguardService 后,将 KeyguardService 转换为接口对象 IKeyguardService.Stub.asInterface(service) 来创建 KeyguardServiceWrapper 对象。看一看 KeyguardServiceWrapper 的创建过程
[KeyguardServiceWrapper.java]
可以看到将IKeyguardService service传递给了成员变量mService
ServiceConnection mKeyguardConnection 里通过 KeyguardService 的创建了代理对象 KeyguardServiceWrapper 。
后续当需要使用到 KeyguardService 功能是将是以下的调用过程
PhoneWindowManager -> KeyguardServiceDelegate ->KeyguardServiceWrapper->KeyguardService
‘肆’ 在Android上怎样实现JAVA和JS交互
java和js交互分为三种情况,分别是:
1 调用网页上的js代码
Android中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true,,然后通过loadUrl就可以直接进行调用,如下所示:
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl("javascript:test()");
2 网页java代码的方法
在网页中调用java代码,需要在webview控件中添加javascriptInterface。如下所示:
mWebView.addJavascriptInterface(newObject(){
publicvoidclickOnAndroid(){
mHandler.post(newRunnable(){
publicvoidrun(){
Toast.makeText(Test.this,"测试调用java",Toast.LENGTH_LONG).show();
}
});
}
},"demo");
在网页中,只需要像调用js方法一样,进行调用就可以
<div id='b'><a onclick="window.demo.clickOnAndroid()">b.c</a></div>
3 Java代码调用js并传参
首先需要带参数的js函数,如functiontest(str),然后只需在调用js时传入参数即可,如下所示:
mWebView.loadUrl("javascript:test('aa')");
4.Js中调用java函数并传参
首先一样需要带参数的函数形式,但需注意此处的参数需要final类型,即得到以后不可修改,如果需要修改其中的值,可以先设置中间变量,然后进行修改。如下所示:
mWebView.addJavascriptInterface(newObject(){
publicvoidclickOnAndroid(finalinti){
mHandler.post(newRunnable(){
publicvoidrun(){
intj=i;
j++;
Toast.makeText(Test.this,"测试调用java"+String.valueOf(j),Toast.LENGTH_LONG).show();
}
});
}
},"demo");
然后在html页面中,利用如下代码<divid='b'><aonclick="window.demo.clickOnAndroid(2)">b.c</a></div>,
下面是安卓无忧中js 与安卓相互调用的效果图,可以网络一下安卓无忧,点击源码,看看里面的源码。