工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.51099.com 注册 | 登陆
浏览模式: 标准 | 列表2011年06月的文章

Android 常用开发术语

1.apk扩展名  
apk是Android包的扩展名,一个Android包包含了与某个Android应用程序相关的所有文件,apk文件将AndroidManifest.xml文件、应用程序代码(dex文件)、资源文件和其他文件组成一个压缩包,一个项目只能打包压缩成一个apk文件。

2..dex扩展名
Android的程序被编译成.dex(Dalvik Executable)格式文件, 然后再进行打包生成可被直接安装的apk文件。

3.应用程序(APP)
一个或多个Activity、服务、监听和Intent接收器的集合,一个应用程序有一个文件清单,并且打包成一个apk文件。

3.Action  
对Intent发送器意图的描述,一个活动是一个指派给Intent的字符串值。活动字符串可以由Android定义,也可以由第三方开发者定义。例如,在网页URL中使用的android.intent.action.VIEW或者在用户应用程序中使用的 com.example.rumbler.SHAKE_PHONE来使电话震动。
  
4.ADB( Android Debug Bridge )
SDK自带的一个基于命令行的调试程序。它提供了设备浏览工具、设备上的拷贝工具和为调试转寄端口的功能。更多信息请参考附录三(Android的ADB工具使用)。

5.内容源  
内容源是建立在类ContentProvider之上的用于处理指定格式的内容请求字符串,并返回指定格式的数据的类。关于内容源的使用信息请参考本书第7章内容。

6.Dalvik Android
虚拟机的名字,Dalvik虚拟机是一个只能解释执行dex文件的虚拟机,dex文件针对存储性能和内存管理进行了优化。 Dalvik虚拟机是基于寄存器的虚拟机,并且能够运行经过Dalvik自带的“dx”工具转换过的Java类。 虚拟机运行在兼容Posix的操作系统上,依赖于底层的功能(如线程和低级内存管理)。Dalvik的核心类库有意做得与Java标准版非常类似,但它明显更适合小型移动设备。

7.DDMS  
调试监视服务(Dalvik Debug Monitor ServiceDalvik)是SDK自带的一个可视的调试工具。它提供了屏幕捕捉、日志存储和进程检测能力。

8.Drawable
    编译过的可视化资源,可以用来做背景、标题或屏幕的其他部分。它被编译在android.graphics.drawable子类中。

9.意图(Intent)  
意图是一个Intent类,它包含很多描述调用者意图做什么的字段。调用者发送意图到Android意图处理器,意图处理器会遍历所有应用程序的意图过滤器来查找与该意图最匹配的Activity。意图字段包括渴望的动作、种类、数据、数据的MIME类型、一个处理类和其他约束。  

10.意图过滤器(intent-filter)
Activity和意图接收器(Receiver)在它们的文件清单中包含一个或多个过滤器,用来描述什么类型的意图或者信息是它们能处理或想接收的。一个意图过滤器列出了一系列要求,例如,意图或信息必须满足的数据类型、被请求的动作和URI的格式。 对于Activity,Android搜索意图和Activity过滤器匹配程度最高的Activity;对于消息,Android会将消息转发给所有匹配意图过滤器的接收器。

11.Intent接收器(Receiver)
一个监听是由Context.broadcastIntent()发出的信息广播的类,详细信息请参考本书第9章。

12.布局资源  
一个描述Activity屏幕布局的XML文件。

13.文件清单  
应用程序中的一个XML文件,用于描述包中多个Activity、Intent过滤器、服务和其他内容。可以打开AndroidManifest.xml查看其包含的内容。

14.Nine-patch / 9-patch / Ninepatch image  
一种可变尺寸的位图资源,可用作设备上的背景或其他图片。
  
15.资源  
用户提供的XML、位图或其他文件,构建程序时会导入进来,稍后会被代码加载,Android支持多种类型的资源,请参考Resources中的详细描述,程序定义的资源文件应当保存在res/ 子目录下。  

16.服务(Service)  
运行在后台执行多种固定任务的类,如播放音乐或检测网络活动。

17.主题(Theme)
一系列定义多种默认显示设置的参数(文字大小、背景颜色等)。Android在R.style中提供了几个标准的主题(以"Theme_"开头)。

