任何问题请联系WX:uu16853

买模板送网站采集器 让你轻松放开双手运营网站!

购买更多有优惠!

Android中使用定时器TimerTask类介绍 Android开发技术

   在Android平台中需要反复按周期执行方法可以使用Java上自带的TimerTask类,TimerTask相对于Thread来说对于资源消耗的更低,除了使用Android自带的AlarmManager使用Timer定时器是一种更好的解决方法。 我们需要引入import java.util.Timer; 和 import java.util.TimerTask;  private Timer  mTimer = new Timer(true);  private TimerTask mTimerTask;     mTimerTask = new TimerTask()     {      public void run()      {       Log.v("android123","cwj");      }              };           mTimer.schedule(mTimerTask, 5000,1000);  //在1秒后每5秒执行一次定时器中的方法,比如本文为调用log.v打印输出。   如果想取消可以调用下面方法,取消定时器的执行    while(!mTimerTask.cancel());      mTimer.cancel();   最后Android123提示大家,如果处理的东西比较耗时还是开个线程比较好,Timer还是会阻塞主线程的执行,更像是一种消息的执行方式。当然比Handler的postDelay等方法更适合处理计划任务。

Android ANR介绍与避免 Android开发技术

  很多初入Android开发的网友可能发现ANR的字样,到底Android ANR是什么呢? 其实ANR就是Application Not Responding的全称,当某个应用处于长期假死状态时Android系统会弹出一个窗口上面写道,XXX is not responding给出两个按钮一个为force close一个为wait。    可能触发ANR的情况   1. 长时间的I/O处理,比如读写大文件,网络访问时造成的阻塞。   2. 执行耗时的运算,Android默认为超过5000ms即5秒开始弹出ANR窗口,某些应用可能首次执行时没有缓存十分耗时,可以通过Splash播放闪屏Logo等方式来延缓加载   3. Service和appWidget中也要注意多线程的使用,除非它和Activity工作在不同的进程。   避免ANR的方法  1. 单独开工作者线程,通过独立的Thread或使用类似AsyncTask的方式来处理耗时的内容。  2. 耗时的操作尽量分段处理,使用类似状态机的方法,类似Symbian的活动对象将一个复杂的事情,分段执行。  3. UI线程中不要处理过多的内容,比如将一个5MB的文本,让TextView去setText,要知道这种UI操作,没有什么好方法去解决的,所以Android123提示,遇到UI中需要执行复杂的操作,可以参考上面2提到的分段处理方式。

