android软件安装原理
android 软件安装原理
将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大
小约为原始apk文件大小的四分之一)
安装过程:复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik字
节码)保存到dalvik-cache目录,并data/data目录下创建对应的应用数据目录。
卸载过程:删除安装过程中在上述三个目录下创建的文件及目录。
一、系统应用安装:
PackageManagerService处理各种应用的安装,卸载,管理等工作,开机时由systemServer启
动此服务
(源文件路径:
android\frameworks\base\services\java\com\android\server\PackageManagerService.java) PackageManagerService服务启动的流程:
1. 首先扫描安装“system\framework”目录下的jar包
1. scanDirLI(mFrameworkDir,PackageParser.PARSE_IS_SYSTEM,
scanMode | SCAN_NO_DEX);
2.第二步扫描安装“system\app”目录下的各个系统应用
scanDirLI(mSystemAppDir,PackageParser.PARSE_IS_SYSTEM, scanMode);
3.第三步扫描“data\app”目录,即用户安装的第三方应用
scanDirLI(mAppInstallDir, 0, scanMode);
4.第四步扫描" data\app-private"目录,即安装DRM保护的APK文件(目前没有遇到过此类
的应用)。
scanDirLI(mDrmAppPrivateInstallDir,0, scanMode | SCAN_FORWARD_LOCKED);
安装应用的过程
1.scanDirLI(Filedir, int flags, intscanMode) 遍历安装指定目录下的文件
2.scanPackageLI(FilescanFile,
File destCodeFile, FiledestResourceFile, intparseFlags,
intscanMode) 安装package文件
3.scanPackageLI(
File scanFile, File destCodeFile, FiledestResourceFile,
PackageParser.Packagepkg, intparseFlags, intscanMode)
通过解析安装包parsePackage获取到安装包的信息结构
4.mInstaller.install(pkgName,pkg.applicationInfo.uid,
pkg.applicationInfo.uid); 实现文件复制的安装过程
(源文件路径:frameworks\base\cmds\installd\installd.install)
二、从market上下载应用:
Google Market应用需要使用gmail账户登录才可以使用,选择某一应用后,开始下载安装包,此过程中,在手机的信号区有进度条提示,下载完成后,会自动调用Packagemanager的接
口安装,调用接口如下:
publicvoidinstallPackage(final Uri packageURI, final IPackageInstallObserverobserver,finalint flags)
final Uri packageURI:文件下载完成后保存的路径
final IPackageInstallObserver observer:处理返回的安装结果
final int flags:安装的参数,从market上下载的应用,安装参数为-r (replace) installPackage接口函数的安装过程:
1.publicvoidinstallPackage(
final Uri packageURI, final IPackageInstallObserverobserver, final int flags,
final String installerPackageName)
final StringinstallerPackageName:安装完成后此名称保存在settings里,一般为null,不是关键参数
2.FiletmpPackageFile = copyTempInstallFile(packageURI, res);
把apk文件复制到临时目录下的临时文件
3.privatevoidinstallPackageLI(Uri pPackageURI,
intpFlags, booleannewInstall,StringinstallerPackageName,
File tmpPackageFile, PackageInstalledInfo res)
解析临时文件,获取应用包名pkgName = PackageParser.parsePackageName( tmpPackageFile.getAbsolutePath(), 0);
4.判断如果带有参数INSTALL_REPLACE_EXISTING,则调用replacePackageLI(pkgName, tmpPackageFile,
destFilePath,destPackageFile, destResourceFile,
pkg, forwardLocked,newInstall, installerPackageName,
res)
5.如果没有,则调用installNewPackageLI(pkgName,
tmpPackageFile,
destFilePath,destPackageFile, destResourceFile,
pkg,forwardLocked, newInstall, installerPackageName,
res);
6.privatePackageParser.PackagescanPackageLI(
File scanFile, File destCodeFile, FiledestResourceFile,
PackageParser.Packagepkg, intparseFlags, intscanMode)
scanPackageLI以后的流程,与开机时的应用安装流程相同。
三、从ADB工具安装
Android Debug Bridge (adb) 是SDK自带的管理设备的工具,通过ADB命令行的方式也可以为手机或模拟器安装应用,其入口函数源文件为pm.java
(源文件路径:android\frameworks\base\cmds\pm\src\com\android\commands\pm\pm.java) ADB命令行的形式为adb install
函数runInstall()中判断参数
"-l"――INSTALL_FORWARD_LOCK
"-r"——INSTALL_REPLACE_EXISTING
"-i" ——installerPackageName
"-t"——INSTALL_ALLOW_TEST
我们常用的参数为-r,表示覆盖安装手机上已安装的同名应用。从market上下载的应用,也是直接传入这个参数安装的。
runInstall与market调用同样的接口完成应用安装。
publicvoidinstallPackage(https://www.360docs.net/doc/4710258420.html,.UripackageURI,android.content.pm.IPackageInstallObserver observer, intflags,https://www.360docs.net/doc/4710258420.html,ng.StringinstallerPackageName)
四、第三方应用安装――通过SD卡里的APK文件安装
把APK安装包保存在SD卡中,从手机里访问SD卡中的APK安装包,点击就可以启动安装界面,系统应用Packageinstaller.apk处理这种方式下的安装及卸载界面流程,如下图:PackageInstallerActivity负责解析包,判断是否是可用的Apk文件
创建临时安装文件/data/data/com.android.packageinstaller/files/ApiDemos.apk
并启动安装确认界面startInstallConfirm,列出解析得到的该应用基本信息。如果手机上已安
装有同名应用,则需要用户确认是否要替换安装。
确认安装后,启动InstallAppProgress,调用安装接口完成安装。
pm.installPackage(mPackageURI,observer, installFlags);
其它:
1. PackageManagerService.java的内部类AppDirObserver实现了监听app目录的功能:当把某个APK拖到app目录下时,可以直接调用scanPackageLI完成安装。
2.手机数据区目录“data/system/packages.xml”文件中,包含了手机上所有已安装应用的基本信息,如安装路径,申请的permission等信息。
安卓按钮单击事件
第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适,实际上,这种形式是目前是最广泛的事件监听器形式。上面的程序代码就是匿名内部类来创建事件监听器的!!! 对于使用匿名内部类作为监听器的形式来说,唯一的缺点就是匿名内部类的语法有点不易掌握,如果读者java基础扎实,匿名内部类的语法掌握较好,通常建议使用匿名内部类作为监听器。 第二种:内部类作为监听器 将事件监听器类定义成当前类的内部类。1、使用内部类可以在当前类中复用监听器类,因为监听器类是外部类的内部类,2、所以可以自由访问外部类的所有界面组件。这也是内部类的两个优势。上面代码就是内部类的形式!! 第三种:Activity本身作为事件监听器
这种形式使用activity本身作为监听器类,可以直接在activity类中定义事件处理器方法,这种形式非常简洁。但这种做法有两个缺点:(1)这种形式可能造成程序结构混乱。Activity 的主要职责应该是完成界面初始化;但此时还需包含事件处理器方法,从而引起混乱。(2)如果activity界面类需要实现监听器接口,让人感觉比较怪异。 上面的程序让Activity类实现了OnClickListener事件监听接口,从而可以在该Activity类中直接定义事件处理器方法:onClick(view v),当为某个组件添加该事件监听器对象时,直接使用this作为事件监听器对象即可。 第四种:外部类作为监听器 ButtonTest类 当用户单击button按钮时,程序将会触发MyButtonListener监听器 外部MyButtonListener类
AndroidUI基本控件与事件处理
《Android基础应用》 AndroidUI基本控件与事件处理 ?本章任务 ?使用Android开发本息计算器程序 ?使用Android开发华氏-摄氏温度转换器 ?本章目标 ?熟悉掌握本章基本控件的使用 ?熟练掌握Android常用事件 1.Android基本控件 Android应用开发的一项内容就是用户界面的开发,Android提供了大量功能丰富的UI组件,大部分放在android.widget包及其子包android.view包及其子包 在Android当中View类是最基本的一个UI类,基本上所有的高级UI组件都是继承View类而实现的。如Button(按钮),list(列表),EditText(编辑框),RadioButton(多选按钮),Checkbox(选择框)等都是View类 在Android中,我们可以在Xml文件中使用UI组件也可以在java文件中创建UI组件官方建议采用xml方式,这样的话能够实现界面和代码分离 1.1TextView和EditText TextView是一种用于显示字符串的控件 EditText则是用来输入和编辑字符串的控件,EditText是一个具有编辑功能的TextView
TextView和EditText基本属性 ●android:id设置ID,通过编码可以找到这个组件 ●android:layout_width设置在屏幕上的宽度 ●android:layout_height设置在屏幕上的高度 fill_parent强制性地使构件扩展,以填充布局单元内尽可能多的空间 wrap_content强制性地使视图扩展以显示全部内容 ●android:text设置显示的文本信息 ●android:textColor设置文本颜色 ●android:textSize设置文本尺寸
androidAPK应用安装过程以及默认安装路径
应用安装过程以及默认安装路径 分类: 一:安装过程 是类似或的文件格式。通过将文件直接传到模拟器或手机中执行即可安装。 应用安装有如下四种方式 1. 系统应用安装――开机时完成,没有安装界面 2. 网络下载应用安装――通过应用完成,没有安装界面 3. 工具安装――没有安装界面。 4. 第三方应用安装――通过卡里的文件安装,有安装界面,由应用处理安装及卸载过程的界面。 应用安装的流程及路径 应用安装涉及到如下几个目录: 系统自带的应用程序,无法删除 用户程序安装的目录,有删除权限。
安装时把文件复制到此目录 存放应用程序的数据 将中的文件安装到目录下(文件是虚拟机的可执行文件,其大小约为原始文件大小的四分之一) 安装过程:复制安装包到目录下,解压并扫描安装包,把文件(字节码)保存到目录,并目录下创建对应的应用数据目录。 卸载过程:删除安装过程中在上述三个目录下创建的文件及目录。 一、系统应用安装: 处理各种应用的安装,卸载,管理等工作,开机时由启动此服务 (源文件路径:\\\\\\\\) 服务启动的流程: 1. 首先扫描安装“\”目录下的包
1. (, | ); 2.第二步扫描安装“\”目录下的各个系统应用 (, ); 3.第三步扫描“\”目录,即用户安装的第三方应用 (, 0, ); 4.第四步扫描" \"目录,即安装保护的文件(目前没有遇到过此类的应用)。(,0, | ); 安装应用的过程 1(, , ) 遍历安装指定目录下的文件
2(, , , , ) 安装文件 3( , , , , , ) 通过解析安装包获取到安装包的信息结构4(, ); 实现文件复制的安装过程(源文件路径:\\\\) 二、从上下载应用:
Android OnTouchListener触屏事件接口
Android OnTouchListener触屏事件接口 OnTouchListener接口是用来处理手机屏幕事件的监听接口,当为View的范围内触摸按下、抬起或滑动等动作时都会触发该事件。该接口中的监听方法签名如下。 Java代码: public boolean onT ouch(View v, MotionEvent event) 参数v:参数v同样为事件源对象。 参数event:参数event为事件封装类的对象,其中封装了触发事件的详细信息,同样包括事件的类型、触发时间等信息。 节中介绍了一个在屏幕中拖动矩形移动的案例,本节将继续采用该案例的思路,通过监听接口的方式实现在屏幕上拖动按钮移动的案例。开发步骤如下。 创建一个名为Sample的Android项目。 准备字符串资源,打开strings.xml文件,用下列代码替换原有代码。 Java代码:
Java代码:
android apk安装包的制作过程图解
Android程序安装包APK的制作 完成Android项目后,需要将程序打包成APK文件(Android Package),其后缀名为".apk"。打包的APK 文件可以在Android模拟器或者Android手机上安装运行。 Android系统要求具有开发者签名的私人密钥的应用程序才可以被安装。 Android项目打包和生成数字签名可以使用命令行的方式,但Eclipse中的向导可以方便快捷的完成整个流程。 以HelloWorld为例,介绍如何生成APK。 Android项目编译运行后,右键单击项目名称,选择"Android Tools",再选择"Export Signed Application Package..."(输出签名的应用程序包)。 直接点击Next按钮,进入Keystore设置窗口。其中,Location为证书的目录地址,Password/Comfirm 为证书的密码。
打包程序时系统要求使用数字证书。如果没有数字证书,选择"Create new keystore",设置目录地址和密码,创建新的数字证书。 点击Next按钮,设置证书的信息。Alias:数字证书的名称;Password/Comfirm:证书的密码;Validity(years):证书的有效期;其他信息按需要填写。
完成证书信息设置后点击Next按钮,完成APK打包,如下图所示,生成的APK文件为:E:\Android\keystore\HelloWorld.apk。
如果已有数字证书,可以选择"Use existing keystore",然后点击Browser按钮进行选择,输入密码后点击Next按钮进行下一步。如果没有数字证书,选择"Create new keystore",设置目录地址和密码,创建新的数字证书。
android简单的广播事件处理
广播事件处理 一.Broadcast Receiver 比如打电话等等; 广播接收器,它和事件处理机制类似,只不过事件处理机制是程序组件级别,而广播事件处理机制是系统级别。 二.使用Broadcast Receiver 1.编写类继承BroadcaseReceiver,复写onReceiver()方法 2.在AndroidManifest.xml文件中注册BroadcaseReceiver 3.构建Intent对象 4.调用sendBroadcase()方法发送广播 三.BroadcaseReceiver生命周期 BroadcastReceiver对象仅在调用onReceive()方法时有效,当该方法执行完毕后,系统认为销毁该对象。 四.标准广播Action 五.注册Broadcast Receiver的方法 1.在AndroidManifest.xml文件中进行注册//有缺陷,不会因为Activity被销毁而销毁,一般不用
android APK应用安装过程以及默认安装路径
android APK应用安装过程以及默认安装路径 分类: Android 一:安装过程 APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。 Android应用安装有如下四种方式 1. 系统应用安装――开机时完成,没有安装界面 2. 网络下载应用安装――通过market应用完成,没有安装界面 3. ADB工具安装――没有安装界面。 4. 第三方应用安装――通过SD卡里的APK文件安装,有安装界面,由packageinstaller.apk应用处理安装及卸载过程的界面。 应用安装的流程及路径 应用安装涉及到如下几个目录: system/app 系统自带的应用程序,无法删除 data/app 用户程序安装的目录,有删除权限。
安装时把apk文件复制到此目录 data/data 存放应用程序的数据 Data/dalvik-cache 将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一) 安装过程:复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik 字节码)保存到dalvik-cache目录,并data/data目录下创建对应的应用数据目录。 卸载过程:删除安装过程中在上述三个目录下创建的文件及目录。 一、系统应用安装: PackageManagerService处理各种应用的安装,卸载,管理等工作,开机时由systemServer 启动此服务 (源文件路径: android\frameworks\base\services\java\com\android\server\PackageManagerService.jav a) PackageManagerService服务启动的流程:
Android进阶——Android事件分发机制之dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent
Android进阶——Android事件分发机制之dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent 前言 Android事件分发机制可以说是我们Android工程师面试题中的必考题,弄懂它的原理是我们避不开的任务,所以长痛不如短痛,花点时间干掉他,废话不多说,开车啦 Android事件分发机制的简介 Android事件分发机制的发生在View与View之间或者ViewGroup与View之间具有镶嵌的视图上,而且视图上必须为点击可用。当一个点击事件产生后,它的传递过程遵循如下顺序:Activity->Window->View,即事件先传递给Activity,再到Window,再到顶级View,才开始我们的事件分发 Android事件分发机制的相关概念 Android事件分发机制主要由三个重要的方法共同完成的 dispatchTouchEvent:用于进行点击事件的分发 onInterceptTouchEvent:用于进行点击事件的拦截 onTouchEvent:用于处理点击事件 这里需要注意的是View中是没有onInterceptTouchEvent()方法的 Android事件分发机制的分发例子 这里以两个ViewGroup嵌套View来演示,下面是演示图 一、MyView 继承View并覆写其三个构造方法,覆写dispatchTouchEvent和onTouchEvent,前面已经说
了View是没有onInterceptTouchEvent方法的 public class MyView extends View { public MyView(Context context) { super(context); } public MyView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean dispatchTouchEvent(MotionEvent event) { System.out.println("MyView dispatchTouchEvent"); return super.dispatchTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { System.out.println("MyView onTouchEvent"); return super.onTouchEvent(event); } } 二、MyViewGroup01和MyViewGroup02 MyViewGroup01和MyViewGroup02是一样的代码,这里以01为例,继承ViewGroup并覆写其三个构造方法,覆写dispatchTouchEvent和onTouchEvent和onInterceptTouchEvent方法 public class MyViewGroup01 extends LinearLayout { public MyViewGroup01(Context context) { super(context); } public MyViewGroup01(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public MyViewGroup01(Context context, AttributeSet attrs) {
Android程序开发实验报告
山西大学 物理电子工程学院 论文题目:基于Android系统的GPS 程序开发 学号:* 姓名:* * * 指导老师:* *
摘要 在日常生活中,我们经常需要知道自己的具体位置,尤其是在 旅游或陌生城市中。而手机作为目前最常见、最方便的电子信息载体,无疑是我们最好的选择。为了让智能手机用户能够随时随地查询GPS 所提供的服务,一种高效的办法就是将应用系统的功能拓展到手机终端上。本文选择的是最常见的Android系统的程序开发。对于软件从业人员来说,该平台具有无限的吸引力。 因此,本文首先介绍安卓系统在个人计算机上开发平台的搭建,并尝试在安卓系统上开发一款基于手机自带GPS组件的GPS应用。 关键字:Android,GPS,SDK,JDK,ADT,Eclipse 一引言 (一)开发背景 随着网络世界的深入生活,地球网络化已经是一条必然之路。而今后的网络也将逐渐的走向移动互联网的轨道。像手机,平板计算机,笔记本计算机等可以搭乘移动互联网的产品中使用人数最多的数码产品便是智能手机了。它已经在逐步的取代其他的电子产品的市场份额。据《2013-2017年中国智能手机行业市场需求预测与投资战略规划分析报告》估算,2012前三季度,全球智能手机用户总数已经突破了10亿大关。而2011前三季度的用户量只有约7亿户。可以看出,智能手机市场的潜力不可估量。
(二)Android 与GPS 简介 1.Android 是一种基于Linux 的自由及开放源代码的操作系统,主要使用于移动设 备,如智能手机和平板计算机,由Google 公 司和开放手机联盟领导及开发。 2011年第一季度,Android 在全球的市场份额首次超过塞班系统,跃居全球第一。 2012年11月数据显示,Android 占据全球智能手机操作系统市场76%的份额,中国市场占有率为90%。 Android 的系统架构和其操作系统一 样,采用了分层的架构。从架构图看, Android 分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运 行库层和Linux 内核层。 Android 系统所具有的特点有:开放性、丰富的硬件、方便开发。 2.GPS 是英文Global Positioning System (全球定位系统) 的简称。GPS 起始于1958年美国军方的一个项目, 1964年投入使用。GPS 定位的基本原理是根据高速运动的卫星瞬间位置作为已知的起算数据,采用空间距离后方交会的方法,确定待测点的位置。GPS 由空间部分、地面控制系统、用户设备部分三部分组成。作为先进的测量手段和新的生产力,GPS 已经融入了国民经济建设、国防建设和社会发展的各个应用领域。GPS 技术与我们的日常生活日益相关。
Android广播事件处理闹钟实例
Android广播事件处理闹钟实例 对应AlarmManage有一个AlarmManagerServie服务程序,该服务程序才是正真提供闹铃服务的,它主要维护应用程序注册下来的各类闹铃并适时的设置即将触发的闹铃给闹铃设备(在系 统中,linux实现的设备名为”/dev/alarm”),并且一直监听闹铃设备,一旦有闹铃触发或 者是闹铃事件发生,AlarmManagerServie服务程序就会遍历闹铃列表找到相应的注册闹铃并 发出广播。该服务程序在系统启动时被系统服务程序system_service启动并初始化闹铃设备(/dev/alarm)。当然,在JAVA层的AlarmManagerService与Linux Alarm驱动程序接口之间 还有一层封装,那就是JNI。 AlarmManager将应用与服务分割开来后,使得应用程序开发者不用关心具体的服务,而 是直接通过AlarmManager来使用这种服务。这也许就是客户/服务模式的好处吧。AlarmManager与 AlarmManagerServie之间是通过Binder来通信的,他们之间是多对一的关系。 在android系统中,AlarmManage提供了3个接口5种类型的闹铃服务。 3个接口: 1. // 取消已经注册的与参数匹配的闹铃 2. void cancel(PendingIntent operation) 1. 2. //注册一个新的闹铃 3. void set(int type, long triggerAtTime, PendingIntent operation) 4. //注册一个重复类型的闹铃 5. void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation) 6. //设置时区 7. void setTimeZone(String timeZone) 5个闹铃类型 public static final int ELAPSED_REALTIME 1. //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传 递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠 2. 时间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是 3
主动发送事件 android
Testing和Instrumentation Android提供了一系列强大的测试工具,它针对Android的环境,扩展了业内标准的JUnit测试框架。尽管你可以使用JUnit 测试Android工程,但Android工具允许你为应用程序的各个方面进行更为复杂的测试,包括单元层面及框架层面。Android测试环境的主要特征有: ●可以访问Android系统对象。 ●Instrumentation框架可以控制和测试应用程序。 ●Android系统常用对象的模拟版本。 ●运行单个test或test suite的工具,带或不带Instrumentation。 ●支持以Eclipse的ADT插件和命令行方式管理Test和Test工程。 这篇文章是对Android测试环境和测试方法的简要介绍,并假设你已经拥有一定的Android应用程序编程及JUnit测试的经验。概要 Android测试环境的核心是一个Instrumentation框架,在这个框架下,你的测试应用程序可以精确控制应用程序。使用Instrumentation,你可以在主程序启动之前,创建模拟的系统对象,如Context;控制应用程序的多个生命周期;发送UI事件给应用程序;在执行期间检查程序状态。Instrumentation框架通过将主程序和测试程序运行在同一个进程来实现这些功能。 通过在测试工程的manifest文件中添加
Android开发流程
Android开发流程 1.创建Android project(HelloWorld项目) 打开Eclipse,点击菜单【File】-à【New】,过程如下图所示. 进入如下对话框
选择【Android Projet】,点击【Next】,进入如下界面。 创建项目选项卡的相关属性 【New Android Project】选项卡属性介绍
Project name 项目名称,本例指定为“HelloWorld”. Contents 设定项目存放的位置,默认放于Workspace中。 Build Target 设定项目运行的目标版本,我们选择最新版本Android 2.2,这就意味着这个项目是基于Android 2.2 版本开发的。 Application name 本项目的应用名称为“Android,你好”。应用名称会在手机程序列表中该应用的图标下方显示,并且在该项目运行时应用名称会在标题栏显示。 Package name 本项目的包名为“com.simcomandroid.hello”. 包结构是java语言的一种规范。 Create Activity ADT会根据此名称自动为项目创建同名的Activity类,建议以“Activity”作为后缀,方便阅读和理解,该项可选,如果不需要ADT自动生成Activity,则可以不选。本例指定为“HelloActivity”. Min SDK V ersion 8这个数字代表了该项目运行的Andriod平台的最低版本是Android 2.2 .比2.2低的版本都不能运行该项目。
最终【New Android Project】选项卡如下图,
Android开发触屏事件的获取和触摸屏幕位置
Android开发-触屏事件的获取和触摸屏幕位置 在修改后的工厂测试程序中,用到了关于触摸事件的获取,顺便学习关于触摸事件和触摸位 Java代码 1.publicbooleanonTouchEvent(MotionEventevent){ 2. 3.//获得触摸的坐标 4.floatx=event.getX(); 5.floaty=event.getY();switch(event.getAction()) 6.{ 7.//触摸屏幕时刻 8.caseMotionEvent.ACTION_DOWN: 9. 10.break; 11.//触摸并移动时刻 12.caseMotionEvent.ACTION_MOVE: 13. 14.break; 15.//终止触摸时刻 16.caseMotionEvent.ACTION_UP: 17.break; 18.} 19.returntrue; 20.} 的知识,其方法如下: 关于publicbooleanonTouchEvent(MotionEventevent)方法: 参数event:参数event为手机屏幕触摸事件封装类的对象,其中封装了该事件的所有信息,例如触摸的位置、触摸的类型以及触摸的时间等。该对象会在用户触摸手机屏幕时被创建。 返回值:该方法的返回值机理与键盘响应事件的相同,同样是当已经完整地处理了该事件且不希望其他回调方法再次处理时返回true,否则返回false。 该方法并不像之前介绍过的方法只处理一种事件,一般情况下以下三种情况的事件全部由onTouchEvent方法处理,只是三种情况中的动作值不同。 屏幕被按下:当屏幕被按下时,会自动调用该方法来处理事件,此时MotionEvent.getAction()的值为MotionEvent.ACTION_DOWN,如果在应用程序中需要处理屏幕被按下的事件,只需重新该回调方法,然后在方法中进行动作的判断即可。 屏幕被抬起:当触控笔离开屏幕时触发的事件,该事件同样需要onTouchEvent方法来捕捉,然后在方法中进行动作判断。当MotionEvent.getAction()的值为MotionEvent.ACTION_UP时,表示是屏幕被抬起的事件。 在屏幕中拖动:该方法还负责处理触控笔在屏幕上滑动的事件,同样是调用MotionEvent.getAction()方法来判断动作值是否为MotionEvent.ACTION_MOVE再进行处理。
Android开发环境搭建图解教程(完整过程详细步骤)
Android开发环境搭建图解教程 一、开发环境搭建 在搭建Android开发环境之前,首先要了解Android对操作系统的要求:Android可以运行在Windows XP及以上的版本上,也可以运行在Mac OS和Linux 等操作系统上,本文以Windows XP为依托进行Android开发环境搭建的讲解。1.安装JDK和配置Java开发环境 Android应用程序开发使用Java语言,因此首先需要搭建Java程序开发运行环境,Java的开发环境称为JDK(Java Development Kit),是Sun Microsystems 针对java程序员开发的产品,自从Java推出以来,JDK已经成为最广泛的Java SDK。JDK是整个Java的核心,包括了Java运行环境JRE(Java Runtime Environment)、Java工具和Java基础类库。 1.1 下载JDK 当前最新版JDK的下载地址为: .oracle./technetwork/java/javase/downloads/jdk-7u2-download-1377129.html 图 1 - 1 1.2 配置JDK
右键点击“我的电脑”,选择“属性”→“高级”→“环境变量”→“系统变量”,找到“Path”变量名(如果没有就新建一个名为“Path”的变量),点击“编辑”按钮,添加JDK安装目录中的“bin”文件夹路径,以分号隔开,如图1-2所示,然后点击“确定”按钮完成设定。 图 1 - 2 再找到“CLASSPATH”变量(如果没有,以同样方法新建一个),输入JDK 安装目录中的“lib”及“demo”的路径,如图1-3所示,点击“确定”按钮完成设定。 1.3 验证JDK是否安装配置成功 安装配置完成之后,需要测试JDK是否安装配置成功。在Windows XP系统中点击“开始”→“运行”,输入“CMD”回车进入命令行模式,键入命令“java -version”,运行结果如图 1-4所示,表示安装JDK安装成功(显示的版本号根据具体情况可能有所不同)。 然后键入命令“javac”,运行结果如图1-5所示,表示JDK环境配置正确。
完全理解AndroidTouchEvent事件分发机制(二)分析解析
完全理解Android TouchEvent事件分发 机制(二) 可以看出来,事件一旦被某一层消费掉,其它层就不会再消费了 到这里其实对事件分发的机制就有个大概了解,知道里面的原理是怎么回事。 下面就让我们来去梳理一下这个事件分发所走的逻辑。 我们仔细思考一下,为什么有的事件有UP有的没有? 为什么Up和Down的顺序不同呢? 为什么要按照这个顺序执行呢? 这个例子主要是为了说明分发、拦截、消费的流程 以例一为例,在每个View 都不拦截down 事件的情况下,down 事件是这样传递的 super.dispatchTouchEvent方法,上面我们介绍过, 这个方法内部实际上是调用的onTouchEvent方法
所以最后的输出日志顺序就是从父到子依次调用分发和拦截,然后从子到父依次调用消费。 例二也是同理,区别在于 当Father拿到事件的时候,选择了拦截下来不再询问其他, 但是Father也没消费,直接又还回给了Grandpa, Grandpa同样也没有消费这个事件。 所以最终的顺序就是,从Grandpa到Father再返回Grandpa就结束了,没有经过LogImageView。 例三的情况就不太一样了 当Grandpa->Father->LogImageView 传递到LogImageView时,LogImageView不消费又返回给了Father,Father在onTouchEvent消费掉了事件。 然后反馈给Father说事件已经消费。,就等于parent.dispatchTouchEvent返回true给上一级的Grandpa, Grandpa不会再调用grandpa.onTouchEvent方法。 从这里我们可以总结出来: **dispatchTouchEvent返回值的作用是用于标志这个事件是否“消费了”, 无论是自己或者下面的子一级用掉了都算是消费掉。** 再如这个例子中,如果我们让LogImageView消费掉事件, 那么Father收到LogImageView的消息后,也会调用parent.dispatchTouchEvent返回true给Grandpa, 所以这个方法返回值的true是只要用掉就行,无论自己还是下面某一级, 而非我把事件传递下去就是true了,下面没人消费最终其实还是返回false的。 至此,我们来总结一下这三个方法的大致作用: dispatchTouchEvent方法内容里处理的是分发过程。可以理解为从Grandpa->Father->LogImageView一层层分发的动作 dispatchTouchEvent的返回值则代表是否将事件分发出去用掉了,自己用或者给某一层子级用都算分发成功。比如Father消费了事件,或者他发出去给的LogImageView消费了事件,
Android程序开发课程标准
《Android程序开发》课程标准 课程编码:01012**** 课程类别:专业必修 适用专业:计算机应用技术授课单位:软件设计教研室 学分:?学时:?*? 编写执笔人及编写日期:董礼 2012.1.6 审定负责人及审定日期: 一、制定课程标准的依据 本课程标准的制定依据是以教高[2006]16号文件的精神为指导,结合高职高专教育中计算机应用技术专业的办学理念及社会所需人才为标准。 二、课程的性质与作用 课程的性质该课程是计算机应用技术专业Java方向的专业课程 课程的作用学习Android程序开发课程首先能让学生熟悉Android系统,进而能够掌握为使用该系统的便携设备设计程序的能力。 三、课程设计理念及思路 课程设计理念:高职教育的集中实践教学环节也要明确必要的理论知识深化和拓展的要求,不能局限于单纯的技能训练作用。单纯的技能训练不是高职教育的理想课程。以职业能力培养为重点,以就业为导向,培养学生具备职业市场所需的职业能力,生涯发展所需的能力和终身学习的能力。 课程设计思路:基于工作过程开发课程,以行动导向进行教学设计,以学生为主体,以实训为手段,设计出理论学习与技能掌握相融合的课程内容体系。教学整体设计“以职业技能培养为目标、以施工任务(项目)为载体、理论学习与实践操作结合。 四、本课程与其它课程的关系
表1 与前期课程的关系 五、课程的教学目标 通过这门课程的学习,使学生对Android程序开发有一个全面的了解,掌握相关的知识点,在软件设计中能灵活地运用这几种技术进行系统开发。 职业能力目标:培养学生编写规范化的程序代码,自主的学习能力,良好的与人沟通能力,良好的团队合作精神。 六、课程的内容与要求 按照课程教学目标及岗位职业素质的要求,结合学生的认知特点,设计教学单元和教学内容如下:
android软件安装原理
android 软件安装原理 将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大 小约为原始apk文件大小的四分之一) 安装过程:复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik字 节码)保存到dalvik-cache目录,并data/data目录下创建对应的应用数据目录。 卸载过程:删除安装过程中在上述三个目录下创建的文件及目录。 一、系统应用安装: PackageManagerService处理各种应用的安装,卸载,管理等工作,开机时由systemServer启 动此服务 (源文件路径: android\frameworks\base\services\java\com\android\server\PackageManagerService.java) PackageManagerService服务启动的流程: 1. 首先扫描安装“system\framework”目录下的jar包 1. scanDirLI(mFrameworkDir,PackageParser.PARSE_IS_SYSTEM, scanMode | SCAN_NO_DEX); 2.第二步扫描安装“system\app”目录下的各个系统应用 scanDirLI(mSystemAppDir,PackageParser.PARSE_IS_SYSTEM, scanMode); 3.第三步扫描“data\app”目录,即用户安装的第三方应用 scanDirLI(mAppInstallDir, 0, scanMode); 4.第四步扫描" data\app-private"目录,即安装DRM保护的APK文件(目前没有遇到过此类 的应用)。 scanDirLI(mDrmAppPrivateInstallDir,0, scanMode | SCAN_FORWARD_LOCKED); 安装应用的过程 1.scanDirLI(Filedir, int flags, intscanMode) 遍历安装指定目录下的文件 2.scanPackageLI(FilescanFile, File destCodeFile, FiledestResourceFile, intparseFlags, intscanMode) 安装package文件 3.scanPackageLI( File scanFile, File destCodeFile, FiledestResourceFile, PackageParser.Packagepkg, intparseFlags, intscanMode) 通过解析安装包parsePackage获取到安装包的信息结构 4.mInstaller.install(pkgName,pkg.applicationInfo.uid, pkg.applicationInfo.uid); 实现文件复制的安装过程 (源文件路径:frameworks\base\cmds\installd\installd.install) 二、从market上下载应用: Google Market应用需要使用gmail账户登录才可以使用,选择某一应用后,开始下载安装包,此过程中,在手机的信号区有进度条提示,下载完成后,会自动调用Packagemanager的接 口安装,调用接口如下: publicvoidinstallPackage(final Uri packageURI, final IPackageInstallObserverobserver,finalint flags) final Uri packageURI:文件下载完成后保存的路径 final IPackageInstallObserver observer:处理返回的安装结果
Android按键事件处理流程 -- KeyEvent
Android按键事件处理流程 -- KeyEvent 2014/6/24 13:18:58 xiaoweiz 程序员俱乐部我要评论(0) ?摘要:刚接触Android开发的时候,对touch、key事件的处理总是一知半解,一会是Activity 里的方法,一会是各种View中的,自己始终不清楚到底哪个在先哪个在后,总之对整个处理流程没能很好的把握。每次写这部分代码的时候都有些心虚,因为我不是很清楚什么时候、以什么样的顺序被调用,大都是打下log看看,没问题就算ok了。但随着时间流逝,这种感觉一直折磨着我。期间也在网上搜索了相关资料,但总感觉不是那么令人满意。自打开始研究Android源码起 ?标签:事件android KEY流程事件处理 ? 刚接触Android开发的时候,对touch、key事件的处理总是一知半解,一会是Activity里的方法,一会是各种View 中的,自己始终不清楚到底哪个在先哪个在后,总之对整个处理流程没能很好的把握。 每次写这部分代码的时候都有些心虚, 因为我不是很清楚什么时候、以什么样的顺序被调用,大都是打下log看看,没问题就算ok了。但随着时间流逝,这种感觉一直 折磨着我。期间也在网上搜索了相关资料,但总感觉不是那么令人满意。自打开始研究Android源码起,这部分内容的分析早就 被列在我的TODO list上了。因为弄懂这部分处理逻辑对明明白白地写android程序实在是太重要了,所以今天我就带领大家看看 这部分的处理逻辑。touch事件的处理我将放在另一篇博客中介绍(相比KeyEvent,大体都一样,只是稍微复杂些)。 为了突出本文的重点,我们直接从事件被派发到View层次结构的根节点DecorView 开始分析,这里我们先来看看DecorView# dispatchKeyEvent方法,代码如下: @Override publicboolean dispatchKeyEvent(KeyEvent event) { finalint keyCode = event.getKeyCode(); finalint action = event.getAction(); finalboolean isDown = action == KeyEvent.ACTION_DOWN; /// 1. 第一次down事件的时候,处理panel的快捷键 if (isDown && (event.getRepeatCount() == 0)) {