18.URIs  
Android使用URI字符串请求数据(如通信录列表)和动作(如在浏览器中打开网页)。URI字符串可以具有不同的格式。所有请求数据的URI必须以“content://”开头。有效的动作URI字符串会被设备上的适当的程序处理,例如,以“ http://”开头的URI字符串会被浏览器处理。

Android源代码分布结构


google提供的Android包含了原始Android的目标机代码,主机编译工具、仿真环境,代码包经过解压缩后,第一级别的目录和文件如下所示:
|-- Makefile        (全局的Makefile)
|-- bionic          (Bionic含义为仿生,这里面是一些基础的库的源代码)
|-- bootloader      (引导加载器)
|-- build           (build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具)
|-- dalvik          (Java虚拟机)
|-- development     (程序开发所需要的模板和工具)
|-- external        (目标机器使用的一些库)
|-- frameworks      (应用程序的框架层)
|-- hardware        (与硬件相关的库)
|-- kernel          (Linux2.6的源代码)
|-- packages        (Android的各种应用程序)
|-- prebuilt        (Android在各种平台下编译的预置脚本)
|-- recovery        (与目标的恢复功能相关)
`-- system          (Android的底层的一些库)

bionic目录展开一个级别的目录如下所示:
bionic/
|-- Android.mk
|-- libc
|-- libdl
|-- libm
|-- libstdc++
|-- libthread_db
`-- linker
bootloader目录展开的两个级别目录:
bootloader/
`-- legacy
    |-- Android.mk
    |-- README
    |-- arch_armv6
    |-- arch_msm7k
    |-- fastboot_protocol.txt
    |-- include
    |-- libboot
    |-- libc
    |-- nandwrite
    `-- usbloader
