http://demo.playing.im
几乎可以运行在各种浏览器上,但ie可能有点问题,反正也不管它,重点是可以运行在智能手机的浏览器上。
APK是Android Package的缩写,即Android安装包。APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。
APK文件其实是zip格式,但后缀名被修改为apk,通过UnZip解压后,可以看到Dex文件,Dex是Dalvik VM executes的全称,即Android Dalvik执行程序,并非Java ME的字节码而是Dalvik字节码。
一个APK文件结构为:
mete-INF Jar文件中常可以看到
res 存放资源文件的目录
AndroidManifest.xml 程序全局配置文件
classes.dex Dalvik字节码
resources.arsc 编译后的二进制资源文件
总结下我们发现Android在运行一个程序时首先需要UnZip,然后类似Symbian那样直接,和Windows Mobile中的PE文件有区别,这样做对于程序的保密性和可靠性不是很高,通过dexdump命令可以反编译,但这样做符合发展规律,微软的 Windows Gadgets或者说WPF也采用了这种构架方式。
在Android平台中dalvik vm的执行文件被打包为apk格式,最终运行时加载器会解压然后获取编译后的androidmanifest.xml文件中的permission分支相关的安全访问,但仍然存在很多安全限制,如果你将apk文件传到/system/app文件夹下会发现执行是不受限制的。最终我们平时安装的文件可能不是这个文件夹,而在android rom中系统的apk文件默认会放入这个文件夹,它们拥有着root权限。
RunningTaskInfo
AndroidManifest.xml
必须在AndroidManifest.xml添加Android.permission.GET_TASKS的权限,才能访问系统正在运行中的Activity。
扩展学习
上面的程序可以取出后台正在运行中的Activity,但是却没有办法取得正在后台运行中的服务(Service),以下的扩展学习则是以取得系统服务(System Background Service)作为练习对象,并将取得的服务列表条列于程序的ListView当中,程序运行结果如图5-24所示。
图5-24 自己编写的Service-irdc.ex06_17,正在运行中访问系统后台服务(Service)与Activity的写法不同,使用方法不同,其在于所需读取的不再是ActivityManager.RunningTaskInfo,而是ActivityManager.RunningServiceInfo,而在RunningTas-kInfo属性里,则需访问process以及pid来取得服务的名称及ID值,如以下程序,需在单击按钮的try{}语句中,替换原有的写法即可取出正在运行的系统服务(System Service)。
ActivityManager.RunningTaskInfo及ActivityManager.RunningServiceInfo可访问的属性如表5-8和表5-9所示。
表5-8 Android.app.ActivityManager.RunningTaskInfo
数 据 类 型
属 性 名 称
描 述
ComponentName
baseActivity
该任务作第一个运行中Activity组件名称
CharSequence
description
该任务现在的状况描述
Int
id
该任务的ID
Int
numActivities
该任务所运行的Activity数量,
包含已停止的
Int
numRunning
该任务正在运行Activity数量,
不包含已停止或不延续运行的
Bitmap
thumbnail
以缩图显示该任务目前的状态
ComponentName
topActivity
该任务自运行以来最优先运行的组件名称
表5-9 Android.app.ActivityManager.RunningServiceInfo
数 据 类 型
属 性 名 称
描 述
long
activeSince
该服务自启动至今的时间
int
clientCount
连接至此服务的client数量
int
crashCount
该服务在运行时共死机的次数
boolean
foreground
若为true,则该服务在后台运行
long
lastActivityTime
最后一个Activity与该服务绑定的时间
int
pid
若此值不为0,则表示正在运行服务的ID
String
Process
该服务的名称
long
restarting
若此值不为0,则表示该服务
不在运行中,但也许是在指定的时间才会运行
ComponentName
service
服务的组件名称
boolean
started
若此值为true,则表示服务已经在启用运行中
来自:http://book.51cto.com/art/201007/212203.htm