Android JSON解析示例代码 Android开发技术

  来自Google官方的有关Android平台的JSON解析示例,如果远程服务器使用了json而不是xml的数据提供,在Android平台上已经内置的org.json包可以很方便的实现手机客户端的解析处理。下面Android123一起分析下这个例子,帮助Android开发者需要有关 HTTP通讯、正则表达式、JSON解析、appWidget开发的一些知识。 public class WordWidget extends AppWidgetProvider { //appWidget    @Override    public void onUpdate(Context context, AppWidgetManager appWidgetManager,            int[] appWidgetIds) {         context.startService(new Intent(context, UpdateService.class)); //避免ANR,所以Widget中开了个服务    }     public static class UpdateService extends Service {        @Override        public void onStart(Intent intent, int startId) {            // Build the widget update for today            RemoteViews updateViews = buildUpdate(this);             ComponentName thisWidget […]

Android上鲜为人知的UI控件介绍和使用 Android开发技术

  很多Android应用开发者可能习惯了常见的ListView和GirdView其实,Google还提供了一些不错的UI控件,丰富了Android应用的UI显示,只要了解View和Adapter之间的关系,相信你可以很方便的了解每个种控件的使用和扩展,今天Android123一起来谈下,鲜为人知的Android UI控件。   1. SlidingDrawer 抽屉式滑动控件   在Android 1.x时代,功能表是通过Home Screen底部的一个按钮,可以拖拉出来一个View,这种控件其实Android上从1.5开始加入,使用时直接在layout中定义即可,xml布局代码如下: 当然了下面的match_parent就是fill_parent在2.2中被重命名了   <SlidingDrawer     android:id="@+id/drawer"     android:layout_width="match_parent"     android:layout_height="match_parent"      android:handle="@+id/handle"     android:content="@+id/content">      <ImageView         android:id="@id/handle"         android:layout_width="88dip"         android:layout_height="44dip" />      <GridView         android:id="@id/content"         android:layout_width="match_parent"         android:layout_height="match_parent" />  </SlidingDrawer>   有关控制,大家可以看下Android 1.5或1.6的Launcher源码,这里SlidingDrawer主要实现了void  setOnDrawerCloseListener(SlidingDrawer.OnDrawerCloseListener onDrawerCloseListener) 和 void  setOnDrawerOpenListener(SlidingDrawer.OnDrawerOpenListener onDrawerOpenListener) 以及 void  setOnDrawerScrollListener(SlidingDrawer.OnDrawerScrollListener onDrawerScrollListener) 这三个接口,可以获取抽屉控件的打开,关闭和拉动,同时本类提供了很多方法,详细的大家可以在Android SDK中的android.widget.SlidingDrawer分支查看   2. PopupWindow 气球提示控件   有关PopupWindow可以让我们想起Android刚刚开始有输入法框架的时候,当用户按下屏幕软键盘时,弹出的气球提示,这个View可以用PopupWindow来实现,PopupWindow比较方便的就是可以浮动在一个Activity中,设置成为透明或什么可以当做工具栏来使用。具体的大家可以翻看GIT代码中有关Android输入法的代码了解。   3. […]

Android平台下图表绘制相关方法 Android开发技术

  很多网友可能会遇到图表绘制等问题,在Android平台下如何我们需要绘制饼图、K线图应该如何处理呢? 在Android平台下绘图的API大多数由Canvas提供类似Win32或Symbian中的DC,提供大量的绘制方法. 对于饼图即PieChart而言,比较简单,首先计算每个区域的百分比,然后通过drawArc方法绘制弧形,方法原型如下:   public void drawArc (RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint) oval  The bounds of oval used to define the shape and size of the arc startAngle  Starting angle (in degrees) where the arc begins sweepAngle  Sweep angle (in degrees) measured clockwise useCenter  If true, include the center […]

Android Theme和Styles内部定义解析 Android开发技术

  昨天我们讲到的有关在AndroidManifest.xml中定义Activity的theme方法来实现无标题的方法,在使用xml让你的Activity无标题方法 一文中讲到的,很多网友不明白为什么这样做,其实在Android123以前的文章中多次提到了styles样式定义方法,今天Android开发网再次把一些网友回顾了解下android样式的内部定义。在一个工程的res/values/theme.xml中我们可以方便的定义自己的风格主题,比如下面的cwjTheme中我们使用了基于android内部的白色调的背景Theme.Light,设置windowsNoTitle为true代表没有标题,背景颜色我们使用了android内部定义的透明,同时设置listView控件的样式为cwjListView,xml样式代码如下:   <?xml version="1.0" encoding="utf-8"?>  <resources>   <style name="cwjTheme" parent="android:Theme.Light">     <item name="android:windowNoTitle">true</item>     <item name="android:windowBackground">@android:color/transparent</item>     <item name="android:listViewStyle">@style/cwjListView</item>   </style>   有关ListView控件我们自定义的风格就是修改下系统listview这个控件的每行分隔符样式,这里我们在工程下res/drawable文件夹下放一个图片名为list_selector图片,这样我们的cwjListView的代码可以这样写   <style name="cwjListView" parent="@android:style/Widget.ListView">       <item name="android:listSelector">@drawable/list_selector</item>     </style>  </resources>   通过定义style可以设置更多,比如让cwjListView的字体颜色就加入textAppearance属性,比如 <item name="textAppearance">@android:style/TextAppearance</item> 等等。

Android Permission列表,ADT 0.9.9 bug Android开发技术

  Android的开发插件ADT 0.9.9升级后遇到了一个低级BUG,就是无法自动列出系统的permission权限列表,这里Android123给出大家如何从SDK查找permission权限的方法,往常我们往androidmanifest.xml文件中添加权限的方法主要是,直接在下图中单击add按钮,会弹出permission列表,如图   但是升级到ADT 0.9.9时,系统无法显示权限对话框,我们添加权限哪里找呢? Android123告诉大家在SDK的reference中,在左边选择 android,然后下方的classes选择manifest.permission即可,这样右边会有显示Summart帮助我们快速查找,如图 有关具体的定义和适用于最低的API Level可以在下面的Constants中找到,如图     最后需要提醒大家的是,直接复制上图的 constant value后面的字符串即可,在androidmanifest.xml中我们是这样写的,比如  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> ,不知道Google为什么这样做,给我们开发带来了很多效率上的影响。  本文测试环境为 ADT 0.9.9和SDKr6,不知道SDK Tools r7是否正常,希望网友可以反馈下。

Android NDK开发技巧一 Android开发技术

  平时我们开发Android应用时可能部分要求由于性能问题需要使用NDK来实现,比如OpenGL、OpenCore这样的多媒体应用,使用本地C/C++语言可以处理一些性能敏感或复杂的算法,Android123就我们日常NDK开发中遇到的问题以及技巧逐一总结方便网友查阅。      1. Android NDK编译的应用可以运行在Android 1.5或更高的操作系统上,在Android平台中本地调用主要通过JNI方式处理,JNI调用开销不小如果很简单的操作没有必要画蛇添足。      2. 一般NDK生成的so文件如何打包到apk中去呢?一般工程目录下创建一个libs文件夹,当然了手动释放也可以比如说 data/data/cn.com.android123.cwj/files/rmvb-decoder.so      3. 在JNI下面,我们常用的命名方式:     static JavaVM *g_VM;   //全局环境指针     static jclass jNativesClass;   (*env)->GetJavaVM(env, &g_VM);   //获取env环境指针,这样以后用g_VM就可以了。      4.   jobjectArray jargv // java数组 int getArrayLen(JNIEnv * env, jobjectArray jarray): //获取一个Java数组长度,返回为jsize类型 jstring jele = (jstring)(*env)->GetObjectArrayElement(env, jargv, n);  //从将Java数组元素n转为本地的jstringconst char *word = (*env)->GetStringUTFChars(env, jele, 0); //将java的utf字符转为c下面的char*    5.  […]

Android JNI开发入门篇 Android开发技术

  昨天我们大概讲了下Android NDK的开发概况和常见的技巧,很多网友感到表示十分感兴趣发来了邮件希望继续,今天Android123还是从头还是谈论下Java的调用C++的JNI,以便大家开发出一些功能较强大些的Android应用,如果有疑问可以仍然来函至 android123@163.com   1. 有关JNI的类型方法表示,很多网友不明白,下面Android开发网就,基本上C层面的类型均是j+java过去的类型,比如字符串在JNI的c层面为jstring而Java为String,对于布尔类型boolean则为jboolean对应Java中的boolean。   2. 有关Java类的表示在JNI中对应关系如下   long cwjInfo (int nAge, String sName, int[] arrSalary);     我们可以表示为  "(ILjava/lang/String;[I)J"    我们去除双引号,第一个(表示一个参数类型,接下来的I表示第一个参数为int整形,L代表是一个类class,这里为java/lang/String这个类,接下来是[代表是一个数组,后面的I代表一个整形的数组,而)后面的J代表返回类型,在JNI中J代表long长整形,相关的对应关系如下: V voidZ booleanB byteC charS shortI intJ longF floatD doubleL fully qualified class[  array type[]( arg-types  3. Java层传入的String不能在JNI中直接转化为jstring,因为Java的内部编码为unicode,中英文的字符都是每个占两个字节,而jni中我们需要使用utf-8来表示,utf-8比较特殊中英文是不等长的,比如英文等符号的ascii占用一个字节,而中文则为三个字节,同时仍然以\n结尾,所以下面这种错误的方法为 JNIEXPORT jstring JNICALL Java_Cwj_ShowLog(JNIEnv *env, jobject obj, jstring log){  printf("%s", log); //这样做是错误的,printf不能直接处理Java传来的类型。   //dosomething 返回jstring等等。} […]

Android JNI开发提高篇 Android开发技术

  有关JNI的开发技术,我们继续围绕Android平台进行,JNI可以支持C或C++,从目前为止我们写过的JNI代码均为C实现的,即文件名为.C而C++的和这些有什么不同呢? Android平台上的JNI一般使用C还是C++编写呢?    Android平台在中间层和大部分的类库的底层使用了C++的开发方式,后缀为.cpp,比如Android Framework、OpenCore、Webkit、SQLite等等。使用C++好处就是可以使用很多库但目前Android不支持STL,我们知道C表示字符串都是字符数组,但C++可以使用类似string这样的类型表示。   1. 代码上编写C和C++有啥区别   这里Android123就以将Java的unicode字符串转为jni中的utf8,然后再返回一个jstring类型为例子,可以看到jni和java之间字符串的转换方法。   C的实现:   JNIEXPORT jstring JNICALL Java_Android123_CwjC (JNIEnv *env, jobject obj, jstring string) {   const char *strUTF = (*env)->GetStringUTFChars(env, string, 0);   char szBuffer[255];   strcpy(szBuffer, strUTF);  (*env)->ReleaseStringUTFChars(env, string, strUTF);  return (*env)->NewStringUTF(env, szBuffer);}  C++的实现:  JNIEXPORT jstring JNICALL Java_Android123_CwjCpp (JNIEnv *env, jobject obj, jstring string){  const char […]

Android JNI开发进阶篇 Android开发技术

       今天Android123主要讲解下昨天需要详细说明有关Java JNI相关的异常处理、线程安全问题,在JNI中产生的异常主要是内存不足OutOfMemoryError、数组越界ArrayIndexOutOfBoundsException、数组赋值类型错误ArrayStoreException以及指针越界等问题。简单的我们昨天在 Android JNI开发提高篇中已经讲到。    除了Throw或ThrowNew来抛出异常外,还提供了5个函数来处理,分别为jthrowable ExceptionOccurred(JNIEnv *env);、void ExceptionDescribe(JNIEnv *env);、void ExceptionClear(JNIEnv *env);  、 jboolean (JNIEnv *env) 和void FatalError(JNIEnv *env, const char *msg);    1. ExceptionCheck 用于检测如果一个异常已经抛出,则该方法将会返回JNI_TRUE就是typedef定义为1的布尔值。    2. ExceptionOccurred 获取正在抛出一个异常的本地引用,Native或Java层必须处理该异常,并返回一个jthrowable对象。    3. ExceptionDescribe主要用于打印出异常的错误描述。    4. ExceptionClear清除刚刚抛出的异常。    5. FatalError 的作用比较特殊,产生一个致命性的错误,Android123提示这样会导致JVM将关闭,就是程序停止运行了,所以使用时要谨慎。   我们以C++的代码做个例子,简单的说明下他们的使用方法    env->FindClass("Android123CWJ"); //假设这个类本身不存在  if(env->ExceptionCheck())  {     env->ExceptionDescribe();     env->ExceptionClear();  }  这样JVM因为查找Android123CWJ类不存在,导致了一个NoClassDefFoundError的异常。   在JNI中处理资源同步问题,JNI提供了一组函数分别为jint MonitorEnter(JNIEnv […]

Android NDK开发技巧二 Android开发技术

  Android NDK相关的开发技巧我们将在今后经常总结,方便网友参考,有关JNI的使用可以查看 Android JNI开发入门篇 、Android JNI开发提高篇、Android JNI开发进阶篇 、Android JNI开发高级篇 和 Android JNI开发终极篇。   Android NDK对于我们的作用和基本常识在 Android NDK开发技巧一 中已经讲明了,今天谈论下实战的技巧吧   1. 在JNI中打印Logcat,首先我们需要在cpp文件中加入 #include <android/log.h> 这个头文件,NDK有关android自己的就给我们这个唯一的文件log.h,其他的需要我们自己hack diy来解决。   jstring jlog;  //从Java传来需要打印的字符  jboolean isCopy;  const char * szLog = (*env)->GetStringUTFChars(env, jlog, &isCopy); //将java的unicode字符转化为utf8字符      __android_log_print(ANDROID_LOG_WARN, “android123-cwj”, "from ndk = %s", szLog); //打印logcat     (*env)->ReleaseStringUTFChars(env, jlog, szLog); // 释放内存} 上面这段比较简单,其中使用__android_log_print函数打印Logcat,第一个参数为log的level,在log.h头文件中定义了 ANDROID_LOG_UNKNOWN = 0、 ANDROID_LOG_DEFAULT,    /* […]

Android JNI开发高级篇 Android开发技术

   有关Android JNI开发中比较强大和有用的功能就是从JNI层创建、构造Java的类或执行Java层的方法获取属性等操作。     一、类的相关操作     1. jclass FindClass(JNIEnv *env, const char *name);  查找类     该函数可能做过Java开发的不会陌生,这个是JNI层的实现,需要注意的是第二个参数为const char*类型的,我们如果从Java从层传入unicode编码的jstring类型需要使用GetStringUTFChars函数转换成utf8的const char*,如果成功返回这个Java类的对象jclass,相关的异常可能有      (1. ClassFormatError 类的数据格式无效     (2. ClassCircularityError 该类或接口是自身的超类或超接口     (3. NoClassDefFoundError 没有找到指定名称的类或接口       (4. OOM内存不足错误,即OutOfMemoryError        2. jclass GetSuperclass(JNIEnv *env, jclass clazz);  获取父类或者说超类         该函数的第二个参数为jclass类,我们调用时传入的是子类,否则返回将是NULL      3. jboolean IsAssignableFrom(JNIEnv *env, jclass clazz1,jclass clazz2);  判断class1对象能否安全的强制转换为class2对象        如果可以将返回 JNI_TRUE,JNI_TRUE的定义值为1,否则返回JNI_FALSE即0 ,这里Android123详细说明下哪些情况可能返回真:      […]

Android JNI实例代码(一) Android开发技术

  前几天Android123有关Android JNI开发系列教程中有关的源代码,可以在本文中查找: 一、 在JNI中执行Java方法 class AndroidJniDemo { private native void executeMethod(); private void show() {  System.out.println("Java cwj print"); //执行了show方法后打印java层的输出 } public static void main(String args[]) {  //这里我们在J2SE中测试,Android开发者可以放到Activity中的onCreate调用  AndroidJniDemo ajd = new AndroidJniDemo();  ajd.executeMethod();  } static {  System.loadLibrary("AndroidJniDemo"); }} 下面是JNI代码: JNIEXPORT void JNICALLJava_AndroidJniDemo_executeMethod(JNIEnv *env, jobject obj){ jclass clazz = (*env)->GetObjectClass(env, obj); //通过类的对象 jmethodID mid = (*env)->GetMethodID(env, clazz, "show", "()V"); //查找java中的show方法的ID,最后的签名符号为void类型 if (mid == NULL) {  return;   //如果方法ID没有找到 }  printf("JNI cwj print"); //从JNI中打印输出 […]

Android JNI实例代码(二) Android开发技术

   我们继续Android JNI开发中的常用代码,第二部分将包含如何在JNI中构造实例化一个Java类以及异常处理的具体方法,有关前一部分的内容可以查看 Android JNI实例代码(一)  。    三、在JNI中构造和实例化Java类  public class AndroidJniDemo4{ public static native void constructClass(); //JNI方法 public static void main(String[] args){  AndroidJniDemo4.constructClass(); }} class CwjThread implements Runnable { int nCount = 0 ; public void run(){  try{   Thread.sleep(1987); //休眠1987毫秒  }catch(Exception e){   e.printStackTrace();  }  System.out.println("Count="+ nCount); }} JNIEXPORT void JNICALLJava_AndroidJniDemo4_constructClass(JNIEnv *env, jclass clazz){ jclass jclazz , cwjclazz;   jmethodID mid , mid2 , runmid ;  jobject obj , obj2 ;  jclazz = […]

Android开发调试工具TraceView多图演示 Android开发技术

  有关Android SDK自带的性能分析调试工具TraceView使用方法,我们在android.os.Debug调试工具使用方法 简单的说过,有关实际使用如下   public void android123_method()   {            android.os.Debug.startMethodTracing("cwj");             //dosomething           android.os.Debug.stopMethodTracing();   }  一般会保存在 /sdcard/cwj.trace 当然2.2或以上可能在/mnt/sdcard/cwj.trace中,同时因为写sdcard需要加入WRITE_EXTERNAL_STORAGE 这个permission ,我们执行adb pull /sdcard/cwj.trace可将文件从sdcard传到pc上,也可以通过ddms的file explorer,等等,执行 traceview cwj或直接从Android SDK中鼠标执行traceview导入cwj.trace文件可以看到如下图   (点击下图 查看原始大图):         我们可以看到每个方法或类型执行的时间百分比,分析Android程序的性能。  

Android开发进阶之NIO非阻塞包(五) Android开发技术

  有关Android NIO的注意点和重点今天Android123着重分析下上次 Android开发进阶之NIO非阻塞包(四) 一文中提到的不足地方改进。由于目前国内很多人资料书籍编写人员没有通过NIO实现服务器的经验,导致了很多例子中存在严重的错误,由于大多数例子为Echo这样的单次交互以及数据量较小所以反映不出问题的所在。    1. 读和写应该分开,NIO使用的是异步的方法但不等于说不会阻塞,在上面的例子中我们可以看到 判断  key.isReadable() 时,对于这个SelectionKey关联的SocketChannel尽量不要使用写入数据量过多时ByteBuffer使用hasRemaining这样的方法,NIO每次读写不一定全部要把数据读完在一次Selector时。   2. 对于上面的解决方法我们可以继续关注感兴趣的事件,比如说使用interestOps方法,而很多资料中均使用了错误的继续用Selector的register方法继续注册事件,这样没有发生错误的原因是每次注册时会替换上次的这个key注册的事件,比较侥幸,从效率上讲还会判断这个key上次注册的是什么事件,并不是一种正统的方法。   3. 我们可以继续判断写入事件,比如key.isWritable,在写入时来处理发送数据。这样可以应对很多低速网络时产生的异常。   有关的细节还有很多,下一次Android开发网总结出常见的问题,并给大家一个较科学完善的框架,减少不必要的麻烦产生。

Android 2.3将于12月6日发布 Android开发技术

  近日来自Google官方的消息表示Android 2.3姜饼应该在12月6日发布,同时由三星代工的第二款Google贴牌手机Nexus S也可能同时推出,原先的Nexus One用户也可能是最早收到2.3更新的用户群,这两款机型作为Android开发机型的主推产品在硬件和固件升级速度上均会比HTC、MOTO和Samsung有着更多的优势。   届时Android 2.3 Gingerbread SDK也会在下月的6日同日发布。有关Nexus S的主要配置和三星i9020一样,使用了三星自家的Samsung S5PC100 CPU工作频率为1GHz的A8内核,4英寸Super AMOLED屏、500W摄像头、16GB内存。同时将会预装Android 2.3操作系统。很多网友可能会疑问Nexus S最终和i9020有什么不同,Android123就拿HTC Desire G7和Nexus One作对比吧,G7有HTC Sense UI而N1的界面是Google原生的,没有那么多附属的应用,而本次Nexus S也不会包含三星的TouchWiz主题。   

Android 2.3中的java.io.File类新增功能 Android开发技术

  对于Android 2.3来说原始Sun公司的java.io.File包中的内容也有了改进,File类在API Level为9时多出了很多新特性,比较实用的有:   public long getFreeSpace ()  返回这个分区包含这个路径的剩余空间,如果返回0则表示不存在,下面为SDK原文    Returns the number of free bytes on the partition containing this path. Returns 0 if this path does not exist. Note that this is likely to be an optimistic over-estimate and should not be taken as a guarantee your application can actually write this […]

Android平台上的11个感应器你都知道吗 Android开发技术

   在Android 2.3中新增了3个感应器,对于Android平台的开发我们通过感应器可以发挥想象设计出一些很实用的软件。下面就一起看下目前API Level为9时一共11个感应器分辨是什么吧.   1. ACCELEROMETER 加速,描述加速度的。   2.GRAVITY 重力,这个在大家都知道。   3.GYROSCOPE 陀螺仪,对于物体跌落检测更强大些,开发游戏少了它会有点遗憾的,API Level 9新增的类型。   4. LIGHT 光线感应器,很多Android手机的屏幕亮度是根据这个感应器的数组自动调节的。   5. LINEAR_ACCELERATION 线性加速器,API Level 9新增的。  6. MAGNETIC_FIELD 磁极感应器。   7. ORIENTATION 方向感应器。   8. PRESSURE 压力感应器。    9. PROXIMITY 距离感应器,对于通话后关闭屏幕背光很有用。   10. ROTATION_VECTOR 旋转向量,Android 2.3新增的,如果我们过去处理图像会发现这个还是很有用的,不过这里还是对游戏开发起到辅助。  11. TEMPERATURE 温度感应器,可以获取手机的内部温度,不过和周边的有些差距,毕竟手机内部一般温度比较高。    对于以上感应器Android123提醒开发者,除了特别描述API Level为9或2.3之外的,SDK在1.5即Level 3时就已经支持了,不过最终使用还要看手机硬件的支持,很多山寨机或小品牌的设备可能会在这些上面偷工减料,同时Android开发网提醒大家,感应器的数据刷新比较快一般,考虑到电池功耗一般长时间使用CPU的占用率可能会提升,影响系统性能。   列举手机上已经有的感应器,可以通过SensorManager类的List<Sensor>  getSensorList(int type)  […]

手势识别兼容Android 1.x和2.x的代码 Android开发技术

   由于Android 2.x开始很多API变动比较大新增了一些比如多点触控的支持,对于屏幕触控手势识别中我们需要考虑更多的实现方法,下面是一段兼容Android 1.x和2.x的代码,可以让我们的程序兼容几乎99%的Android手机。   一、首先新建一个抽象类判断SDK版本问题  public abstract class VersionedGestureDetector {    private static final String TAG = "VersionedGestureDetector";     OnGestureListener mListener;     public static VersionedGestureDetector newInstance(Context context,            OnGestureListener listener) {  //设计实例化构造方法,这里Android123提示大家目前有3种API的实现方法,我们需要逐一考虑最优的解决方法,以满足高平台更多的功能实现。         final int sdkVersion = Integer.parseInt(Build.VERSION.SDK); //使用android.os.Build判断API Level,但需要将字符串转换为整形        VersionedGestureDetector detector = null;        if (sdkVersion < Build.VERSION_CODES.ECLAIR) { //如果版本小于2.0则使用1.5版本的API,可以兼容1.5和1.6            detector = new CupcakeDetector();        } else […]

StrictMode限制模式API加速你的应用 Android开发技术

   从Android 2.3开始提供了一个新的类名为StrictMode可以帮助开发者改进你的Android应用,StrictMode通常可以捕捉到发生在磁盘或网络访问的应用主线程中,可以让主线程处理UI和动画在磁盘读写和网络操作时变得更平滑,避免ANR窗口的发生。   一段示例代码可以很好的说明Android 2.3新特性StrictMode限制模式的工作方式,我们在Activity的onCreate中加入    public void onCreate() {     if (DEVELOPER_MODE) { //Android开发网提醒大家,这个标记自己设置一个全局的宏,当然Java中我们用一个Boolean类型设置debug模式好了         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()                 .detectDiskReads()                  .detectDiskWrites()                 .detectNetwork()   // 这里可以替换为detectAll() 就包括了磁盘读写和网络I/O                 .penaltyLog()  //打印logcat                 .build());         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()                  .detectLeakedSqlLiteObjects() //探测SQLite数据库操作                 .penaltyLog() //打印logcat                 .penaltyDeath()                 .build());     }     super.onCreate(); }   有关Android 2.3的限制模式使用和具体的测试,Android123将在明天详细说明,有兴趣的网友可以查看下SDK文档的android.os.StrictMode,具体的效果和开发改进意见需要进行实际评估。

Android加速感应器开发平衡球代码解析 Android开发技术

   如何使用Android的加速感应器开发一个控制铁球滚动的游戏: public class AccelerometerPlayActivity extends Activity {     private SimulationView mSimulationView; //游戏主显示View    private SensorManager mSensorManager; //感应器管理类    private PowerManager mPowerManager; //电源控制,比如防锁屏    private WindowManager mWindowManager;     private Display mDisplay;     private WakeLock mWakeLock;      @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);          mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); // 实例化感应器管理类         mPowerManager = (PowerManager) getSystemService(POWER_SERVICE);         mWindowManager = (WindowManager) […]

Android 2.4改进主要针对平板电脑 Android开发技术

  按照目前曝光的消息来看Android 2.4蜂巢可能主要改进用于平板电脑,最终可能在2011年2月份左右发布,届时很多实用NVIDIA Tegra2的平板将会大量采用。   1. NVIDIA Tegra2目前主要使用的厂商有Motorola,目前网上已经曝光了这款MotoPad的原型机图片,最终的设计应该会有变动,不过Tegar2作为一款实用A9架构的双核处理器可能比目前主流的Snapdragon QSD8250这种1GHz的A8架构处理器更有竞争力在多媒体方面。   2. 目前平板电脑中iPad凭借出色的硬件制造工艺已经赢得了不少市场,而手机制造商Motorola、HTC在这种设备制造上可能不如传统的PC制造商如Acer、Asus他们经验丰富。Android 2.4最终将对WSVGA等高分辨率的兼容可以让开发者不考虑过多的UI设计。   3. Android 2.3的升级和改进可以看得出增加了硬件的支持,前置摄像头视频通话、NFC以及更多的感应器可以看出Google目前已经领先其他移动操作系统。  如果你现在考虑购买平板,可能512MB的RAM和Tegra2的CPU是一个明智的选择,不过遗憾的是目前知名品牌中还没有推出相应的解决方案,一切要看2011年了。

Android获取摄像头详细信息 Android开发技术

  如何获取Android设备上的详细的摄像头信息呢? 目前Samsung的Galaxy Tab和Nexus S均有前置摄像头,获取Android摄像头的详细信息,在Android 2.3 SDK中得到了增强:   在android.hardware.Camera类中,API Level 9的SDK中加入了两个比较重要的方法,使用getNumberOfCameras这个static类型方法可以获取当前Android设备上的摄像头数量,比如Nexus S有两个,方法原型如下   public static int getNumberOfCameras ()      而对于具体的每个摄像头的信息,可以通过Camera类的getCameraInfo()这个静态方法获取,该方法有两个参数,参数一的ID,我们通过getNumberOfCameras获取的值减1即可,类似数组索引从0开始一样,用循环遍历每个摄像头信息,参数二是android.hardware.Camera.CameraInfo类,有关getCameraInfo方法的原型如下:   public static void getCameraInfo (int cameraId, Camera.CameraInfo cameraInfo)   对于Camera.CameraInfo类而言,比较简单,包含两个字段   public int facing   代表摄像头的方位,目前有定义值两个分别为CAMERA_FACING_FRONT前置和CAMERA_FACING_BACK后置  public int orientation  下面是拍照的旋转方向,一般自然些有0度、90度、180度和270度,这样可以获取我们正确的手握设备是横着还是竖着,有关拍照时的方向设置,可以参考下面的代码设置   public static void setCameraDisplayOrientation(Activity activity,         int cameraId, android.hardware.Camera camera) {  […]

Android 2.2新增的DeviceAdminInfo类 Android开发技术

   在Android 2.2中新增了一个android.app.admin.DeviceAdminInfo类,可以帮助我们以管理员权限获取一个Package信息,DeviceAdminInfo类有一个构造方法为DeviceAdminInfo(Context context, ResolveInfo receiver) 来实例化该类,参数一为目标PackageManager的Context。   ActivityInfo  getActivityInfo()  获取该Context的Activity信息,返回一个ActivityInfo对象  ComponentName  getComponent()  //获取这个Package的Component名称  String  getPackageName()  //获取这个apk包的package名称  String  getReceiverName()  //返回所有的receiver名称  String  getTagForPolicy(int policyIdent)  //返回一些定义的tag根据定义,这里定义的有 USES_POLICY_FORCE_LOCK 、 USES_POLICY_LIMIT_PASSWORD 、USES_POLICY_RESET_PASSWORD 、  USES_POLICY_WATCH_LOGIN和USES_POLICY_WIPE_DATA  CharSequence  loadDescription(PackageManager pm)  //载入一个package的描述 Drawable  loadIcon(PackageManager pm)  //这里android123提示对于apk文件在2.2中推荐的获取icon方法 CharSequence  loadLabel(PackageManager pm) //获取软件名称 boolean  usesPolicy(int policyIdent)  //参数定义参考上面的getTagForPolicy

Android OpenGL下截图代码 Android开发技术

   Android平台如何在OpenGL下截图呢? 如果是一个FPS类的游戏可能常规的方式截图,由于Android系统底层读取framebuffer的效率不是很高,尝尝截图出来的游戏可能由于刷新问题,产生上半部分和下半部分不匹配的问题,在GL中我们可以使用下面这个代码来解决。      public static Bitmap SavePixels(int x, int y, int w, int h, GL10 gl)    {           int b[]=new int[w*h];         int bt[]=new int[w*h];         IntBuffer ib=IntBuffer.wrap(b);         ib.position(0);         gl.glReadPixels(x, y, w, h, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, ib);         for(int i=0; i<h; i++)         {               for(int j=0; j<w; j++)              {                   int pix=b[i*w+j];                   int pb=(pix>>16)&0xff;                   int pr=(pix<<16)&0x00ff0000;                   int pix1=(pix&0xff00ff00) | pr […]

自定义Android菜单背景 Android开发技术

  如何自定义Android菜单背景呢? 默认的情况下Android系统的菜单是白色的,下面的例子可以通过自定义的xml布局实现个性化的menu public class MenuEx extends Activity {  private static final String TAG = "android123";      @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);            }             @Override public boolean onCreateOptionsMenu(Menu menu) {        super.onCreateOptionsMenu(menu);  MenuInflater inflater = new MenuInflater(getApplicationContext());  inflater.inflate(R.menu.options_menu, menu);  setMenuBackground();  return true; }   关键代码就是重写Layout类的工厂方法onCreateView,这里对比绘制的View来替换系统中的 protected void setMenuBackground(){          Log.d(TAG, "开始设置菜单的的背景");     getLayoutInflater().setFactory( new Factory() {            @Override      public View onCreateView ( String […]

ListView自动滚动方法 Android开发技术

  如何让你的ListView实现自动滚动呢? Android其实已经考虑到ListView控件的智能滚动操作。直接在Layout中写即可,注意下面的stackFromBottom以及transcriptMode这两个属性。Android123提示大家类似Market客户端的低端不断滚动,Android123将在以后的文章中告诉大家更好的解决方法。涉及代码如下:     <ListView android:id="listCWJ"              android:layout_width="fill_parent"              android:layout_height="fill_parent"              android:stackFromBottom="true"                android:transcriptMode="alwaysScroll"              /> 

Android获取本机电话号码 Android开发技术

    如何在Android上获取本机电话号码,目前Android上提供了一个API可以读取早期SIM卡上固化的号码, private String getPhoneNumber(){       TelephonyManager mTelephonyMgr;       mTelephonyMgr = (TelephonyManager)  getSystemService(Context.TELEPHONY_SERVICE);        return mTelephonyMgr.getLine1Number();   }     上面的getPhoneNumber方法返回当前手机的电话号码,同时必须在androidmanifest.xml中加入 android.permission.READ_PHONE_STATE 这个权限,但是Android123提示大家上面的方法只能获取很老SIM卡的手机号码,目前主流的获取用户手机号码一般采用用户主动发送短信到SP或接收手机来获取。

Android JSON解析类 – JsonReader Android开发技术

   在Android 3.0 honeycomb开始提供了新的JSON解析类 – android.util.JsonReader,下面Android123以下面的JSON为例子 [    {      "id": 912345678901,      "text": "How do I read JSON on Android?",      "geo": null,      "user": {        "name": "android_newb",        "followers_count": 41           },    {      "id": 912345678902,      "text": "@android_newb just use android.util.JsonReader!",      "geo": [50.454722, -104.606667],      "user": {        […]

Android JSON写入类 – JsonWriter Android开发技术

   在Android 3.0中新增了一个JSON写入类android.util.JsonWriter,使用JsonWriter可以轻松的生成JSON格式的数据,比如下面的JSON数据为    [    {      "id": 912345678901,      "text": "How do I write JSON on Android?",      "geo": null,      "user": {        "name": "android_newb",        "followers_count": 41           },    {      "id": 912345678902,      "text": "@android_newb just use android.util.JsonWriter!",      "geo": [50.454722, -104.606667],      "user": {        "name": "jesse", […]

Android 3.0新增日历控件CalendarView Android开发技术

  在Android 3.0中新增的日历视图控件可以显示网格状的日历内容,android.widget.CalendarView是从android.widget.FrameLayout中继承。 CalendarView 类提供了基本的日历设置方法,    long  getDate()  获取从1970年,1月1日,0点0分0秒到现在的毫秒数,因为返回是long型最终只能截止到2038年 int  getFirstDayOfWeek()  //获取当天是本周的第几天,Android123提示返回的定义在java.util.Calendar类中,比如Calendar.Monday为星期一,定义值为2。 long  getMaxDate()  //获取CalendarView支持1970年到那天的最大天数 long  getMinDate() //获取CalendarView支持1970年到那天的最小天数 boolean  getShowWeekNumber()  //获取是否显示星期号 boolean  isEnabled()  //是否显示本日历视图  public void setDate (long date, boolean animate, boolean center) //设置选择日期到1970年的描述 void  setDate(long date) //设置选择的日期描述到1970年 void  setEnabled(boolean enabled) //设置是否启用视图 void  setFirstDayOfWeek(int firstDayOfWeek)  //设置本周起始天数 void  setMaxDate(long maxDate)  void  setMinDate(long minDate)  void  setOnDateChangeListener(CalendarView.OnDateChangeListener listener)   //日历视图修改的接口,这个介绍看下面。 void  setShowWeekNumber(boolean showWeekNumber) //设置是否显示周号   有关日历控件CalendarView的设置接口 android.widget.CalendarView.OnDateChangeListener 只实现了一个回调方法void  onSelectedDayChange(CalendarView view, int […]

100% Secure Checkout

PayPal / MasterCard / Visa