<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>O I P O P - 私人领域 &#187; 手机编程</title>
	<atom:link href="http://blog.oipop.com/archives/tag/%e6%89%8b%e6%9c%ba%e7%bc%96%e7%a8%8b/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.oipop.com</link>
	<description>From the Internet, For the Internet.</description>
	<lastBuildDate>Mon, 21 Jun 2010 21:13:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Android permission 访问权限大全</title>
		<link>http://blog.oipop.com/archives/150</link>
		<comments>http://blog.oipop.com/archives/150#comments</comments>
		<pubDate>Tue, 25 May 2010 04:03:32 +0000</pubDate>
		<dc:creator>Kinsta</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[JAVA开发]]></category>
		<category><![CDATA[手机编程]]></category>

		<guid isPermaLink="false">http://blog.oipop.com/?p=150</guid>
		<description><![CDATA[　　程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下:
　　android.permission.ACCESS_CHECKIN_PROPERTIES
　　允许读写访问”properties”表在 checkin数据库中，改值可以修改上传( Allows read/write access to the “properties” table in the checkin database, to change values that get uploaded)
　　android.permission.ACCESS_COARSE_LOCATION
　　允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi) location)
　　android.permission.ACCESS_FINE_LOCATION
　　允许一个程序访问精良位置(如GPS) (Allows an application to access fine (e.g., GPS) location)
　　android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
　　允许应用程序访问额外的位置提供命令(Allows an application to access extra location provider commands)
　　android.permission.ACCESS_MOCK_LOCATION
　　允许程序创建模拟位置提供用于测试(Allows an application to create mock location providers for testing)
　　android.permission.ACCESS_NETWORK_STATE
　　允许程序访问有关GSM网络信息(Allows [...]]]></description>
			<content:encoded><![CDATA[<p>　　程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下:</p>
<p>　　android.permission.ACCESS_CHECKIN_PROPERTIES</p>
<p>　　允许读写访问”properties”表在 checkin数据库中，改值可以修改上传( Allows read/write access to the “properties” table in the checkin database, to change values that get uploaded)</p>
<p>　　android.permission.ACCESS_COARSE_LOCATION<span id="more-150"></span></p>
<p>　　允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi) location)</p>
<p>　　android.permission.ACCESS_FINE_LOCATION</p>
<p>　　允许一个程序访问精良位置(如GPS) (Allows an application to access fine (e.g., GPS) location)</p>
<p>　　android.permission.ACCESS_LOCATION_EXTRA_COMMANDS</p>
<p>　　允许应用程序访问额外的位置提供命令(Allows an application to access extra location provider commands)</p>
<p>　　android.permission.ACCESS_MOCK_LOCATION</p>
<p>　　允许程序创建模拟位置提供用于测试(Allows an application to create mock location providers for testing)</p>
<p>　　android.permission.ACCESS_NETWORK_STATE</p>
<p>　　允许程序访问有关GSM网络信息(Allows applications to access information about networks)</p>
<p>　　android.permission.ACCESS_SURFACE_FLINGER</p>
<p>　　允许程序使用SurfaceFlinger底层特性 (Allows an application to use SurfaceFlinger’s low level features)</p>
<p>　　android.permission.ACCESS_WIFI_STATE</p>
<p>　　允许程序访问Wi-Fi网络状态信息(Allows applications to access information about Wi-Fi networks)</p>
<p>　　android.permission.ADD_SYSTEM_SERVICE</p>
<p>　　允许程序发布系统级服务(Allows an application to publish system-level services).</p>
<p>　　android.permission.BATTERY_STATS</p>
<p>　　允许程序更新手机电池统计信息(Allows an application to update the collected battery statistics)</p>
<p>　　android.permission.BLUETOOTH</p>
<p>　　允许程序连接到已配对的蓝牙设备(Allows applications to connect to paired bluetooth devices)</p>
<p>　　android.permission.BLUETOOTH_ADMIN</p>
<p>　　允许程序发现和配对蓝牙设备(Allows applications to discover and pair bluetooth devices)</p>
<p>　　android.permission.BRICK</p>
<p>　　请求能够禁用设备(非常危险)(Required to be able to disable the device (very *erous!).)</p>
<p>　　android.permission.BROADCAST_PACKAGE_REMOVED</p>
<p>　　允许程序广播一个提示消息在一个应用程序包已经移除后(Allows an application to broadcast a notification that an application package has been removed)</p>
<p>　　android.permission.BROADCAST_STICKY</p>
<p>　　允许一个程序广播常用intents(Allows an application to broadcast sticky intents)</p>
<p>　　android.permission.CALL_PHONE</p>
<p>　　允许一个程序初始化一个电话拨号不需通过拨号用户界面需要用户确认 (Allows an application to initiate a phone call without going through the Dialer user interface for the user to confirm the call being placed.)</p>
<p>　　android.permission.CALL_PRIVILEGED</p>
<p>　　允许一个程序拨打任何号码，包含紧急号码无需通过拨号用户界面需要用户确认(Allows an application to call any phone number, including emergency numbers, without going through the Dialer user interface for the user to confirm the call being placed)</p>
<p>　　android.permission.CAMERA</p>
<p>　　请求访问使用照相设备(Required to be able to access the camera device. )</p>
<p>　　android.permission.CHANGE_COMPONENT_ENABLED_STATE</p>
<p>　　允许一个程序是否改变一个组件或其他的启用或禁用(Allows an application to change whether an application component (other than its own) is enabled or not. )</p>
<p>　　android.permission.CHANGE_CONFIGURATION</p>
<p>　　允许一个程序修改当前设置，如本地化(Allows an application to modify the current configuration, such as locale. )</p>
<p>　　android.permission.CHANGE_NETWORK_STATE</p>
<p>　　允许程序改变网络连接状态(Allows applications to change network connectivity state)</p>
<p>　　android.permission.CHANGE_WIFI_STATE</p>
<p>　　允许程序改变Wi-Fi连接状态(Allows applications to change Wi-Fi connectivity state)</p>
<p>　　android.permission.CLEAR_APP_CACHE</p>
<p>　　允许一个程序清楚缓存从所有安装的程序在设备中(Allows an application to clear the caches of all installed applications on the device. )</p>
<p>　　android.permission.CLEAR_APP_USER_DATA</p>
<p>　　允许一个程序清除用户设置(Allows an application to clear user data)</p>
<p>　　android.permission.CONTROL_LOCATION_UPDATES</p>
<p>　　允许启用禁止位置更新提示从无线模块 (Allows enabling/disabling location update notifications from the radio. )</p>
<p>　　android.permission.DELETE_CACHE_FILES</p>
<p>　　允许程序删除缓存文件(Allows an application to delete cache files)</p>
<p>　　android.permission.DELETE_PACKAGES</p>
<p>　　允许一个程序删除包(Allows an application to delete packages)</p>
<p>　　android.permission.DEVICE_POWER</p>
<p>　　允许访问底层电源管理(Allows low-level access to power management)</p>
<p>　　android.permission.DIAGNOSTIC</p>
<p>　　允许程序RW诊断资源(Allows applications to RW to diagnostic resources. )</p>
<p>　　android.permission.DISABLE_KEYGUARD</p>
<p>　　允许程序禁用键盘锁(Allows applications to disable the keyguard )</p>
<p>　　android.permission.DUMP</p>
<p>　　允许程序返回状态抓取信息从系统服务(Allows an application to retrieve state dump information from system services.)</p>
<p>　　android.permission.EXPAND_STATUS_BAR</p>
<p>　　允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序(Allows an application to expand or collapse the status bar. )</p>
<p>　　android.permission.FACTORY_TEST</p>
<p>　　作为一个工厂测试程序，运行在root用户(Run as a manufacturer test application, running as the root user. )</p>
<p>　　android.permission.FLASHLIGHT</p>
<p>　　访问闪光灯,android开发网提示HTC Dream不包含闪光灯(Allows access to the flashlight )</p>
<p>　　android.permission.FORCE_BACK</p>
<p>　　允许程序强行一个后退操作是否在顶层activities(Allows an application to force a BACK operation on whatever is the top activity. )</p>
<p>　　android.permission.FOTA_UPDATE</p>
<p>　　暂时不了解这是做什么使用的，android开发网分析可能是一个预留权限.</p>
<p>　　android.permission.GET_ACCOUNTS</p>
<p>　　访问一个帐户列表在Accounts Service中(Allows access to the list of accounts in the Accounts Service)</p>
<p>　　android.permission.GET_PACKAGE_SIZE</p>
<p>　　允许一个程序获取任何package占用空间容量(Allows an application to find out the space used by any package. )</p>
<p>　　android.permission.GET_TASKS</p>
<p>　　允许一个程序获取信息有关当前或最近运行的任务，一个缩略的任务状态，是否活动等等(Allows an application to get information about the currently or recently running tasks: a thumbnail representation of the tasks, what activities are running in it, etc.)</p>
<p>　　android.permission.HARDWARE_TEST</p>
<p>　　允许访问硬件(Allows access to hardware peripherals. )</p>
<p>　　android.permission.INJECT_EVENTS</p>
<p>　　允许一个程序截获用户事件如按键、触摸、轨迹球等等到一个时间流，android 开发网提醒算是hook技术吧(Allows an application to inject user events (keys, touch, trackball) into the event stream and deliver them to ANY window.)</p>
<p>　　android.permission.INSTALL_PACKAGES</p>
<p>　　允许一个程序安装packages(Allows an application to install packages. )</p>
<p>　　android.permission.INTERNAL_SYSTEM_WINDOW</p>
<p>　　允许打开窗口使用系统用户界面(Allows an application to open windows that are for use by parts of the system user interface. )</p>
<p>　　android.permission.INTERNET</p>
<p>　　允许程序打开网络套接字(Allows applications to open network sockets)</p>
<p>　　android.permission.MANAGE_APP_TOKENS</p>
<p>　　允许程序管理(创建、催后、 z- order默认向z轴推移)程序引用在窗口管理器中(Allows an application to manage (create, destroy, Z-order) application tokens in the window manager. )</p>
<p>　　android.permission.MASTER_CLEAR目前还没有明确的解释，android开发网分析可能是清除一切数据，类似硬格机</p>
<p>　　android.permission.MODIFY_AUDIO_SETTINGS</p>
<p>　　允许程序修改全局音频设置(Allows an application to modify global audio settings)</p>
<p>　　android.permission.MODIFY_PHONE_STATE</p>
<p>　　允许修改话机状态，如电源，人机接口等(Allows modification of the telephony state ? power on, mmi, etc. )</p>
<p>　　android.permission.MOUNT_UNMOUNT_FILESYSTEMS</p>
<p>　　允许挂载和反挂载文件系统可移动存储 (Allows mounting and unmounting file systems for removable storage. )</p>
<p>　　android.permission.PERSISTENT_ACTIVITY</p>
<p>　　允许一个程序设置他的activities显示 (Allow an application to make its activities persistent. )</p>
<p>　　android.permission.PROCESS_OUTGOING_CALLS</p>
<p>　　允许程序监视、修改有关播出电话(Allows an application to monitor, modify, or abort outgoing calls)</p>
<p>　　android.permission.READ_CALENDAR</p>
<p>　　允许程序读取用户日历数据(Allows an application to read the user’s calendar data.)</p>
<p>　　android.permission.READ_CONTACTS</p>
<p>　　允许程序读取用户联系人数据(Allows an application to read the user’s contacts data.)</p>
<p>　　android.permission.READ_FRAME_BUFFER</p>
<p>　　允许程序屏幕波或和更多常规的访问帧缓冲数据(Allows an application to take screen shots and more generally get access to the frame buffer data)</p>
<p>　　android.permission.READ_INPUT_STATE</p>
<p>　　允许程序返回当前按键状态(Allows an application to retrieve the current state of keys and switches. )</p>
<p>　　android.permission.READ_LOGS</p>
<p>　　允许程序读取底层系统日志文件(Allows an application to read the low-level system log files. )</p>
<p>　　android.permission.READ_OWNER_DATA</p>
<p>　　允许程序读取所有者数据(Allows an application to read the owner’s data)</p>
<p>　　android.permission.READ_SMS</p>
<p>　　允许程序读取短信息(Allows an application to read SMS messages.)</p>
<p>　　android.permission.READ_SYNC_SETTINGS</p>
<p>　　允许程序读取同步设置(Allows applications to read the sync settings)</p>
<p>　　android.permission.READ_SYNC_STATS</p>
<p>　　允许程序读取同步状态(Allows applications to read the sync stats)</p>
<p>　　android.permission.REBOOT</p>
<p>　　请求能够重新启动设备(Required to be able to reboot the device. )</p>
<p>　　android.permission.RECEIVE_BOOT_COMPLETED</p>
<p>　　允许一个程序接收到 ACTION_BOOT_COMPLETED广播在系统完成启动(Allows an application to receive the ACTION_BOOT_COMPLETED that is broadcast after the system finishes booting. )</p>
<p>　　android.permission.RECEIVE_MMS</p>
<p>　　允许一个程序监控将收到MMS彩信,记录或处理(Allows an application to monitor incoming MMS messages, to record or perform processing on them. )</p>
<p>　　android.permission.RECEIVE_SMS</p>
<p>　　允许程序监控一个将收到短信息，记录或处理(Allows an application to monitor incoming SMS messages, to record or perform processing on them.)</p>
<p>　　android.permission.RECEIVE_WAP_PUSH</p>
<p>　　允许程序监控将收到WAP PUSH信息(Allows an application to monitor incoming WAP push messages. )</p>
<p>　　android.permission.RECORD_AUDIO</p>
<p>　　允许程序录制音频(Allows an application to record audio)</p>
<p>　　android.permission.REORDER_TASKS</p>
<p>　　允许程序改变Z轴排列任务(Allows an application to change the Z-order of tasks)</p>
<p>　　android.permission.RESTART_PACKAGES</p>
<p>　　允许程序重新启动其他程序(Allows an application to restart other applications)</p>
<p>　　android.permission.SEND_SMS</p>
<p>　　允许程序发送SMS短信(Allows an application to send SMS messages)</p>
<p>　　android.permission.SET_ACTIVITY_WATCHER</p>
<p>　　允许程序监控或控制activities已经启动全局系统中Allows an application to watch and control how activities are started globally in the system.</p>
<p>　　android.permission.SET_ALWAYS_FINISH</p>
<p>　　允许程序控制是否活动间接完成在处于后台时Allows an application to control whether activities are immediately finished when put in the background.</p>
<p>　　android.permission.SET_ANIMATION_SCALE</p>
<p>　　修改全局信息比例(Modify the global animation scaling factor.)</p>
<p>　　android.permission.SET_DEBUG_APP</p>
<p>　　配置一个程序用于调试(Configure an application for debugging.)</p>
<p>　　android.permission.SET_ORIENTATION</p>
<p>　　允许底层访问设置屏幕方向和实际旋转(Allows low-level access to setting the orientation</p>
<p>(actually rotation) of the screen.)</p>
<p>　　android.permission.SET_PREFERRED_APPLICATIONS</p>
<p>　　允许一个程序修改列表参数 PackageManager.addPackageToPreferred() 和PackageManager.removePackageFromPreferred()方法(Allows an application to modify the list of preferred applications with the PackageManager.addPackageToPreferred() and PackageManager.removePackageFromPreferred() methods.)</p>
<p>　　android.permission.SET_PROCESS_FOREGROUND</p>
<p>　　允许程序当前运行程序强行到前台(Allows an application to force any currently running process to be in the foreground.)</p>
<p>　　android.permission.SET_PROCESS_LIMIT</p>
<p>　　允许设置最大的运行进程数量(Allows an application to set the maximum number of (not needed) application processes that can be running. )</p>
<p>　　android.permission.SET_TIME_ZONE</p>
<p>　　允许程序设置时间区域(Allows applications to set the system time zone)</p>
<p>　　android.permission.SET_WALLPAPER</p>
<p>　　允许程序设置壁纸(Allows applications to set the wallpaper )</p>
<p>　　android.permission.SET_WALLPAPER_HINTS</p>
<p>　　允许程序设置壁纸hits(Allows applications to set the wallpaper hints)</p>
<p>　　android.permission.SIGNAL_PERSISTENT_PROCESSES</p>
<p>　　允许程序请求发送信号到所有显示的进程中 (Allow an application to request that a signal be sent to all persistent processes)</p>
<p>　　android.permission.STATUS_BAR</p>
<p>　　允许程序打开、关闭或禁用状态栏及图标Allows an application to open, close, or disable the status bar and its icons.</p>
<p>　　android.permission.SUBSCRIBED_FEEDS_READ</p>
<p>　　允许一个程序访问订阅RSS Feed内容提供(Allows an application to allow access the subscribed feeds ContentProvider. )</p>
<p>　　android.permission.SUBSCRIBED_FEEDS_WRITE</p>
<p>　　系统暂时保留改设置,android开发网认为未来版本会加入该功能。</p>
<p>　　android.permission.SYSTEM_ALERT_WINDOW</p>
<p>　　允许一个程序打开窗口使用 TYPE_SYSTEM_ALERT，显示在其他所有程序的顶层(Allows an application to open</p>
<p>windows using the type TYPE_SYSTEM_ALERT, shown on top of all other applications. )</p>
<p>　　android.permission.VIBRATE</p>
<p>　　允许访问振动设备(Allows access to the vibrator)</p>
<p>　　android.permission.WAKE_LOCK</p>
<p>　　允许使用PowerManager的 WakeLocks保持进程在休眠时从屏幕消失( Allows using PowerManager WakeLocks to keep processor from sleeping or screen from dimming)</p>
<p>　　android.permission.WRITE_APN_SETTINGS</p>
<p>　　允许程序写入API设置(Allows applications to write the apn settings)</p>
<p>　　android.permission.WRITE_CALENDAR</p>
<p>　　允许一个程序写入但不读取用户日历数据(Allows an application to write (but not read) the user’s calendar data. )</p>
<p>　　android.permission.WRITE_CONTACTS</p>
<p>　　允许程序写入但不读取用户联系人数据(Allows an application to write (but not read) the user’s contacts data. )</p>
<p>　　android.permission.WRITE_GSERVICES</p>
<p>　　允许程序修改Google服务地图(Allows an application to modify the Google service map. )</p>
<p>　　android.permission.WRITE_OWNER_DATA</p>
<p>　　允许一个程序写入但不读取所有者数据(Allows an application to write (but not read) the owner’s data.)</p>
<p>　　android.permission.WRITE_SETTINGS</p>
<p>　　允许程序读取或写入系统设置(Allows an application to read or write the system settings. )</p>
<p>　　android.permission.WRITE_SMS</p>
<p>　　允许程序写短信(Allows an application to write SMS messages)</p>
<p>　　android.permission.WRITE_SYNC_SETTINGS</p>
<p>　　允许程序写入同步设置(Allows applications to write the sync settings)</p>
<p>　　android平台上的权限许可分得很细，如果软件无法正常执行时看看是不是缺少相关的permission声明，最终我们还需要使用 android sign tools签名生成的apk文件。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oipop.com/archives/150/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>j2me中Command出现的优先顺序</title>
		<link>http://blog.oipop.com/archives/55</link>
		<comments>http://blog.oipop.com/archives/55#comments</comments>
		<pubDate>Sun, 16 Aug 2009 11:31:07 +0000</pubDate>
		<dc:creator>Kinsta</dc:creator>
				<category><![CDATA[J2ME开发]]></category>
		<category><![CDATA[JAVA开发]]></category>
		<category><![CDATA[J2ME]]></category>
		<category><![CDATA[手机编程]]></category>

		<guid isPermaLink="false">http://blog.oipop.com/?p=55</guid>
		<description><![CDATA[其实这是有一套规格可循的。规则如下：
1.先比较每个Command物件的命令型态，优先顺序越高的越先出现。
在Command物件之中共定义了八种命令型态，从优先顺序最高到最低列表如下：
Command.BACK Command.BACK
Command.CANCEL Command.CANCEL
Command.EXIT Command.EXIT
Command.HELP Command.HELP
Command.ITEM Command.ITEM
Command.OK Command.OK
Command.SCREEN Command.SCREEN
Command.STOP Command.STOP
2.如果命令型态相同，就比较其优先权，设定值越低的越先出现。
3.如果优先权相同，就以利用addCommand()加入画面的先后顺序决定。
]]></description>
			<content:encoded><![CDATA[<p>其实这是有一套规格可循的。规则如下：<br />
1.先比较每个Command物件的命令型态，优先顺序越高的越先出现。<br />
在Command物件之中共定义了八种命令型态，从优先顺序最高到最低列表如下：<br />
Command.BACK Command.BACK<br />
Command.CANCEL Command.CANCEL<br />
Command.EXIT Command.EXIT<br />
Command.HELP Command.HELP<br />
Command.ITEM Command.ITEM<br />
Command.OK Command.OK<br />
Command.SCREEN Command.SCREEN<br />
Command.STOP Command.STOP<br />
2.如果命令型态相同，就比较其优先权，设定值越低的越先出现。<br />
3.如果优先权相同，就以利用addCommand()加入画面的先后顺序决定。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oipop.com/archives/55/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用线程创建的三种方式实现j2me联网功能</title>
		<link>http://blog.oipop.com/archives/52</link>
		<comments>http://blog.oipop.com/archives/52#comments</comments>
		<pubDate>Fri, 14 Aug 2009 13:29:34 +0000</pubDate>
		<dc:creator>Kinsta</dc:creator>
				<category><![CDATA[J2ME开发]]></category>
		<category><![CDATA[J2ME]]></category>
		<category><![CDATA[JAVA开发]]></category>
		<category><![CDATA[手机编程]]></category>

		<guid isPermaLink="false">http://blog.oipop.com/?p=52</guid>
		<description><![CDATA[在j2me联网时，在eclipse控制台下有一个警告：“若要避免潜在的死锁，应该在commandAction()处理程序之外的其他线程中执行可能会阻塞的，操作（如网络连接）。
为了避免潜在的死锁，我们经常把把联网的代码部分写到一个线程中去执行。
而实际应用中，网络连接的事务也都是使用一个单独的线程进行的。

线程的创建可以使用Runnable接口来实现，也可以使用Thread类实现，还可以以匿名内部类的方式创建。在本文中，分别用这三种方式给出了j2me联网的例子。
代码均测试通过。可以直接使用。
1.通过继承Thread类创建
  import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class OpenConn implements Runnable {
 private HttpURLConnection conn;
 private URL url;
 // Thread thread1;
 public OpenConn(String url) throws MalformedURLException {
  this.url = new URL(url);
 }
 public void run() {
  try {
   conn = (HttpURLConnection) url.openConnection();
  } catch (IOException e) {
   e.printStackTrace();
   url = null;
  }
 }
 public HttpURLConnection getConn() {
  return conn;
 }
 public static void main(String[] args) throws Exception {
  // 创建Runnable类
  OpenConn openConn = [...]]]></description>
			<content:encoded><![CDATA[<p>在j2me联网时，在eclipse控制台下有一个警告：“若要避免潜在的死锁，应该在commandAction()处理程序之外的其他线程中执行可能会阻塞的，操作（如网络连接）。<br />
为了避免潜在的死锁，我们经常把把联网的代码部分写到一个线程中去执行。<br />
而实际应用中，网络连接的事务也都是使用一个单独的线程进行的。<br />
<span id="more-52"></span><br />
线程的创建可以使用Runnable接口来实现，也可以使用Thread类实现，还可以以匿名内部类的方式创建。在本文中，分别用这三种方式给出了j2me联网的例子。<br />
代码均测试通过。可以直接使用。<br />
1.通过继承Thread类创建</p>
<p>  import java.io.BufferedReader;<br />
import java.io.IOException;<br />
import java.io.InputStreamReader;<br />
import java.io.Reader;<br />
import java.net.HttpURLConnection;<br />
import java.net.MalformedURLException;<br />
import java.net.URL;</p>
<p>public class OpenConn implements Runnable {<br />
 private HttpURLConnection conn;<br />
 private URL url;</p>
<p> // Thread thread1;</p>
<p> public OpenConn(String url) throws MalformedURLException {<br />
  this.url = new URL(url);<br />
 }</p>
<p> public void run() {<br />
  try {<br />
   conn = (HttpURLConnection) url.openConnection();<br />
  } catch (IOException e) {<br />
   e.printStackTrace();<br />
   url = null;<br />
  }<br />
 }</p>
<p> public HttpURLConnection getConn() {<br />
  return conn;<br />
 }</p>
<p> public static void main(String[] args) throws Exception {<br />
  // 创建Runnable类<br />
  OpenConn openConn = new OpenConn(&#8220;<a href="http://www.google.com/">http://www.google.com</a>&#8220;);<br />
  // 创建线程<br />
  Thread thread = new Thread(openConn);<br />
  // openConn.thread1=thread;<br />
  thread.start();<br />
  thread.join(10000);// wait 10 seconds<br />
  HttpURLConnection c = openConn.getConn();<br />
  if (c != null) {<br />
   System.out.println(&#8220;连接网络成功&#8230;&#8221;);<br />
   BufferedReader r = new BufferedReader(new InputStreamReader(c<br />
     .getInputStream()));<br />
   String s = r.readLine();<br />
   while (s != null) {<br />
    System.out.println(s);<br />
    s = r.readLine();<br />
   }<br />
  } else {<br />
   System.out.println(&#8220;超时错误,连接网络失败&#8230;&#8221;);<br />
  }<br />
 }<br />
} <br />
2.通过引用Runnable接口创建</p>
<p>import java.io.BufferedReader;<br />
import java.io.IOException;<br />
import java.io.InputStreamReader;<br />
import java.io.Reader;<br />
import java.net.HttpURLConnection;<br />
import java.net.MalformedURLException;<br />
import java.net.URL;</p>
<p>public class OpenConn2 extends Thread {<br />
 private HttpURLConnection conn;<br />
 private URL url;</p>
<p> public OpenConn2(String url) throws MalformedURLException {<br />
  this.url = new URL(url);<br />
 }</p>
<p> public void run() {<br />
  try {<br />
   conn = (HttpURLConnection) url.openConnection();<br />
  } catch (IOException e) {<br />
   e.printStackTrace();<br />
   url = null;<br />
  }<br />
 }</p>
<p> public HttpURLConnection getConn() {<br />
  return conn;<br />
 }</p>
<p> public static void main(String[] args) throws Exception {<br />
  OpenConn2 openConn = new OpenConn2(&#8220;<a href="http://www.google.com/">http://www.google.com</a>&#8220;);<br />
  openConn.start();<br />
  openConn.join(10000);// wait 10 seconds<br />
  HttpURLConnection c = openConn.getConn();<br />
  if (c != null) {<br />
   System.out.println(&#8220;连接网络成功&#8230;&#8221;);<br />
   BufferedReader r = new BufferedReader(new InputStreamReader(c<br />
     .getInputStream()));<br />
   String s = r.readLine();<br />
   while (s != null) {<br />
    System.out.println(s);<br />
    s = r.readLine();<br />
   }<br />
  } else {<br />
   System.out.println(&#8220;超时错误,连接网络失败&#8230;&#8221;);<br />
  }<br />
 }<br />
}<br />
3.以匿名内部类的方式创建<br />
即在一个方法中创建线程，当方法被调用时，线程即启动，如下：<br />
import java.io.BufferedReader;<br />
import java.io.IOException;<br />
import java.io.InputStreamReader;<br />
import java.net.HttpURLConnection;<br />
import java.net.URL;</p>
<p>public class OpenConn3 {<br />
 private HttpURLConnection conn;<br />
 private URL url;<br />
 <br />
 public static void main(String[] args){<br />
  try{<br />
   OpenConn3 open3= new OpenConn3();<br />
   open3.strartMyThread();<br />
  }catch(Exception ex){<br />
   System.out.println(ex.toString());<br />
  }<br />
 }<br />
  public void strartMyThread() throws Exception{<br />
   this.url =new URL(&#8220;<a href="http://www.google.com/">http://www.google.com</a>&#8220;);<br />
         java.lang.Runnable runner=new Runnable(){<br />
          public void run(){<br />
           try {<br />
            conn = (HttpURLConnection) url.openConnection();<br />
           } catch (IOException e) {<br />
            e.printStackTrace();<br />
            url = null;<br />
           }<br />
          }</p>
<p>         };<br />
         Thread openConn=new Thread(runner);<br />
         openConn.start();<br />
         openConn.join(10000);// wait 10 seconds</p>
<p>   if (conn != null) {<br />
    System.out.println(&#8220;连接网络成功&#8230;&#8221;);<br />
    BufferedReader r = new BufferedReader(new InputStreamReader(conn<br />
      .getInputStream()));<br />
    String s = r.readLine();<br />
    while (s != null) {<br />
     System.out.println(s);<br />
     s = r.readLine();<br />
    }<br />
   } else {<br />
    System.out.println(&#8220;超时错误,连接网络失败&#8230;&#8221;);<br />
   }</p>
<p>  }<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oipop.com/archives/52/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>J2ME手机屏幕切换</title>
		<link>http://blog.oipop.com/archives/48</link>
		<comments>http://blog.oipop.com/archives/48#comments</comments>
		<pubDate>Sat, 01 Aug 2009 01:51:36 +0000</pubDate>
		<dc:creator>Kinsta</dc:creator>
				<category><![CDATA[JAVA开发]]></category>
		<category><![CDATA[J2ME]]></category>
		<category><![CDATA[手机编程]]></category>

		<guid isPermaLink="false">http://blog.oipop.com/?p=48</guid>
		<description><![CDATA[在编写手机程序时，经常要进行各个屏幕间的切换
功能：在主程序中有多个按钮，每一个按钮对应一个功能，每一个功能要不同的屏幕(元素)表现出来。 实现： 一、主程序中必然定义了一个display对像，如private Display display,它表示当前的屏幕。还有一些Displayable对像。如form，textfield等都是displayable的子类。在主程序中通过dipslay.sercurrent(displayable实例名); 即可将当displayable实例加入当前的屏幕。以下程序：
private Display display=Display.getDisplay(this); 
private Form form = new Form(“New Form“); 
public void startapp() 
{ 
display.setcurrent(form); 
}
作用是将form添加到当前的屏幕当中。
二、要想进行屏幕间的切换，只要将你想显示的东东放到到主程序的display对象中即可。主程序中定义了一个display，则要在另一个屏幕(我姑且把它称之为目标屏幕)中引用到主程序的display。

用以下代码说明：
mainmidlet.java：主程序，一个标准的midlet。
import javax.microedition.midlet.midlet; 
import javax.microedition.lcdui.*;
public class mainmidlet extends midlet implements commandlistener {
private display display; 
private form form = new form(&#8220;wellcome!!&#8221;); 
private command okcommand = new command(&#8220;ok&#8221;,command.ok,1);
//选择ok,换到下一个屏幕 
private form ns ; 
private stringitem si = new stringitem(&#8220;first screen&#8221;,&#8221;~_~&#8221;); 
public mainmidlet() 
{ 
    form.addcommand(okcommand); 
    form.append(si); 
} 
public void startapp() { 
    display = display.getdisplay(this);
    [...]]]></description>
			<content:encoded><![CDATA[<p>在编写手机程序时，经常要进行各个屏幕间的切换<br />
功能：在主程序中有多个按钮，每一个按钮对应一个功能，每一个功能要不同的屏幕(元素)表现出来。 实现： 一、主程序中必然定义了一个display对像，如private Display display,它表示当前的屏幕。还有一些Displayable对像。如form，textfield等都是displayable的子类。在主程序中通过dipslay.sercurrent(displayable实例名); 即可将当displayable实例加入当前的屏幕。以下程序：<br />
private Display display=Display.getDisplay(this); <br />
private Form form = new Form(“New Form“); <br />
public void startapp() <br />
{ <br />
display.setcurrent(form); <br />
}<br />
作用是将form添加到当前的屏幕当中。<br />
二、要想进行屏幕间的切换，只要将你想显示的东东放到到主程序的display对象中即可。主程序中定义了一个display，则要在另一个屏幕(我姑且把它称之为目标屏幕)中引用到主程序的display。<br />
<span id="more-48"></span><br />
用以下代码说明：<br />
mainmidlet.java：主程序，一个标准的midlet。<br />
import javax.microedition.midlet.midlet; <br />
import javax.microedition.lcdui.*;</p>
<p>public class mainmidlet extends midlet implements commandlistener {</p>
<p>private display display; <br />
private form form = new form(&#8220;wellcome!!&#8221;); <br />
private command okcommand = new command(&#8220;ok&#8221;,command.ok,1);<br />
//选择ok,换到下一个屏幕 <br />
private form ns ; <br />
private stringitem si = new stringitem(&#8220;first screen&#8221;,&#8221;~_~&#8221;); <br />
public mainmidlet() <br />
{ <br />
    form.addcommand(okcommand); <br />
    form.append(si); <br />
} <br />
public void startapp() { <br />
    display = display.getdisplay(this);</p>
<p>    display.setcurrent(form); <br />
    form.setcommandlistener(this);//对form加入commandlistener</p>
<p>} <br />
public void pauseapp() {</p>
<p>} <br />
public void destroyapp(boolean b){</p>
<p>} <br />
public void commandaction(command c,displayable s) <br />
{ <br />
    if(c==okcommand) <br />
    { <br />
        ns = new nextscreen(display,form);//最关键的地方在这里：form：将父屏幕对象传下去，方便后退时返回父屏幕) <br />
        display.setcurrent(ns); <br />
    }</p>
<p>}</p>
<p>} <br />
在这个midlet中，定义了一个display对像display。 以及一个两个displayable对象form form及stringitem si。运行后显示在屏幕当中。 还有个一command okcommand，其作用是触发下一个屏幕。 在public void commandlistener中可以看到，当当前按下的按钮是okcommand时，初始化一个nextscreen对象 ns = new nextscreen(display,form); 将display和form传入，作用就是进行屏幕的切换。 下面是nextscreen的实现： nextscreen.java 第二个屏幕的代码<br />
import javax.microedition.lcdui.*; <br />
public class nextscreen extends form implements commandlistener {</p>
<p>private display display; <br />
private displayable parent; <br />
private command backcommand = new command(&#8220;back&#8221;,command.back,1); <br />
private stringitem si = new stringitem(&#8220;secondscrean&#8221;,&#8221;~_~&#8221;); <br />
public nextscreen(display d,displayable p) <br />
{ <br />
    super(&#8220;nextscreen&#8221;); <br />
    display = d; <br />
    parent = p; <br />
    append(si); <br />
    addcommand(backcommand); <br />
    setcommandlistener(this);</p>
<p>} <br />
public void commandaction(command c,displayable s) <br />
{ <br />
//返回上一个屏幕 <br />
    if(c==backcommand) <br />
    { <br />
    display.setcurrent(parent); <br />
    } <br />
}</p>
<p>} <br />
它继承自form类。 在nextscreen中又定义了一个display display，将用它来标识当前的元素显示在哪一个屏幕中。 一个form form，一个stringitem si。这是当前屏幕中要显示的东东：) 构造函数中的super(&#8220;secondscreen&#8221;);的作用是使得nextscreen可以直接调中其父类form中的函数。 backcommand的作用是返回上一个屏幕。 将form，si及backcommand加入nextscreen中，一个nextscreen的实例就完成了。在主程序(mainmidlet)中，就是ns。<br />
接下来，最关键的地方，就是在mainmidlet中的这一句：display.setcurrent(ns); 就是把ns在当前的屏幕中显示出来!这样就可以看到nextscreen中定义的各个元素(form,si)了!<br />
然后想返回原屏幕，怎么办呢？这时nextscreen中的backcommand就起作用了。 仔细看这两句： 在mainmidlet.java中： ns = new nextscreen(display,form); 它将form也传了进去。它有什么用呢？ 在nextscreen的构造函数中： dispaly =d; 这一句其实等于：nextscreen.display = mainmidlet.display; 这样，nextscreen就得到了当前的屏幕，它就随意的在上面放东东了。 parent = p; 这一句其实等于：nextscreen.parent = mainmidlet.form; 从字面意思不难理解，原来是把主程序的form当成parent(父母)，这样就得到当前屏幕的前一个屏幕中所显示的内容!! 然后在commandaction中，如果backcommand按下了，则执行display.sercurrent(parent);这样，又把原来的屏幕给show出来了：)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oipop.com/archives/48/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>J2ME获取IMEI手机串号</title>
		<link>http://blog.oipop.com/archives/45</link>
		<comments>http://blog.oipop.com/archives/45#comments</comments>
		<pubDate>Wed, 29 Jul 2009 05:59:46 +0000</pubDate>
		<dc:creator>Kinsta</dc:creator>
				<category><![CDATA[杂七杂八]]></category>
		<category><![CDATA[J2ME]]></category>
		<category><![CDATA[JAVA开发]]></category>
		<category><![CDATA[手机编程]]></category>

		<guid isPermaLink="false">http://blog.oipop.com/?p=45</guid>
		<description><![CDATA[1、MOTO系列的手机可以通过读取系统的IMEI属性获得：
String imei = System.getProperty(&#8220;IMEI&#8221;);
或String imei = System.getProperty(&#8220;phone.IMEI&#8221;);
　　
2、SIEMENS系列的手机可以通过读取系统的com.siemens.IMEI属性获得：
String imei = System.getProperty(&#8220;com.siemens.IMEI&#8221;);
3、NOKIA系列的手机可以通过读取系统的com.nokia.mid.imei属性获得：
String imei = System.getProperty(&#8220;com.nokia.mid.imei&#8221;);
4、SE 系列的手机可以通过读取系统的com.sonyericsson.imei属性获得：
String imei = System.getProperty(&#8220;com.sonyericsson.imei&#8221;);
注：索爱的部分手机需要IMEI大写。
]]></description>
			<content:encoded><![CDATA[<p>1、MOTO系列的手机可以通过读取系统的IMEI属性获得：<br />
String imei = System.getProperty(&#8220;IMEI&#8221;);<br />
或String imei = System.getProperty(&#8220;phone.IMEI&#8221;);<br />
　　<br />
2、SIEMENS系列的手机可以通过读取系统的com.siemens.IMEI属性获得：<br />
String imei = System.getProperty(&#8220;com.siemens.IMEI&#8221;);</p>
<p>3、NOKIA系列的手机可以通过读取系统的com.nokia.mid.imei属性获得：<br />
String imei = System.getProperty(&#8220;com.nokia.mid.imei&#8221;);</p>
<p>4、SE 系列的手机可以通过读取系统的com.sonyericsson.imei属性获得：<br />
String imei = System.getProperty(&#8220;com.sonyericsson.imei&#8221;);<br />
注：索爱的部分手机需要IMEI大写。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oipop.com/archives/45/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>深入理解Canvas类的使用(一)</title>
		<link>http://blog.oipop.com/archives/41</link>
		<comments>http://blog.oipop.com/archives/41#comments</comments>
		<pubDate>Mon, 27 Jul 2009 01:52:14 +0000</pubDate>
		<dc:creator>Kinsta</dc:creator>
				<category><![CDATA[JAVA开发]]></category>
		<category><![CDATA[J2ME]]></category>
		<category><![CDATA[手机编程]]></category>

		<guid isPermaLink="false">http://blog.oipop.com/?p=41</guid>
		<description><![CDATA[       在J2ME游戏编程中，Canvas类是最常用的类之一，该类提供了获得手机屏幕属性、绘制界面以及事件处理等很多实用的功能，下面就系统的介绍一下该类的使用，并结合实际说明一下在实际的使用过程中需要注意的一些问题。
       Canvas类是Displayable的子类，主要用来需要处理低级事件，例如键盘按键事件等，以及需要绘制屏幕的程序。在实际的使用过程，一般都通过继承Canvas来利用该类提供的功能。Canvas类是一个抽象类，继承该类的时候必须覆盖paint方法。

       Canvas类的功能主要包含以下几类：
1、  获得手机屏幕属性
l         getHeight——获得屏幕可用高度
l         getWidth——获得屏幕宽度
l         isDoubleBuffered——是否支持双缓冲
l         hasPointerEvents——是否支持指针设备
l         hasPointerMotionEvents——是否支持指针动作，例如拖拉事件
l         hasRepeatEvents——是否支持重复按键
实际开发过程中，可以在程序中直接调用这些方法，通过返回值获得相应的属性信息。
2、  绘制方法
l         paint——绘制方法
l         repaint——重新绘制方法
paint方法需要在界面类中覆盖，然后就可以书写功能，而再需要重新绘制的时候手动调用repaint方法。
3、  事件处理
低级用户界面的事件处理分为两种：按键事件和指针事件(处理触摸屏手机的低级事件)。
支持按键事件的方法主要有三个：
l         keyPressed——按键按下的事件
l         keyReleased——按键释放的事件
l         keyRepeated——重复按键的事件
支持指针事件的方法也有三个：
l         pointerPressed——指针设备按下事件
l         pointerReleased——指针设备释放事件
l         pointerDragged——指针设备拖拉事件
在实际的编程中，只需要在界面类中覆盖这些方法，然后在方法的内部书写代码即可，在发生这些事件的时候，系统会自动调用这些方法。
 
 
4、  其他方法
l         getGameAction——将按键映射成游戏动作
l         getKeyCode——将游戏动作转换为键值
l         getKeyName——将键值转换为按键名称
l         hideNotify——在Canvas界面被隐藏的时候系统自动调用该方法
l         showNotify——当Canvas界面显示的时候系统自动调用该方法
l         serviceRepaints——强制系统重新绘制
以上方法除了hideNotify、showNotify需要在子类中覆盖，系统会自动调用以外，其他的方法都可以直接调用。
5、  系统的熟悉主要分为两个部分：
l         按键的键值
KEY_NUM0、KEY_NUM1、KEY_NUM2、KEY_NUM3、KEY_NUM4、KEY_NUM5、KEY_NUM6、KEY_NUM7、KEY_NUM8、KEY_NUM9分别对应手机键盘的0-9数字键，KEY_STAR对应*号键，KEY_POUND对应#号键。各个功能键的键值在Canvas类没有进行定义，所以各个厂商，甚至厂商的不同型号手机之间，的键值都有所不同。但是功能键的键值均小于0。
 
 
l         游戏动作
UP、DOWN、LEFT、RIGHT和FIRE，分别对应上、下、左、右和确定键，在实际的手机中一般分别对应2、8、4、6和5键以及功能键中的方向键。GAME_A、GAME_B、GAME_C、GAME_D分别对应游戏中的A、B、C和D键，分别映射成手机上的1、3、7、9键，或者是7、9、*和#键。
在实际的事件处理中，使用游戏可以达到在不同的手机之间通用。
 
 
              在MIDP2.0中，又新增了两个方法，分别是：
l         setFullScreenMode——控制屏幕是全屏幕显示还是一般模式显示
l         sizeChanged——当屏幕尺寸变化的时候，系统会自动调用该方法。
上面系统的介绍了Canvas类提供的功能，下面就介绍一下它的使用。当调用Display对象的setCurrent方法显示Canvas界面时，系统首先调用Canvas对象的构造方法，然后调用paint方法实现绘制，这样我们就可以看到实际的界面了。而以后，当界面坐标发生变化以后，必须手动调用repaint方法实现绘制。
以下是一些在实际的编程过程中，需要注意的一些问题：
l         坐标参数化或者根据屏幕的宽度和高度生成坐标，从而提高界面的移植性。
l         在程序运行过程中，paint方法经常被反复调用，所以一般在该方法中只放置绘制的代码，而把逻辑处理的代码放在别的位置。
l         在进行低级事件处理代码编写中，对于游戏按键，尽量使用游戏动作进行编程，其他按键才直接使用键值，从而提高事件处理代码的移植性。
l         因为hideNotify和showNotify方法会在界面隐藏和重新显示时，被系统自动调用，所以可以覆盖这两个方法，在其中实现暂停的逻辑。
l         尽量使用双缓冲技术，避免屏幕的闪烁，除非手机不支持双缓冲。
l         显示其他界面的时候，注意要关闭线程，并释放资源。
]]></description>
			<content:encoded><![CDATA[<p>       在J2ME游戏编程中，Canvas类是最常用的类之一，该类提供了获得手机屏幕属性、绘制界面以及事件处理等很多实用的功能，下面就系统的介绍一下该类的使用，并结合实际说明一下在实际的使用过程中需要注意的一些问题。</p>
<p>       Canvas类是Displayable的子类，主要用来需要处理低级事件，例如键盘按键事件等，以及需要绘制屏幕的程序。在实际的使用过程，一般都通过继承Canvas来利用该类提供的功能。Canvas类是一个抽象类，继承该类的时候必须覆盖paint方法。</p>
<p><span id="more-41"></span></p>
<p>       Canvas类的功能主要包含以下几类：</p>
<p>1、  获得手机屏幕属性</p>
<p>l         getHeight——获得屏幕可用高度</p>
<p>l         getWidth——获得屏幕宽度</p>
<p>l         isDoubleBuffered——是否支持双缓冲</p>
<p>l         hasPointerEvents——是否支持指针设备</p>
<p>l         hasPointerMotionEvents——是否支持指针动作，例如拖拉事件</p>
<p>l         hasRepeatEvents——是否支持重复按键</p>
<p>实际开发过程中，可以在程序中直接调用这些方法，通过返回值获得相应的属性信息。</p>
<p>2、  绘制方法</p>
<p>l         paint——绘制方法</p>
<p>l         repaint——重新绘制方法</p>
<p>paint方法需要在界面类中覆盖，然后就可以书写功能，而再需要重新绘制的时候手动调用repaint方法。</p>
<p>3、  事件处理</p>
<p>低级用户界面的事件处理分为两种：按键事件和指针事件(处理触摸屏手机的低级事件)。</p>
<p>支持按键事件的方法主要有三个：</p>
<p>l         keyPressed——按键按下的事件</p>
<p>l         keyReleased——按键释放的事件</p>
<p>l         keyRepeated——重复按键的事件</p>
<p>支持指针事件的方法也有三个：</p>
<p>l         pointerPressed——指针设备按下事件</p>
<p>l         pointerReleased——指针设备释放事件</p>
<p>l         pointerDragged——指针设备拖拉事件</p>
<p>在实际的编程中，只需要在界面类中覆盖这些方法，然后在方法的内部书写代码即可，在发生这些事件的时候，系统会自动调用这些方法。</p>
<p> </p>
<p> </p>
<p>4、  其他方法</p>
<p>l         getGameAction——将按键映射成游戏动作</p>
<p>l         getKeyCode——将游戏动作转换为键值</p>
<p>l         getKeyName——将键值转换为按键名称</p>
<p>l         hideNotify——在Canvas界面被隐藏的时候系统自动调用该方法</p>
<p>l         showNotify——当Canvas界面显示的时候系统自动调用该方法</p>
<p>l         serviceRepaints——强制系统重新绘制</p>
<p>以上方法除了hideNotify、showNotify需要在子类中覆盖，系统会自动调用以外，其他的方法都可以直接调用。</p>
<p>5、  系统的熟悉主要分为两个部分：</p>
<p>l         按键的键值</p>
<p>KEY_NUM0、KEY_NUM1、KEY_NUM2、KEY_NUM3、KEY_NUM4、KEY_NUM5、KEY_NUM6、KEY_NUM7、KEY_NUM8、KEY_NUM9分别对应手机键盘的0-9数字键，KEY_STAR对应*号键，KEY_POUND对应#号键。各个功能键的键值在Canvas类没有进行定义，所以各个厂商，甚至厂商的不同型号手机之间，的键值都有所不同。但是功能键的键值均小于0。</p>
<p> </p>
<p> </p>
<p>l         游戏动作</p>
<p>UP、DOWN、LEFT、RIGHT和FIRE，分别对应上、下、左、右和确定键，在实际的手机中一般分别对应2、8、4、6和5键以及功能键中的方向键。GAME_A、GAME_B、GAME_C、GAME_D分别对应游戏中的A、B、C和D键，分别映射成手机上的1、3、7、9键，或者是7、9、*和#键。</p>
<p>在实际的事件处理中，使用游戏可以达到在不同的手机之间通用。</p>
<p> </p>
<p> </p>
<p>              在MIDP2.0中，又新增了两个方法，分别是：</p>
<p>l         setFullScreenMode——控制屏幕是全屏幕显示还是一般模式显示</p>
<p>l         sizeChanged——当屏幕尺寸变化的时候，系统会自动调用该方法。</p>
<p>上面系统的介绍了Canvas类提供的功能，下面就介绍一下它的使用。当调用Display对象的setCurrent方法显示Canvas界面时，系统首先调用Canvas对象的构造方法，然后调用paint方法实现绘制，这样我们就可以看到实际的界面了。而以后，当界面坐标发生变化以后，必须手动调用repaint方法实现绘制。</p>
<p>以下是一些在实际的编程过程中，需要注意的一些问题：</p>
<p>l         坐标参数化或者根据屏幕的宽度和高度生成坐标，从而提高界面的移植性。</p>
<p>l         在程序运行过程中，paint方法经常被反复调用，所以一般在该方法中只放置绘制的代码，而把逻辑处理的代码放在别的位置。</p>
<p>l         在进行低级事件处理代码编写中，对于游戏按键，尽量使用游戏动作进行编程，其他按键才直接使用键值，从而提高事件处理代码的移植性。</p>
<p>l         因为hideNotify和showNotify方法会在界面隐藏和重新显示时，被系统自动调用，所以可以覆盖这两个方法，在其中实现暂停的逻辑。</p>
<p>l         尽量使用双缓冲技术，避免屏幕的闪烁，除非手机不支持双缓冲。</p>
<p>l         显示其他界面的时候，注意要关闭线程，并释放资源。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oipop.com/archives/41/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