build目录展开的一个级别的目录如下所示:
build/
|-- buildspec.mk.default
|-- cleanspec.mk
|-- core                       (各种以mk为结尾的文件,它门是编译所需要的Makefile)
|-- envsetup.sh
|-- libs
|-- target                     (包含board和product两个目录,为目标所需要文件)
`-- tools                      (编译过程中主机所需要的工具,一些需要经过编译生成)
其中,core中的Makefile是整个Android编译所需要的真正的Makefile,它被顶层目录的Makefile引用。
envsetup.sh是一个在使用仿真器运行的时候,用于设置环境的脚本。
dalvik目录用于提供Android JAVA应用程序运行的基础————JAVA虚拟机。
development目录展开的一个级别的目录如下所示:
development
|-- apps                       (Android应用程序的模板)
|-- build                      (编译脚本模板)
|-- cmds
|-- data
|-- docs
|-- emulator                   (仿真相关)
|-- host                       (包含windows平台的一些工具)
|-- ide
|-- pdk
|-- samples                    (一些示例程序)
|-- simulator                  (大多是目标机器的一些工具)
`-- tools
在emulator目录中qemud是使用QEMU仿真时目标机器运行的后台程序,skins是仿真时手机的界面。
samples中包含了很多Android简单工程,这些工程为开发者学习开发Android程序提供了很大便利,可以作为模板使用。
external目录展开的一个级别的目录如下所示:
external/
|-- aes
|-- apache-http
|-- bluez
|-- clearsilver
|-- dbus
|-- dhcpcd
|-- dropbear
|-- elfcopy
|-- elfutils
|-- emma
|-- esd
|-- expat
|-- fdlibm
|-- freetype
|-- gdata
|-- giflib
|-- googleclient
|-- icu4c
|-- iptables
|-- jdiff
|-- jhead
|-- jpeg
|-- libffi
|-- libpcap
|-- libpng
|-- libxml2
|-- netcat
|-- netperf
|-- neven
|-- opencore
|-- openssl
|-- oprofile
|-- ping
|-- ppp
|-- protobuf
|-- qemu
|-- safe-iop
|-- skia
|-- sonivox
|-- sqlite
|-- srec
|-- strace
|-- tagsoup
|-- tcpdump
|-- tinyxml
|-- tremor
|-- webkit
|-- wpa_supplicant
|-- yaffs2
`-- zlib
在external中,每个目录表示Android目标系统中的一个模块,可能有一个或者若干个库构成。其中:
opencore为PV(PacketVideo),它是Android多媒体框架的核心。
webkit是Android网络浏览器的核心。
sqlite是Android数据库系统的核心。
openssl是Secure Socket Layer,一个网络协议层,用于为数据通讯提供安全支持。
frameworks目录展开的一个级别的目录如下所示:
frameworks/
|-- base
|-- opt
`-- policies
frameworks是Android应用程序的框架。
hardware是一些与硬件相关的库
kernel是Linux2.6的源代码
packages目录展开的两个级别的目录如下所示:
packages/
|-- apps
|   |-- AlarmClock
|   |-- Browser
|   |-- Calculator
|   |-- Calendar
|   |-- Camera
|   |-- Contacts
|   |-- Email
|   |-- GoogleSearch
|   |-- HTMLViewer
|   |-- IM
|   |-- Launcher
|   |-- Mms
|   |-- Music
|   |-- PackageInstaller
|   |-- Phone
|   |-- Settings
|   |-- SoundRecorder
|   |-- Stk
|   |-- Sync
|   |-- Updater
|   `-- VoiceDialer
`-- providers
    |-- CalendarProvider
    |-- ContactsProvider
    |-- DownloadProvider
    |-- DrmProvider
    |-- GoogleContactsProvider
    |-- GoogleSubscribedFeedsProvider
    |-- ImProvider
    |-- MediaProvider
    `-- TelephonyProvider
packages中包含两个目录,其中apps中是Android中的各种应用程序,providers是一些内容提供者(在Android中的一个数据源)。
packages中两个目录的内容大都是使用JAVA编写的程序,各个文件夹的层次结构是类似的。
prebuilt目录展开的一个级别的目录如下所示:
prebuilt/
|-- Android.mk
|-- android-ARM
|-- common
|-- darwin-x86
|-- linux-x86
`-- windows
system目录展开的两个级别的目录如下所示:
system/
|-- bluetooth
|   |-- bluedroid
|   `-- brfpatch
|-- core
|   |-- Android.mk
|   |-- README
|   |-- adb
|   |-- cpio
|   |-- debuggerd
|   |-- fastboot
|   |-- include            (各个库接口的头文件)
|   |-- init
|   |-- libctest
|   |-- libcutils
|   |-- liblog
|   |-- libmincrypt
|   |-- libnetutils
|   |-- libpixelflinger
|   |-- libzipfile
|   |-- logcat
|   |-- logwrapper
|   |-- mkbootimg
|   |-- mountd
|   |-- netcfg
|   |-- rootdir
|   |-- sh
|   `-- toolbox
|-- extras
|   |-- Android.mk
|   |-- latencytop
|   |-- libpagemap
|   |-- librank
|   |-- procmem
|   |-- procrank
|   |-- showmap
|   |-- showslab
|   |-- sound
|   |-- su
|   |-- tests
|   `-- timeinfo
`-- WLAN
    `-- ti

Android手机系统快捷键大全

全局快捷键启动(默认,可以自己定义修改,search键+任意字母键)quick launch:
Browser SEARCH + b
Contacts SEARCH + c
E-Mail SEARCH + e
Google Mail SEARCH + g
Calendar SEARCH + l
Maps SEARCH + m
Music SEARCH + p
Messaging SEARCH + s
YouTube SEARCH + y
弹出长按菜单:   触屏上选中长按,或是 长按轨迹球

列表中的浏览:Navigation within lists
下翻页 SPACEBAR
上翻页 SHIFT + SPACEBAR
跳转到页尾 ALT + TRACKBALL roll DOWN
跳转到页首 ALT + TRACKBALL roll UP          文本输入和浏览 Typing and text navigation tips:
插入特殊符号 ALT + SPACEBAR opens special character selector
从左起删除 DEL
从右起删除 SHIFT + DEL
删除整行 ALT + DEL
CAPS大写锁定; 双按 SHIFT ,再按取消
光标跳转到首字/尾字 ALT + roll TRACKBALL left/right
制表符 ALT + q
高亮选中文本 SHIFT + roll TRACKBALL
剪切 MENU + x, 或是高亮选中文本后,长按轨迹球,选择弹出菜单中的Cut
复制 MENU + c, 或是高亮选中文本后,长按轨迹球,选择弹出菜单中的Copy
粘贴 MENU + v, 或是高亮选中文本后,长按轨迹球,选择弹出菜单中的Paste
Undo MENU + z
全选   MENU + a, 或是高亮选中文本后,长按轨迹球,选择弹出菜单中的

内置浏览器 Browser shortcuts
Open Go to window MENU + s
Open Bookmarks MENU + b
Open Windows MENU + w
View history MENU + h
Refresh or stop page MENU + r
Go back a page MENU + j
Go forward a page MENU + k
Find on page MENU + f
Go to home page MENU + ENTER
Zoom in MENU + i
Zoom out MENU + o
Go to Settings MENU + p
Page down SPACEBAR
Page up SHIFT + SPACEBAR


GoogleMap shortcuts
Directions MENU + d
Select map mode MENU + m
History MENU + h
My Location MENU + 0 (zero)
Go to Settings MENU + p
Zoom in MENU + i
Zoom out MENU + o

Gmail:
F – Forward (while viewing message)
R – Reply (while viewing message)
A – Reply All (while viewing message)
Y – Archive (while viewing message or from list

Dalvik虚拟机简介

google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野。它对内存的高效使用,和在低速CPU上表现出的高性能,确实令人刮目相看。依赖于底层Posix兼容的操作系统,它可以简单的完成进程隔离和线程管理。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。
很多人认为Dalvik虚拟机是一个Java虚拟机,因为Android的编程语言恰恰就是Java语言。但是这种说法并不准确,因为Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者并不兼容;同时还要两个明显的不同:
Java虚拟机运行的是Java字节码,而Dalvik虚拟机运行的则是其专有的文件格式DEX(Dalvik Executable)。
在Java SE程序中的Java类会被编译成一个或者多个字节码文件(.class)然后打包到JAR文件,而后Java虚拟机会从相应的CLASS文件和JAR文件中获取相应的字节码;Android应用虽然也是使用Java语言进行编程,但是在编译成CLASS文件后,还会通过一个工具(dx)将应用所有的CLASS文件转换成一个DEX文件,而后Dalvik虚拟机会从其中读取指令和数据

对Android启动过程的进一步研究,兼谈busybox的安装

对于关注Android底层的朋友来说,其具体的启动过程应该是比较吸引我们的。但是很多启动文件什么的,都得adb push到host上来看,挺不方便的,都怪Android自带的Toolbox太简略了。所以在深入了解Android的启动流程之前,我们来把 Busybox安装到Android上去,这样,就有很多工具供我们使用了。

首先去busybox主页 下载最新版本的源代码,然后用arm的交叉编译器编译出busybox的可执行程序,编译的时候需要注意一些设置选项,例如

Build Options  --->
    Build BusyBox as a static binary (no shared libs) 这个要选上,因上这样子编译出来的busyBox才是可以独立运行的。
          │ Do you want to build BusyBox with a Cross Compiler?              │ │
          │ │(/HOME/toolchains/gcc-4.0.2-glibc-2.3.5/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu│ 这是交叉编译器的路径,要根据具体的情况来设置。
    Installation Options  --->
         Don't use /usr
    这样子编译出来的busybox才不会安装到你主机的/usr目录下。一定要选上。

busybox的功能选项根据需要自选,但是不要太贪心.

OK,这里就不纠缠于编译busybox的东西了,网上资料无数。接下来,我们把busybox安装到模拟器上去。先在模拟器上随便建一个busybox的文件夹,然后进入busybox可执行文件目录,使用命令

    adb push busybox.asc /data/busybox/busybox

然后进入adb shell,chmod 777 ./busybox,就可以直接使用了。但现在还是不方便,总不能每用一个命令就输一次busybox吧?所以,我们可以先用./busybox --install将程序都安装到当前目录下,然后把当前目录添加到PATH变量中即可。暂时使用export来添加吧,如果想永久添加,往下看。

好了,准备工作完成,开始研究的工作了。既然是研究启动过程,那当然是先看看init.rc文件。去etc目录打开它,分析一下内容,首先是对env的定义,也就是全局环境变量的定义,接下来的建立和初始化里面的内容目前还不清楚什么意思,紧接着就是系统启动时运行的初始进程信息,这个比较有意思,包括了 usbd-config和qemu,qemu自不用说,而usbd-config作为初始启动的进程,应该就是和上一篇文章猜的一样,用来调试或者usb 通信的。往下看,是在初始启动进程完成之后开始启动的服务进程,这些进程如果因故退出,会自动重启。这里面包括了console控制台,adbd监护进程,usbd监护进程,debuggerd监护进程等.除去这些守护进程,能引起我们注意的,是runtime和zygote。这两个进程似乎掌管着其他进程以及应用程序的启动。

现在,来让我们做一个实验吧,将自动调用的启动过程变成手动,看看启动流程具体是什么样的。想达到这个目的,首先就是要修改init.rc文件,当然不是在模拟器的console中改,一是不能改,二是你改了也没用,下次加载就会给你覆盖了。所以,我们要从原始镜像ramdisk.img入手了。从2.6标准Linux内核开始,initrd.img都采用cpio压缩,猜测ramdisk.img也一样,需要使用gunzip解压缩,然后再使用cpio解包。好,进入tools/lib/images目录下,先用file命令看看ramdisk.img的类型,没错,系统提示

    ramdisk.img: gzip compressed data, from Unix

很好,然后将ramdisk.img复制一份到任何其他目录下,将其名称改为ramdisk.img.gz,并使用命令

    gunzip ramdisk.img.gz

然后新建一个文件夹,叫ramdisk吧,进入,输入命令

    cpio -i -F ../ramdisk.img

这下,你就能看见并操作ramdisk里面的内容了。当然你也可以直接在外面进行操作,但是还是建议把cpio解压缩出来的内容全部集中在一个文件夹里面,因为一会我们还要将其压缩成新的ramdisk.img。

OK,现在开始修改步骤吧。用任何一款编辑器打开init.rc,首先在PATH那里加上你的Busybox安装路径,然后注释内容,我们要手工启动他们。

    #    zygote {
    #        exec /system/bin/app_process
    #        args {
    #            0 -Xzygote
    #            1 /system/bin
    #            2 --zygote
    #        }
    #        autostart 1
    #    }

    #    runtime {
    #        exec /system/bin/runtime
    #        autostart 1
    #    }

在这里需要注意,不要同时把两者都注释了,注释某一个,再试验手工启动它,如果两者同时注释我这里有问题,无法启动。

好,接下来,使用下列命令重新打包成镜像

    cpio -i -t -F ../ramdisk.img > list
    cpio -o -H newc -O lk.img < list

当前目录下生成的lk.img就是我们的新镜像了。使用自己的镜像启动emulator;

    emulator -console -ramdisk lk.img

如果我们注释的是zygote,那么在#后输入

    app_process -Xzygote /system/bin --zygote

手工启动,命令行中输出的信息是

    Prepping: /system/app/AlarmProvider.apk:/system/app/Browser.apk:/system/app/Calendar.apk:/system/app/Camera.apk:/system/app/Contacts.apk:
    /system/app/Development.apk:/system/app/GDataFeedsProvider.apk:/system/app/Gmail.apk:/system/app/GmailProvider.apk:/system/app/GoogleApps.apk:
    /system/app/GoogleAppsProvider.apk:/system/app/Home.apk:/system/app/ImProvider.apk:/system/app/Maps.apk:/system/app/MediaPickerActivity.apk:
    /system/app/MediaProvider.apk:/system/app/Phone.apk:/system/app/PimProvider.apk:/system/app/ApiDemos.apk:/system/app/SettingsProvider.apk:
    /system/app/Sms.apk:/system/app/SyncProvider.apk:/system/app/TelephonyProvider.apk:/system/app/XmppService.apk:/system/app/YouTube.apk
    File not found: /system/app/AlarmProvider.apk
    File not found: /system/app/Calendar.apk
    File not found: /system/app/Camera.apk
    File not found: /system/app/GDataFeedsProvider.apk
    File not found: /system/app/Gmail.apk
    File not found: /system/app/GmailProvider.apk
    File not found: /system/app/MediaPickerActivity.apk
    File not found: /system/app/PimProvider.apk
    File not found: /system/app/ApiDemos.apk
    File not found: /system/app/Sms.apk
    File not found: /system/app/SyncProvider.apk
    File not found: /system/app/YouTube.apk
    Prep complete

嘿嘿,从File not found的信息中可以看到一些Google可能会即将推出的应用,比如Gmail什么的。

如果我们注释的是runtime,那么输出信息是:

    +++ post-zygote

老实说,没有明白这是啥意思,呵呵。

好了,今天就说到这,基本的方法就是这样,有兴趣的朋友可以进一步深入研究。我们下一篇文章见。时间上的老鸟

Android屏幕禁止休眠的方法

Android屏幕禁止休眠的方法 实现这一功能的方法有两种,一种是在Manifest.xml文件里面声明,一种是在代码里面修改LayoutParams的标志位。具体如下:

1、在Manifest.xml文件里面用user-permission声明。代码如下:

  1.  
  2. [post]    <uses-permission android:name="android.permission.WAKE_LOCK">
  3.      </uses-permission>[/post]

  这种方法,在安装apk时,系统会提示安装人是否允许使用禁止休眠功能。

2、在程序中用代码实现。代码如下:

本部分设定了隐藏,您已回复过了,以下是隐藏的内容

  1.  
  2. getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  


把这段代码加在setContentView(R.layout.main)之前即可

Android开发中实现多点触摸的方法

 我们曾就《Android手势识别ViewFlipper触摸动画》做过详细的讲解,其实,Android应用程序开发中,多点触摸(Multitouch)不是那么遥不可及,实现起来也很简单。如果您对开发多点触摸程序感兴趣的话,那么本文将是一个很好的开始,本例只需要两个类就能实现多点触摸。
首先来看看我们的视图类MTView.java:

  1. package com.ideasandroid.demo;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.view.MotionEvent;  
  8. import android.view.SurfaceHolder;  
  9. import android.view.SurfaceView;  
  10.   
  11. public class MTView extends SurfaceView implements SurfaceHolder.Callback {  
  12.   
  13.     private static final int MAX_TOUCHPOINTS = 10;  
  14.     private static final String START_TEXT = "请随便触摸屏幕进行测试";  
  15.     private Paint textPaint = new Paint();  
  16.     private Paint touchPaints[] = new Paint[MAX_TOUCHPOINTS];  
  17.     private int colors[] = new int[MAX_TOUCHPOINTS];  
  18.   
  19.     private int width, height;  
  20.     private float scale = 1.0f;  
  21.   
  22.     public MTView(Context context) {  
  23.         super(context);  
  24.         SurfaceHolder holder = getHolder();  
  25.         holder.addCallback(this);  
  26.         setFocusable(true); // 确保我们的View能获得输入焦点  
  27.         setFocusableInTouchMode(true); // 确保能接收到触屏事件  
  28.         init();  
  29.     }  
  30.   
  31.     private void init() {  
  32.         // 初始化10个不同颜色的画笔  
  33.         textPaint.setColor(Color.WHITE);  
  34.         colors[0] = Color.BLUE;  
  35.         colors[1] = Color.RED;  
  36.         colors[2] = Color.GREEN;  
  37.         colors[3] = Color.YELLOW;  
  38.         colors[4] = Color.CYAN;  
  39.         colors[5] = Color.MAGENTA;  
  40.         colors[6] = Color.DKGRAY;  
  41.         colors[7] = Color.WHITE;  
  42.         colors[8] = Color.LTGRAY;  
  43.         colors[9] = Color.GRAY;  
  44.         for (int i = 0; i < MAX_TOUCHPOINTS; i++) {  
  45.             touchPaints[i] = new Paint();  
  46.             touchPaints[i].setColor(colors[i]);  
  47.         }  
  48.     }  
  49.   
  50.     /*  
  51.      * 处理触屏事件  
  52.      */  
  53.     @Override  
  54.     public boolean onTouchEvent(MotionEvent event) {  
  55.         // 获得屏幕触点数量  
  56.         int pointerCount = event.getPointerCount();  
  57.         if (pointerCount > MAX_TOUCHPOINTS) {  
  58.             pointerCount = MAX_TOUCHPOINTS;  
  59.         }  
  60.         // 锁定Canvas,开始进行相应的界面处理  
  61.         Canvas c = getHolder().lockCanvas();  
  62.         if (c != null) {  
  63.             c.drawColor(Color.BLACK);  
  64.             if (event.getAction() == MotionEvent.ACTION_UP) {  
  65.                 // 当手离开屏幕时,清屏  
  66.             } else {  
  67.                 // 先在屏幕上画一个十字,然后画一个圆  
  68.                 for (int i = 0; i < pointerCount; i++) {  
  69.                     // 获取一个触点的坐标,然后开始绘制  
  70.                     int id = event.getPointerId(i);  
  71.                     int x = (int) event.getX(i);  
  72.                     int y = (int) event.getY(i);  
  73.                     drawCrosshairsAndText(x, y, touchPaints[id], i, id, c);  
  74.                 }  
  75.                 for (int i = 0; i < pointerCount; i++) {  
  76.                     int id = event.getPointerId(i);  
  77.                     int x = (int) event.getX(i);  
  78.                     int y = (int) event.getY(i);  
  79.                     drawCircle(x, y, touchPaints[id], c);  
  80.                 }  
  81.             }  
  82.             // 画完后,unlock  
  83.             getHolder().unlockCanvasAndPost(c);  
  84.         }  
  85.         return true;  
  86.     }  
  87.   
  88.     /**  
  89.      * 画十字及坐标信息  
  90.      *  
  91.      * @param x  
  92.      * @param y  
  93.      * @param paint  
  94.      * @param ptr  
  95.      * @param id  
  96.      * @param c  
  97.      */  
  98.     private void drawCrosshairsAndText(int x, int y, Paint paint, int ptr,  
  99.             int id, Canvas c) {  
  100.         c.drawLine(0, y, width, y, paint);  
  101.         c.drawLine(x, 0, x, height, paint);  
  102.         int textY = (int) ((15 + 20 * ptr) * scale);  
  103.         c.drawText("x" + ptr + "=" + x, 10 * scale, textY,
  104.         c.drawText("y" + ptr + "=" + y, 70 * scale, textY,
  105.         c.drawText("id" + ptr + "=" + id, width - 55 * sc
  106.     }  
  107.   
  108.     /**  
  109.      * 画圆  
  110.      *  
  111.      * @param x  
  112.      * @param y  
  113.      * @param paint  
  114.      * @param c  
  115.      */  
  116.     private void drawCircle(int x, int y, Paint paint, Canvas c
  117.         c.drawCircle(x, y, 40 * scale, paint);  
  118.     }  
  119.   
  120.     /*  
  121.      * 进入程序时背景画成黑色,然后把“START_TEXT”写到屏幕  
  122.      */  
  123.     public void surfaceChanged(SurfaceHolder holder, int format, i
  124.             int height) {  
  125.         this.width = width;  
  126.         this.height = height;  
  127.         if (width > height) {  
  128.             this.scale = width / 480f;  
  129.         } else {  
  130.             this.scale = height / 480f;  
  131.         }  
  132.         textPaint.setTextSize(14 * scale);  
  133.         Canvas c = getHolder().lockCanvas();  
  134.         if (c != null) {  
  135.             // 背景黑色  
  136.             c.drawColor(Color.BLACK);  
  137.             float tWidth = textPaint.measureText(START_TEXT);
  138.             c.drawText(START_TEXT, width / 2 - tWidth / 2
  139.                     textPaint);  
  140.             getHolder().unlockCanvasAndPost(c);  
  141.         }  
  142.     }  
  143.   
  144.     public void surfaceCreated(SurfaceHolder holder) {  
  145.     }  
  146.   
  147.     public void surfaceDestroyed(SurfaceHolder holder) {  
  148.     }  
  149.   
  150. }  

 

接下来看看我们的Activity,MultitouchVisible.java

  1. package com.ideasandroid.demo;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.Window;  
  6. import android.view.WindowManager;  
  7.   
  8. public class MultitouchVisible extends Activity {  
  9.     @Override  
  10.     public void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         //隐藏标题栏  
  13.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  14.         //设置成全屏  
  15.         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
  16.                 WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  17.         //设置为上面的MTView  
  18.         setContentView(new MTView(this));  
  19.     }  
  20. }

301跳转

cat .htaccess
RewriteEngine on
RewriteRule ^(.*)$ http://www.51099.com/$1 [R=301,L]

----------------


vhost
RewriteEngine on
RewriteCond %{HTTP_HOST} ^51099.com$ [NC]
RewriteRule ^(.*)$ http://www.51099.com$1 [R=301,L]

Records:70123456789