RemoteViews类描述了一个View对象能够显示在其他进程中,可以融合从一个 layout资源文件实现布局。虽然该类在android.widget.RemoteViews而不是appWidget下面但在Android Widgets开发中会经常用到它,主要是可以跨进程调用(appWidget由一个服务宿主来统一运行的)。 如何实例化一个RemoteViews 构造方法 RemoteViews(String packageName, int layoutId) 创建一个新的RemoteViews 对象将显示 views包含指定一个layout资源. RemoteViews(Parcel parcel) 读取RemoteViews对象从一个parcel中. 首先给大家一段例子简单说明下构造和如何使用 RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider); views.setTextViewText(R.id.appwidget_text, "Android开发网欢迎您"); appWidgetManager.updateAppWidget(appWidgetId, views); 详细的 该类的公共方法列表,下面的viewId为layout文件中的id定义,常用的方法已经翻译成中文描述。 Public Methods View apply(Context context, ViewGroup parent) Inflates the view hierarchy represented by this object and applies all of the actions. int […]
Android
Android Widget开发实例-电量监控 Android开发技术
一个简单的电量监控代码可以很好的演示Android平台下Widget开发中的基础方式,比如appWidget如何于Service交互以及RemoteViews的演示。完成的工程代码我们稍作美化后提供下载,同时下次开始我们提供一些国外比较优秀的开源工程实例做剖析,从2007年11月至今SDK发布已经近两年了,相信大家可以看到整个Google Android平台的开发还是十分简单的,难度等级和J2ME相似,相信入门的网友只要经常光顾Android123开发站点一定会很好掌握的。 import android.app.Service;import android.appwidget.AppWidgetManager;import android.appwidget.AppWidgetProvider;import android.content.BroadcastReceiver;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.IBinder;import android.widget.RemoteViews; public class BatteryMonitorWidget extends AppWidgetProvider{ public void onUpdate( Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds ) { context.startService(new Intent(context, BatteryMonitorReceiver.class)); } public static class BatteryMonitorReceiver extends Service { private int currentBatteryLevel = 0; private BroadcastReceiver batteryReceiver = new BroadcastReceiver() { […]
剖析Android自带Widget – Clock指针钟表 Android开发技术
我们都知道Android操作系统自带了几个Widget组件,比如带指针的钟表,一般在Home Screen上的那个表盘,它在哪里呢? 我们其实在alarmclock这个包中可以看到,下面就来一起分析一下实现的方法。其实有关内部的更新在AnalogClock类已经完成了,这里仅仅分析Widgets部分。 首先看下alarmclock中有关widgets的AndroidManifest.xml描述内容如下: <receiver android:name="AnalogAppWidgetProvider" android:label="@string/analog_gadget-android123"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/analog_appwidget" /> </receiver> xml/analog_appwidget.xml的内容如下 <?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="146dip" //widget最小宽度 android:minHeight="146dip" //widget最小高度 android:updatePeriodMillis="0" //更新频率,单位为毫秒 android:initialLayout="@layout/analog_appwidget" > </appwidget-provider> layout/analog_appwidget.xml的内容如下 <AnalogClock xmlns:android="http://schemas.android.com/apk/res/android" android:dial="@drawable/appwidget_clock_dial" //表盘背景图片 android:hand_hour="@drawable/appwidget_clock_hour" //时针图片 android:hand_minute="@drawable/appwidget_clock_minute" //分针图片 android:layout_width="fill_parent" android:layout_height="fill_parent" /> 最后我们看下androidmanifest.xml中的receiver是如何触发的,AnalogAppWidgetProvider.java的内容如下 public class AnalogAppWidgetProvider extends BroadcastReceiver { public void […]
剖析Android自带Widget – Music播放器 Android开发技术
昨天的带指针时钟比较简单,今天我们继续android自带widget剖析,相对于alarmclock而言music程序稍微复杂些,主要是涉及到众多事件的处理,不过可以看出如何是和服务进行交互的。继续按照昨天的分析步骤和过程,首先我们看下music程序中AndroidManifest.xml中有关widgets的定义。 <receiver android:name="MediaAppWidgetProvider"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_info" /></receiver> 下面是xml/appwidget_info的内容,里面包含了这个widget程序的基本定义。 <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="294dip" //最小宽度 android:minHeight="72dip" //最小高度 android:updatePeriodMillis="0" //更新频率 android:initialLayout="@layout/album_appwidget"> //widget界面布局文件</appwidget-provider> 整个设计还是十分清晰,这里我们就不再做过多的赘述。 public class MediaAppWidgetProvider extends AppWidgetProvider { public static final String CMDAPPWIDGETUPDATE = "appwidgetupdate"; static final ComponentName THIS_APPWIDGET = new ComponentName("com.android.music", "com.android.music.MediaAppWidgetProvider"); private static […]
ApiDemos中的Android Widget例子解析 Android开发技术
今天继续我们的Android Widget开发之旅,看看Android SDK中ApiDemos上的Widget例子,下面的代码分为3个文件可以清楚的看到整个框架,主要是AppWidgetProvider类中的onUpdate、onDeleted、 onEnabled、onDisabled和updateAppWidget方法之间的状态改变,使用Logcat仔细分析一个widget的生命周期。 package com.example.android.apis.appwidget; import android.appwidget.AppWidgetManager;import android.appwidget.AppWidgetProvider;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager;import android.os.SystemClock;import android.util.Log;import android.widget.RemoteViews; import java.util.ArrayList;import com.example.android.apis.R; 涉及到的文件有 ExampleAppWidgetConfigure.javaExampleBroadcastReceiver.javares/layout/appwidget_configure.xmlres/layout/appwidget_provider.xmlres/xml/appwidget_provider.xml public class ExampleAppWidgetProvider extends AppWidgetProvider { private static final String TAG = "ExampleAppWidgetProvider"; //logcat调试信息 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { Log.d(TAG, "onUpdate"); // – 创建一个RemoteViews 对象 // – […]

Android导出一个JAR库 Android开发技术
很早以前,我们说过如何导入一个JAR库,的方法可以参考 Android使用第三方外部JAR库文件 一文。那么如果将自己的代码封装成一个jar库供其他程序复用呢? 首先创建一个Android工程,确定可以编译通过,移除androidmanifest.xml文件,和相关的程序资源图片,比如res/drawable/icon.png。在Eclipse中我们找到Package Explorer,选择export,如图: 接下来在导出对话框中选择Java,JAR file,如下图所示: 在JAR File Specification这里选择我们需要到处的资源等等,在JAR file:路径选择我们导出后文件的存放位置,在下面的Compress the contents of the JAR file勾选可以压缩生成文件的体积。最后单击Next或Finish即可完成导出,这样可以在以后的工程中导入这个库,起到了代码复用的效果类似Windows 32开发的Dll文件一样。
Android过后Chrome OS又是如何开发? Android开发技术
很多网友不知道对于目前Android SDK是否满意,但是如果Google操作系统 Chrome OS 真的上市后留给第三方开发人员的又是什么呢? Dalvik运行在PC Linux绝对是不太可能的,Linux PC平台的运算能力还是很强的,甚至是未来的Server考虑,可能又回到了Linux卡发难的老路。除非Google推出自己的OS API,类似Win32 API那样在应用层面上有一个统一。 Chrome OS最终运行Sun Java这样的方式开发出来的程序和Windows相比优势不是很明显,至少我们仍然看到Dot Net这样的东西仅仅适合数据库和Web应用,在桌面应用上的效率和稳定性十分低,反倒P/Invoke增加了开发难度以及运行效率。如果Linux平台上还是用GCC那样的去写最终仍然还是拍拖不了OOP这样的设计方式,可以想象没有Visual Studio这样稳定的IDE后,Eclipse也仅仅是Java或Ruby、Python这样的玩具脚本,比过去的Sun Applet先进不到哪里? 值得我们考虑的是Chrome OS和Android不同,会不会有一个Win32 API和DDK提供给大家。

Simple让BASIC语言编写Android程序 Android开发技术
比较有意思的是Google发布了BASIC语言编译针对Android平台的开发工具-Simple (Simple Compiler And Runtime),如果用户有VB基础的话相信使用Basic(Beginner’s All-purpose Symbolic Instruction Code)可以很好的编写一些简单的逻辑类程序。虽然Android主要使用Java来开发,但是虽然NDK的发布兼容C/C++目前Simple将帮助它支持Basic可以说基本上“全”了。下面我们给出一个简单的Simple编译器例子,看看下图Test.Initialize中的变量声明方式,Dim xxx As type是不是很熟悉,的确这是Basic。 本地下载Simple编译器源代码 http://down.android123.com/simple.zip
安装MOTODEV Studio for Android版方法 Android开发技术
安装MOTODEV Studio 来自摩托罗拉的Android开发IDE已经提供了下载,相关的安装方法如何呢? 下面是发布文档中有关Mac和Windows x86桌面系统的安装说明 。MOTODEV Studio for Android installation process depends upon your underlying operating system. Once you have installed MOTODEV Studio, the process of installing or configuring the Android SDK (documented under "Installing the Android SDK”) is the same regardless of your operating system. Microsoft Windows If you already have a previous version […]

Android蓝牙API之BluetoothAdapter类(2) Android开发技术
从Android 2.0开始提供最全面的蓝牙开发接口,API Level为5的系统才能调用,目前Android Bluetooth API包含了主要以下几类:BluetoothAdapter BluetoothDevice、BluetoothSocket 、BluetoothServerSocket 和BluetoothClass 它们均在android.bluetooth这个包中出现。 我们调用时除了需要考虑API Level至少为5外,还需注意添加相应的权限,比如使用通讯需要在androidmanifest.xml加入<uses-permission android:name="android.permission.BLUETOOTH" />,而开关蓝牙需要android.permission.BLUETOOTH_ADMIN权限。 三、建立通讯 establishing 对于建立一个蓝牙通讯,必须经过以下四个步骤:获取本地蓝牙设备、查找远程设备、配对(已配对设备将会忽略这步的细节)、连接设备和传输数据. 在Android平台中首先我们需要查找本地活动的蓝牙适配器,通过BluetoothAdapter类的getDefaultAdapter() 方法获得一个系统默认可用的蓝牙设备,示例代码如下 BluetoothAdapter cwjBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (cwjBluetoothAdapter == null) { // Android开发网提示大家本机没有找到蓝牙硬件或驱动存在问题 } 当然有了这步仍然不能建立连接,因为我们还不知道手机中的蓝牙功能是否被开启,可以通过cwjBluetoothAdapter的.isEnabled方法来判断,如果没有开启,我们可以通过下面的代码提醒用户启用: if (!cwjBluetoothAdapter.isEnabled()) { Intent TurnOnBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(TurnOnBtIntent, REQUEST_ENABLE_BT);}这时用户会收到类似下面的窗口: 我们通过startActivityForResult()方法发起的Intent将会在onActivityResult()回调方法中获取用户的选择,比如用户单击了Yes开启,那么将会收到RESULT_OK 的结果,如果RESULT_CANCELED则代表用户不愿意开启蓝牙,当然android123提醒大家还可以通过其他方式来开启,比如说用BluetoothDevice获取蓝牙服务接口对象,是用enable()方法来开启,无需询问用户,这时就需要用到android.permission.BLUETOOTH_ADMIN权限。 如何判断系统蓝牙的状态呢? 建立BroadcastReceiver对象,接收ACTION_STATE_CHANGED动作,在EXTRA_STATE和EXTRA_PREVIOUS_STATE包含了现在状态和过去的状态,最终的结果定义是STATE_TURNING_ON正在开启, STATE_ON已经开启, STATE_TURNING_OFF正在关闭和 STATE_OFF已经关闭,如果有什么不明白的可以在我们的论坛中交流。 […]

Android蓝牙API之BluetoothAdapter类(1) Android开发技术
使用BluetoothAdapter类,你能够在Android设备上查找周边的蓝牙设备然后配对(绑定),蓝牙通讯是基于唯一地址MAC来相互传输的,考虑到安全问题Bluetooth通讯时需要先配对。然后开始相互连接,连接后设备将会共享同一个RFCOMM通道以便相互传输数据,目前这些实现在Android 2.0或更高版本SDK上实现。 一、查找发现 findding/discovering devices 对于Android查找发现蓝牙设备使用BluetoothAdapter类的startDiscovery()方法就可以执行一个异步方式获取周边的蓝牙设备,因为是一个异步的方法所以我们不需要考虑线程被阻塞问题,整个过程大约需要12秒时间,这时我们紧接着注册一个BroadcastReceiver 对象来接收查找到的蓝牙设备信息,我们过滤ACTION_FOUND这个 Intent动作来获取每个远程设备的详细信息,通过附加参数在Intent字段EXTRA_DEVICE 和 EXTRA_CLASS, 中包含了每个BluetoothDevice 对象和对象的该设备类型 BluetoothClass ,示例代码 private final BroadcastReceiver cwjReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); myArrayAdapter.add(device.getName() + " android123 " + device.getAddress()); //获取设备名称和mac地址 } […]
Android UI开发专题(一) 之界面设计 Android开发技术
近期很多网友对Android用户界面的设计表示很感兴趣,对于Android UI开发自绘控件和游戏制作而言掌握好绘图基础是必不可少的。本次专题分10节来讲述,有关OpenGL ES相关的可能将放到以后再透露。本次主要涉及以下四个包的相关内容: android.content.res 资源类 android.graphics 底层图形类 android.view 显示类 android.widget 控件类 一、android.content.res.Resources 对于Android平台的资源类android.content.res.Resources可能很多网友比较陌生,一起来看看SDK上是怎么介绍的吧,Contains classes for accessing application resources, such as raw asset files, colors, drawables, media or other other files in the package, plus important device configuration details (orientation, input types, etc.) that affect how the application may behave.平时用到的二进制源文件raw、颜色colors、图形drawables和多媒体文件media的相关资源均通过该类来管理。 int […]
Android蓝牙API之BluetoothSocket类 Android开发技术
前面两篇文章中我们提到了有关Android平台蓝牙的配对、发现、启用等操作,本文开始通过BluetoothSocket类建立有关蓝牙通讯的套接字。从Android 2.0开始支持这一特性,蓝牙和LAN一样通过MAC地址来识别远程设备,建立完通讯连接RFCOMM通道后以输入、输出流方式通讯。 一、连接设备 蓝牙通讯分为server服务器端和client客户端,它们之间使用BluetoothSocket 类的不同方法来获取数据, 1. 作为服务器 如果一个设备需要和两个或多个设备连接时,就需要作为一个server来传输,在android中提供了BluetoothServerSocket类来处理用户发来的信息,服务器端套接字在接受(accepted) 一个客户发来的BluetoothSocket时作出相应的响应。示例代码如下: private class AcceptThread extends Thread { private final BluetoothServerSocket cwjServerSocket; public AcceptThread() { BluetoothServerSocket tmp = null; //使用一个临时对象代替,因为cwjServerSocket定义为final try { tmp = myAdapter.listenUsingRfcommWithServiceRecord(NAME, CWJ_UUID); //服务仅监听 } catch (IOException e) { } cwjServerSocket = tmp; } […]
Android蓝牙API之BluetoothSocket类(2) Android开发技术
通过前几次的讲解,很多网友相信对Android蓝牙相关开发可以很好的掌握了,通过BluetoothServerSocket可以方便的创建一个蓝牙服务器,使用BluetoothSocket类可以很好的处理连接,今天我们继续上次的内容说下Android下如何管理蓝牙套接字的连接,今天仍然使用BluetoothSocket类,处理具体的数据流。 在Java上处理数据流很简单,提供了InputSream、OutputSream和字节数组的之间的转化。今天android123将和大家一起说下处理上次遗留的manageConnectedSocket方法的细节,由于蓝牙传输中可能存在中断,所以为了防止阻塞需要开一个工作者线程,相关的示例代码 private class ConnectedThread extends Thread { private final BluetoothSocket cwjSocket; private final InputStream cwjInStream; private final OutputStream cwjOutStream; public ConnectedThread(BluetoothSocket socket) { cwjSocket = socket; InputStream tmpIn = null; //上面定义的为final这是使用temp临时对象 OutputStream tmpOut = null; try { tmpIn = socket.getInputStream(); //使用getInputStream作为一个流处理 tmpOut = socket.getOutputStream(); […]
Android上的Back键事件捕获 Android开发技术
很多网友不明白如何在Android平台上捕获Back键的事件,Back键是手机上的后退键,一般的软件不捕获相关信息可能导致你的程序被切换到后台,而回到桌面的尴尬情况,在Android上有两种方法来获取该按钮的事件。 1.直接获取按钮按下事件,此方法兼容Android 1.0到Android 2.1 也是常规方法,直接重写Activity的onKeyDown方法即可,代码如下: @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { //按下的如果是BACK,同时没有重复 Toast.makeText(android123.this,"Android开发网Back键测试",1).show(); return true; } return super.onKeyDown(keyCode, event);} 而对于Android 2.0开始又多出了一种新的方法,对于Activity 可以单独获取Back键的按下事件,直接重写onBackPressed方法即可,代码如下 @Overridepublic void onBackPressed() {// 这里处理逻辑代码,cwj提示大家注意该方法仅适用于2.0或更新版的sdkreturn;}
Android UI开发专题(一) 之界面设计 Android开发技术
近期很多网友对Android用户界面的设计表示很感兴趣,对于Android UI开发自绘控件和游戏制作而言掌握好绘图基础是必不可少的。本次专题分10节来讲述,有关OpenGL ES相关的可能将放到以后再透露。本次主要涉及以下四个包的相关内容: android.content.res 资源类 android.graphics 底层图形类 android.view 显示类 android.widget 控件类 一、android.content.res.Resources 对于Android平台的资源类android.content.res.Resources可能很多网友比较陌生,一起来看看SDK上是怎么介绍的吧,Contains classes for accessing application resources, such as raw asset files, colors, drawables, media or other other files in the package, plus important device configuration details (orientation, input types, etc.) that affect how the application may behave.平时用到的二进制源文件raw、颜色colors、图形drawables和多媒体文件media的相关资源均通过该类来管理。 int […]
Android UI开发专题(二) 之绘图基础 Android开发技术
今天我们继续介绍Android平台底层绘图类的相关内容,在Android UI开发专题(一) 之界面设计中我们介绍了有关Android平台资源使用以及Bitmap相关类的操作,接下来将会以实例的方式给大家演示各种类的用处以及注意点。今天我们继续了解android.graphics包中比较重要的绘图类。 一、 android.graphics.Matrix 有关图形的变换、缩放等相关操作常用的方法有: void reset() // 重置一个matrix对象。 void set(Matrix src) //复制一个源矩阵,和本类的构造方法 Matrix(Matrix src) 一样 boolean isIdentity() //返回这个矩阵是否定义(已经有意义) void setRotate(float degrees) //指定一个角度以0,0为坐标进行旋转 void setRotate(float degrees, float px, float py) //指定一个角度以px,py为坐标进行旋转 void setScale(float sx, float sy) // 缩放 void setScale(float sx, float sy, float px, float py) //以坐标px,py进行缩放 […]
Android UI开发专题(三) 各种Drawable Android开发技术
本次我们主要讲解Android平台下的各种Drawable,这里在SDK的android.graphics.drawable包下面可以看到有各种Drawable类多达十几种,它们到底之间有什么关系和区别呢? 一、AnimationDrawable 顾名思义该类主要表示动画的图形类,可以实现逐帧播放的效果,下面代码示例如下 1. 定义一个cwj_animation.xml 放到res/drawable 目录下,其中定义的属性duration为延时,单位为毫秒,而oneshot属性表示是否仅播放一次,内容为: <animation-list android:id="selected" android:oneshot="false"><item android:drawable="@drawable/cwj0" android:duration="30" /><item android:drawable="@drawable/cwj1" android:duration="30" /><item android:drawable="@drawable/cwj2" android:duration="30" /><item android:drawable="@drawable/cwj3" android:duration="30" /><item android:drawable="@drawable/cwj4" android:duration="30" /><item android:drawable="@drawable/cwj5" android:duration="30" /></animation-list> 2.在java中调用也很简单 ImageView img = (ImageView)findViewById(R.id.cwj_image); //首先声明一个ImageView对象在xml布局文件中 img.setBackgroundResource(R.drawable.cwj_animation); //我们刚才的animation定义的xml文件 AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground(); //构造AnimationDrawable对象 frameAnimation.start() //开始播放动画 3. AnimationDrawable类还提供了一些常用的方法如下: void stop() 停止 void addFrame(Drawable frame, int duration) 添加一帧,类似xml中的布局 Drawable getFrame(int index) […]
Android UI开发专题(四) View自绘控件 Android开发技术
很多时候想要设计漂亮的Android UI,使用Android自带的控件无法满足我们的需要就要考虑自绘控件,在Android界面显示类View,可以通过继承扩展重写相关方法来实现我们的图形绘制。 首先我们需要了解下View类的底层实现,在SDK中我们可以看到View直接继承于Java的基类Object,实现了图形绘制和按键事件Drawable.Callback KeyEvent.Callback的相关方法,我们自绘时主要实现其内部的onDraw方法,相关的界面计算可以重写onMeasure方法,对于相关的按键可以重载onKeyDown、onKeyUp以及onTouchEvent等,下面android开发网就以一个实例来表示。 public class cwjView extendsView{ public cwjView(Context context) { this(context,null); } public cwjView(Context context,AttributeSet attrs) { this(context,attrs,0); } public cwjView(Context context,AttributeSet attrs,int defStyle) { super(context,attrs,defStyle); //这里是本类的构造,相关初始化可以在这里添加代码 } @Override protectd void onDraw(Canvas canvas) { super(canvas); //绘图的关键,可以看到已经包含了一个canvas句柄,可以直接通过我们前面讲到的Canvas类进行相关的操作,完整的例子,大家可以参考Android SDK中例子Snake贪食蛇游戏的实现。 } } 有关View类的更新,我们直接通过调用invalidate(int l,int r,int r,int b)来更新一个Rect矩形区域,或更新全部,同时在线程中我们使用需要调用postInvalidate来更新界面。
Android UI开发专题(五) Bitmap和Canvas实例 Android开发技术
在Android UI开发专题的前五节我们讲到的东西主要是基础和理论内容,从本次Android123将通过实例代码来演示,本次主要是Bitmap和Canvas类的使用,根据要求缩放Bitmap对象并返回新的Bitmap对象。centerToFit方法一共有4个参数,返回一个Bitmap类型,第一个参数为原始的位图对象,width和height分别为新的宽和高,而Context是用来加载资源的上下文实例。 Bitmap centerToFit(Bitmap bitmap, int width, int height, Context context) { final int bitmapWidth = bitmap.getWidth(); //获取原始bitmap的宽度 final int bitmapHeight = bitmap.getHeight(); if (bitmapWidth < width || bitmapHeight < height) { int color = context.getResources().getColor(R.color.window_background); //从资源读取背景色 Bitmap centered = Bitmap.createBitmap(bitmapWidth < width ? width : bitmapWidth, bitmapHeight < height ? height […]
Android自定义View实例AnalogClock源码 Android开发技术
针对Android底层View的直接构造很多网友没有实战经验,本次Android开发网结合目前平台开源代码一起通过AnalogClock类来理解View的直接继承。AnalogClock就是Home Screen上的那个带有两根指针的表盘类。它的实现我们直接从开源代码可以了解到: public class AnalogClock extends View { private Time mCalendar; private Drawable mHourHand; //时针 private Drawable mMinuteHand; //分针 private Drawable mDial; //表盘背景 private int mDialWidth; //表盘宽度 private int mDialHeight; //表盘高度 private boolean mAttached; //附着状态 private final Handler mHandler = new Handler(); //定一个Handler类实现更新时间 private float mMinutes; private float mHour; private boolean mChanged; […]
AsyncTask解决Android UI堵塞问题 Android开发技术
平时我们在开发Android程序时遇到较耗时任务的处理,如I/O访问的数据库操作、网络访问等情况时造成UI假死等问题,通过AsyncTask可以很好的解决这个问题,就今天以在Android中执行Downloader.downloadFile(url),可能会堵塞整个界面。显然这会影响用户体验,我们如何解决这个问题呢? 方法一、 创建一个新的线程执行我们的任务,使用Thread类,在 run(){}中写入任务代码,比如: new Thread(new Runnable() { public void run() { Downloader.downloadFile(url); } }).start(); 但使用Thread会产生一些意想不到的问题,需要程序员用更多的代码手动的维护它。 方法二: Android SDK为我们提供了一个后台任务的处理工具AsyncTask。AsyncTask就是一个封装过的后台任务类顾名思义就是异步任务,方便我们维护,Android开发网提示这样的好处可以解决一些线程安全问题,AsyncTask直接继承于Object类,位置为android.os.AsyncTask<Params, Progress, Result>。要使用AsyncTask工作我们要提供三个泛型参数,并重载四个方法(至少重载一个)。 三个泛型:Param ,任务执行器需要的数据类型Progress 后台计算中使用的进度单位数据类型Result 后台计算返回结果的数据类型有些参数是可以设置为不使用的,只要传递为Void型即可,比如AsyncTask<Void, Void, Void> 四个步骤:onPreExecute(),执行预处理,它运行于UI线程,可以为后台任务做一些准备工作,比如绘制一个进度条控件。doInBackground(Params…),后台进程执行的具体计算在这里实现,doInBackground(Params…)是AsyncTask的关键,此方法必须重载。在这个方法内可以使用publishProgress(Progress…)改变当前的进度值。onProgressUpdate(Progress…),运行于UI线程。如果在doInBackground(Params…)中使用了publishProgress(Progress…),就会触发这个方法。在这里可以对进度条控件根据进度值做出具体的响应。onPostExecute(Result),运行于UI线程,可以对后台任务的结果做出处理,结果就是doInBackground(Params…)的返回值。此方法也要经常重载,如果Result为null表明后台任务没有完成(被取消或者出现异常)。 AsyncTask实例代码: private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL… urls) { int count = urls.length; long totalSize = 0; […]
Android的SoundPool类使用与利弊 Android开发技术
在开发Android软件中我们可能经常需播放多媒体声音文件,一般使用MediaPlayer类但该类占用资源较多,对于游戏等应用可能不是很适合,这里Android123描述下SoundPool类。SoundPool类在SDK的android.media.SoundPool,顾名思义是声音池的意思。主要播放一些较短的声音片段,可以从程序的资源或文件系统加载,相对于MediaPlayer类可以做到使用较少的CPU资源和较短的反应延迟。 SoundPool和其他声音播放类相比,其特点是可以自行设置声音的品质、音量、播放比率等参等。并且它可以同时管理多个音频流,每个流都有独自的ID,对某个音频流的管理都是通过ID进行的。SoundPool基本使用方法为: 创建一个SoundPool对象:new SoundPool(int maxStreams, int streamType, int srcQuality); 从资源或者文件载入音频流: load(Context context, int resId, int priority); 播放声音play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) import android.media.AudioManager;import android.media.SoundPool; public class android123 extends Activity {private SoundPool snd;private int hitOkSfx; /** Called when the activity is first created. */ @Override public […]
Android标题栏TitleBar全攻略 Android开发技术
很多细心的网友发现Android浏览器的标题栏TitleBar的功能比较多,细心的网友在查看Browser时会发现,从左到右依次为网站图标(favicon)、标题、最右边的动画进度条(圆圈)、背景进度条(和前面的不在一层),今天我们就一起来看看Android标题栏高级实现方法。 在Android Browser程序中标题栏是自绘的,TitleBar类继承于线性布局LinearLayout类,通过LayoutInflater调用layout中的xml布局文件实现相关方法 public class TitleBar extends LinearLayout { private TextView mTitle; //标题文字 private Drawable mCloseDrawable; private ImageView mRtButton; private Drawable mCircularProgress; //圆圈进度指示 private ProgressBar mHorizontalProgress; //水平进度条 private ImageView mFavicon; //网站图标 private ImageView mLockIcon; private Drawable mStopDrawable; //停止状态的图标 private Drawable mBookmarkDrawable; //是一个书签的图标 private boolean mInLoad; private BrowserActivity mBrowserActivity; private Drawable mGenericFavicon; //如果站点没有favicon.ico时显示的默认图标 private […]
Android控件开发之ToggleButton原理 Android开发技术
在Android平台上比较有特色的就是ToggleButton控件,虽然它的功能和CheckBox有些类似,但是他们的用处还是有一定的区别比如ToggleButton原本有图片装饰,通过ToggleButton可以很清楚的显示某些状态。它们均从Button为基类的CompoundButton中实现,其真假事件从Checkable来实现。 public abstract class CompoundButton extends Button implements Checkable { private boolean mChecked; //状态是否选中 private int mButtonResource; private boolean mBroadcasting; private Drawable mButtonDrawable; //按钮的图标 private OnCheckedChangeListener mOnCheckedChangeListener; //选中状态改变监听 private OnCheckedChangeListener mOnCheckedChangeWidgetListener; private static final int[] CHECKED_STATE_SET = { R.attr.state_checked }; public CompoundButton(Context context) { this(context, null); } public CompoundButton(Context context, […]
重绘TextView类演示Android的Handler Android开发技术
今天Android123通过DigitalClock类讲解下Android平台下自绘TextView类,演示下相关的Handler、Runnable线程和Observer观察者类。首先我们回忆下上次 Android自定义View实例AnalogClock源码 一文中的自绘控件,上次主要是重写View类onDraw方法实现自己绘制,本次我们直接从TextView控件来实现自己的数字时钟控件。 1. 将涉及Android平台UI线程的更新原理 Handler、Runnable 2. 对于Content数据存储对象可以使用Observer观察者类来获取SQLite数据库的变化 3. 由于本次没有改变控件的外观显示特性,所以没有重写TextView的onDraw方法,当然TextView也是从View中继承的所以可以直接调用基类的onDraw方法。Android开发网提示目前所有Android控件包android.widget.XXX都是从android.view.View类继承的。 public class DigitalClock extends TextView { Calendar mCalendar; private final static String m12 = "h:mm:ss aa"; private final static String m24 = "k:mm:ss"; private FormatChangeObserver mFormatChangeObserver; private Runnable mTicker; private Handler mHandler; private boolean mTickerStopped = false; String […]
AsyncTask实例代码演示Android异步任务 Android开发技术
上次我们讲到了Android提供了一个较线程更简单的处理多任务的方法AsyncTask异步任务类,相对于线程来说AsyncTask对于简单的任务处理更安全,其内部的实现方法使用了Android的Handler机制,对于常见的文件下载可以使用AsyncTask类来处理,在Browser浏览器中就是用了该类下载Web服务器URL的Favicon图标。 首先Android123以简单的下载例子演示该类的大致结构,如下 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL… urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count)100)); } return totalSize; } protected void onProgressUpdate(Integer… progress) { setProgressPercent(progress[0]); } […]
GraphableButton类实现Android UI开发 Android开发技术
从Android 1.6开始,系统设置中的电池使用记录提供了一种简单的自绘Button按钮演示-GraphableButton类,通过GraphableButton我们可以很清晰的了解到前几次Android123讲到的UI开发要点。 public class GraphableButton extends Button { //从Button类继承 private static final String TAG = "GraphableButton"; static Paint[] sPaint = new Paint[2]; //定义两种颜色 static { sPaint[0] = new Paint(); sPaint[0].setStyle(Paint.Style.FILL); sPaint[0].setColor(0xFF0080FF); sPaint[1] = new Paint(); sPaint[1].setStyle(Paint.Style.FILL); sPaint[1].setColor(0xFFFF6060); } double[] mValues; public GraphableButton(Context context, AttributeSet attrs) { super(context, attrs); […]
ExifInterface使用,Android 2.0新增类 Android开发技术
从Android 2.0开始新增了ExifInterface类,ExifInterface类主要描述多媒体文件比如JPG格式图片的一些附加信息,比如拍照的设备厂商,当时的日期时间,曝光时间,快门速度等。该类位于android.media.ExifInterface的位置,需要调用API Level至少为5即2.0 SDK。 一、ExifInterface类给我们了一个实用的方法public byte[] getThumbnail () 这个方法可以生成一个缩略图,返回一个字节数组,我们通过以前讲到的通过OutputStream将其保存成一个JPG文件。当然如果要是显示到一个Drawable对象,可以通过decodeByteArray(byte[], int, int) 类来解析这个字节数组,不过具体生成的分辨率还不清楚。 二、图片的MIME Exif信息 图片的的Exif信息和MP3的ID3标签类似,使用了属性和值的存储方式。通过public void setAttribute (String tag, String value) 来设置,而获取可以通过 public int getAttributeInt (String tag, int defaultValue) 和 public String getAttribute (String tag) 两种方法都可以,getAttributeInt 重载方法一第二个参数为我们设置的默认值,如果成功则返回相应Tag的值;特定的整数内容为该方法直接返回值。而重载方法二该方法直接返回结果,如果失败则为null。 目前Android SDK定义的Tag有: TAG_DATETIME 时间日期TAG_FLASH 闪光灯TAG_GPS_LATITUDE 纬度TAG_GPS_LATITUDE_REF 纬度参考 TAG_GPS_LONGITUDE 经度TAG_GPS_LONGITUDE_REF 经度参考 TAG_IMAGE_LENGTH 图片长TAG_IMAGE_WIDTH 图片宽TAG_MAKE 设备制造商TAG_MODEL 设备型号TAG_ORIENTATION […]
面向企业应用Android集成SQLite和GG Apps Android开发技术
很多人看到了Android平台作为一个MID终端主要面向个人,但是MID可以很好作为一个企业应用终端,通过Google最新的“云计算”我们已经看到了些眉目,Android手机上包含了SQLite端,同时通过无线3G网络可以轻松的访问Google Apps组件,针对企业办公也是一种新的方向,在这一点微软Windows CE平台已经加入了SQL Mobile的支持。未来的Cloud计算中谁更有优势呢? 看来Windows Live发展不是很顺利,但是现在GG Apps的用户也很少。
Android SDK中bug漏洞报告 Android开发技术
Android平台目前SDK已经4个月没有更新,公开版最新开发包m5-rc15存在很多问题,下面是Google官方的Android SDK中bug漏洞报告页面,同时我们也可以上报bug。 13 Defect —- —- Reviewed —- FileLock.release throws IOException 15 Defect —- —- Reviewed —- no proper multicast support in system 16 Defect —- —- Reviewed —- There’s no SDK for Mac PPC 24 Defect —- —- Reviewed —- Stepping over "Object o = null" causes Eclipse "Internal Error" […]
Android AIDL接口定义语言你知道吗? Android开发技术
Android进程之间如何通讯呢? 在Windows系统中存在IPC管道服务、MailSolt邮槽、消息等方法,在Android平台上提供了一种中间层语言AIDL Android接口定义语言(Android Interface Definition Language)。 实现IPC服务通过使用AIDL步骤主要有: 1.创建aidl文件,这个文件定义了一个接口(XXX.aidl),定义一些方法和字段引用对客户端。 2.添加xxx.aidl问见到你的makefile工程文件中(通过Eclipse插件管理) 3.实现你的接口方法,AIDL编译器会创建一个接口使用Java语言,这个接口封装了一些结构化的类名如Stub,通过集成这个接口实现一些必要的附加方法通过IPC服务调用,你必须创建一个扩展类接口,在你的aidl文件中,我们看到很像Windows Mobile中的ActiveX COM组件或者Symbian的 ECOM接口。 4.暴露你的接口给客户端,如果你写成一种服务形式,你必须扩展服务重载Service.onBind(Intent)来返回一个类实例来实现你的接口。
Android m5到0.9版之间API改变分析 Android开发技术
在最新的Android SDK 0.9版中很多地方都有了改变,涉及改变的API我们已经在Android移植栏目中介绍到,下面以更详细的代码实例形式介绍,不断更新增加: (比如IntentReceiver改名为BroadcastReceiver这种更合适的名称),我们看到Android 0.9 SDK中API的变化在改变上主要是命名方式更准确,实现过程改变不是很多。 IntentReceiver renamed to BroadcastReceiver Detailed Problem Description: For example, if you have a IntentReceiver class name MyReceiver.. In AndroidManifest.xml Error: MyReceiver does not extend android.context.BroadcastReceiver In MyReceiver class defination Error: Cannot resolve type IntentReceiver Solution: replace import android.content.IntentReceiver; public class MyReceiver extends IntentReceiver{ @Override public void onReceiveIntent(Context context, Intent intent) […]

