有网友询问如何实现按下Home键的效果,Android设备在按下Home键会自动切换回桌面,其实实现的方法很简单,由于Launcher捕获了Home键的按下action,我们直接发送个Intent给Launcher即可, Intent i= new Intent(Intent.ACTION_MAIN); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //android123提示如果是服务里调用,必须加入new task标识 i.addCategory(Intent.CATEGORY_HOME); startActivity(i);
软件应用教程
自定义Android主题风格theme.xml方法 Android开发技术
在Android中可以通过自定义主题风格方式来实现个性化以及复用,首先我们创建theme.xml主题文件,保存位置为工程的res/values/theme.xml ,这里我们可以可以为主题起一个名称,比如CWJ,这里去除了xml的文件头<?xml version="1.0" encoding="utf-8"?>这行,我们在工程中只需在androidmanifest.xml文件的Activity节点中加入android:theme="@style/Theme.CWJ" 属性,则这个Activity就使用了这种主题风格,整个xml的关键代码如下: <resources> <style name="Theme.CWJ" parent="android:Theme"> <item name="android:windowBackground">@drawable/android123</item> </style></resources> 其中上面的代码中,我们定义设置全局android:windowBackground即背景值为/res/drawable中的android123图片为背景,更多的属性定义可以参考view的layout xml属性设置,比如我们设置所有字体颜色、大体大小和样式,可以在style节点中加入 <item name="android:textColor">#fff</item> <item name="android:textSize">14sp</item> <item name="android:textStyle">bold</item> 当然我们可以将上面的android123的图片改进下,使用一个xml文件替代,比如使用bitmap对象,则/res/drawable/android123.xml的完整代码变为 <?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/cwj_image" android:tileMode="repeat" /> 这里我们使用了一个bitmap对象来解析cwj_image图片,当然这里可以识别各种类型的图片,其中android:tileMode是bitmap的内部属性,其中tileMode设置为repeat代表重复,这样可以节省bitmap资源,比如我们的背景是一层楼,那么全屏可以显示同样的为5层效果,而图片仅是一层大小,对于资源利用相对更高。 当然bitmap的属性tileMode的值为repeat外还有其他的值比如clamp、mirror,这些值并没有在SDK中并没有找到定义,通过上次Android开发网的 Android自定义View以及layout属性全攻略 一文,我们可以联想到bitmap属于android.graphics.Bitmap 包,由于是android框架,所以下载git的base包,找到该类,类的实例化时android123已经在 Android自定义View以及layout属性全攻略 说的很清楚,所以我们定位到res\values中找到attr.xml有关bitmap的定义即可,有关bitmap的更多属性如 antialias、filter和dither都可以找到使用。
Android AIDL全攻略二 – Service绑定 Android开发技术
上次我们在 Android AIDL全攻略一 中讲到了AIDL的概念,由于AIDL属于服务相关内容,同时需要涉及到Service绑定问题,作为整个Android AIDL系列教程的第二节我们一起来看下Service绑定问题。我们过去使用一些轻量级的服务可能直接startService启动,通过Service中的onStart方法可以获取执行服务的命令行,其中参数Intent可以传递内容,当然作为低频度的传输也可以考虑Broadcast来交互Activity和Service,但是作为正常专业的长久的服务Android123还是推荐大家使用绑定机制来实现数据的传输。其中系统级别的跨进程服务AIDL就是基于Service绑定方式的。 作为Service必须重写一个方法就是onBind(),如果使用startService方式启动服务,则我们在onBind()中返回一个null的IBinder对象。今天使用bindService方法将如何写呢? 具体的步骤如下: 1. 使用bindService方法启动服务,bindService (Intent service, ServiceConnection conn, int flags) 有三个参数,这里大家可能会对第二个ServiceConnection和最后第三个参数的标识感到陌生,一般在我们调用bindService时需要一个ServiceConnection获取服务实例以及状态,代码如下 private ServiceConnection sc = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { Toast.makeText(ctx, "android123 service connected", Toast.LENGTH_LONG).show(); } @Override public void onServiceDisconnected(ComponentName name) { Toast.makeText(ctx, "android123 service disconnected", Toast.LENGTH_LONG).show(); } }; 这样,我们在服务的连接和断开时都会收到一个Toast的消息提示,而bindService最后的参数一般使用BIND_AUTO_CREATE 标识自动创建。所以一般我们绑定一个服务,使用下面的代码 bindService(intent, sc, Service.BIND_AUTO_CREATE); 来启动服务,而解除绑定可以用 unbindService(sc); 2. […]
Android AIDL全攻略三 – AIDL框架 Android开发技术
在Android AIDL全攻略的一和二中我们提到了相关的基础内容,本次我们将通过实例代码完成AIDL框架。这里Android123推荐大家使用Eclipse+ADT的开发方式以提高我们的效率,有关ants和aidl命令的编译方式不了解的可以来函至android123@163.com 我们会及时回复。 1. AIDL的语法和框架,Android IDL语言类似Java的接口,可以使用常规的String、Boolean等类型,但对于数值传递我们需要使用 Parcelable 接口,如果你不了解 Parcelable 的使用,Android123将在下节详细解释。 2. 在我们的工程中创建一个 xxx的.aidl文件,这时回到Eclipse重新构建工程可以发现在/res/gen的文件夹下会自动生成Ixxx.java文件,ADT帮我们实现这个接口的stub类,具体的AIDL文件内容比如为: package com.android123.cwj; interface IWeatherService { int getTemperature(in String city,out String temperature); int getTemperatureList(in String city, out String[] temperature);} 上面我们注意AIDL文件中的方法,参数类型前面有in和out关键字,类似Win32 COM中的IN或OUT,分别代表传入和输出,对于Java文件,ADT插件会在res/gen中生成一个java文件实现Stub子类。本文未完成,
Android中String资源文件的format方法 Android开发技术
很多时候我们感性Google在设计Android时遵守了大量MVC架构方式,可以让写公共代码、美工和具体逻辑开发人员独立出来。有关Android的资源文件values/strings.xml中如何实现格式化字符串呢? 这里Android123举个简单的例子,以及最终可能会用到哪些地方。 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">cwj_Demo</string> <string name="hello">android开发网</string> </resources> 上面是一段简单的字符串资源文件,没有用到格式化,因为比较简单直接描述了意思,当我们设计一个类似 Delete xxx File ? 的时候,我们可能需要在Java中动态获取 xxx 的名称,所以定义资源时使用格式化可以轻松解决,不需要一堆String去拼接或StringBuffer一个一个append这样的愚蠢方法,看例子 <string name="alert">Delete %1$s File</string> 这里%1$s代表这是一个字符串型的,如果是整数型可以写为%1$d,类似printf这样的格式化字符串函数,当然如果包含了多个需要格式化的内容,则第二个可以写为%2$s或%2$d了,那么最终在Java中如何调用呢? 看下面的例子: 例一: 整数型的 <string name="alert">I am %1$d years old</string> 定义的是这样的 当然,我们杜绝意外情况,比如冒出个secret这样的string类型的,注意上面是%1$d不是%1$s,所以默认标准的合并成为 int nAge=23; String sAgeFormat = getResources().getString(R.string.alert); String sFinalAge = String.format(sAgeFormat, […]
onRetainNonConfigurationInstance和getLastNonConfigurationInstance Android开发技术
很多网友可能知道Android横竖屏切换时会触发onSaveInstanceState,而还原时会产生onRestoreInstanceState,但是Android的Activity类还有一个方法名为onRetainNonConfigurationInstance和getLastNonConfigurationInstance这两个方法。 我们可以通过 onRetainNonConfigurationInstance 代替 onSaveInstanceState,比如距离2 @Override public Object onRetainNonConfigurationInstance() { //这里需要保存的内容,在切换时不是bundle了,我们可以直接通过Object来代替 return obj; } 在恢复窗口时,我们可以不使用 onRestoreInstanceState,而代替的是 getLastNonConfigurationInstance 方法。我们可以直接在onCreate中使用,比如 Object obj = getLastNonConfigurationInstance(); 最终obj的内容就是上次切换时的内容。 这里Android123提醒大家,每次Activity横竖屏切换时onCreate方法都会被触发。
inent调用代码总结,不断完善中 Android开发技术
来自网友整理的Intent,当然Android123将会加入更多内容不断完善Intent常见调用帮助网友方便查找。 显示Web网页: 1. Uri uri = Uri.parse("http://www.android123.com.cn"); 2. Intent it = new Intent(Intent.ACTION_VIEW,uri); 3. startActivity(it); 显示Google地图: 1. Uri uri = Uri.parse("geo:38.899533,-77.036476"); 2. Intent it = new Intent(Intent.Action_VIEW,uri); 3. startActivity(it); Maps路径规划: 1. Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en"); 2. Intent it = new Intent(Intent.ACTION_VIEW,URI); 3. startActivity(it); 拨打电话: 1. Uri uri = Uri.parse("tel:xxxxxx"); 2. […]
Android工程内嵌资源文件的两种方法 Android开发技术
Android软件一般处理大的资源通过sdcard比如在线下载资源到sdcard,而apk中内嵌资源或二进制文件时一般使用下面的两种方法: 方法一 res/raw目录下存放,比如cwj.dat一个二进制文件,我们可以读取可以直接 InputStream is=context.getResources().openRawResource(R.raw.cwj); 方法二 工程根目录下的assets文件夹中存放,比如assets/cwj.dat 这样我们使用下面的代码 AssetManager am = context.getAssets(); InputStream is = am.open(cwj.dat); 这里Android123提示大家Google的Android系统处理Assert有个bug,在AssertManager中不能处理单个超过1MB的文件,不然会报异常具体数值大家可以测试下传个稍大的文件,我们在两年前的文章中有提到,而第一种raw没这个限制可以放个4MB的Mp3文件没问题。
Android中String资源文件的format方法 Android开发技术
很多时候我们感性Google在设计Android时遵守了大量MVC架构方式,可以让写公共代码、美工和具体逻辑开发人员独立出来。有关Android的资源文件values/strings.xml中如何实现格式化字符串呢? 这里Android123举个简单的例子,以及最终可能会用到哪些地方。 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">cwj_Demo</string> <string name="hello">android开发网</string> </resources> 上面是一段简单的字符串资源文件,没有用到格式化,因为比较简单直接描述了意思,当我们设计一个类似 Delete xxx File ? 的时候,我们可能需要在Java中动态获取 xxx 的名称,所以定义资源时使用格式化可以轻松解决,不需要一堆String去拼接或StringBuffer一个一个append这样的愚蠢方法,看例子 <string name="alert">Delete %1$s File</string> 这里%1$s代表这是一个字符串型的,如果是整数型可以写为%1$d,类似printf这样的格式化字符串函数,当然如果包含了多个需要格式化的内容,则第二个可以写为%2$s或%2$d了,那么最终在Java中如何调用呢? 看下面的例子: 例一: 整数型的 <string name="alert">I am %1$d years old</string> 定义的是这样的 当然,我们杜绝意外情况,比如冒出个secret这样的string类型的,注意上面是%1$d不是%1$s,所以默认标准的合并成为 int nAge=23; String sAgeFormat = getResources().getString(R.string.alert); String sFinalAge = String.format(sAgeFormat, […]
onRetainNonConfigurationInstance和getLastNonConfigurationInstance Android开发技术
很多网友可能知道Android横竖屏切换时会触发onSaveInstanceState,而还原时会产生onRestoreInstanceState,但是Android的Activity类还有一个方法名为onRetainNonConfigurationInstance和getLastNonConfigurationInstance这两个方法。 我们可以通过 onRetainNonConfigurationInstance 代替 onSaveInstanceState,比如距离2 @Override public Object onRetainNonConfigurationInstance() { //这里需要保存的内容,在切换时不是bundle了,我们可以直接通过Object来代替 return obj; } 在恢复窗口时,我们可以不使用 onRestoreInstanceState,而代替的是 getLastNonConfigurationInstance 方法。我们可以直接在onCreate中使用,比如 Object obj = getLastNonConfigurationInstance(); 最终obj的内容就是上次切换时的内容。 这里Android123提醒大家,每次Activity横竖屏切换时onCreate方法都会被触发。
inent调用代码总结,不断完善中 Android开发技术
来自网友整理的Intent,当然Android123将会加入更多内容不断完善Intent常见调用帮助网友方便查找。 显示Web网页: 1. Uri uri = Uri.parse("http://www.android123.com.cn"); 2. Intent it = new Intent(Intent.ACTION_VIEW,uri); 3. startActivity(it); 显示Google地图: 1. Uri uri = Uri.parse("geo:38.899533,-77.036476"); 2. Intent it = new Intent(Intent.Action_VIEW,uri); 3. startActivity(it); Maps路径规划: 1. Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en"); 2. Intent it = new Intent(Intent.ACTION_VIEW,URI); 3. startActivity(it); 拨打电话: 1. Uri uri = Uri.parse("tel:xxxxxx"); 2. […]
Android多点触控开发原理 Android开发技术
Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC、Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouch技术,对于网页缩放、手势操作上有更好的用户体验。 在Android平台上事件均使用了MotionEvent对象方式处理,比如开始触控时会触发ACTION_DOWN而移动操作时为ACTION_MOVE最终放开手指时触发ACTION_UP事件。当然还有用户无规则的操作可能触发ACTION_CANCEL这个动作。 首先Android开发网提醒大家多点触控需要LCD驱动和应用软件两个支持才能实现,所以部分比较老的,比如Android 2.1以前或在北美上市的手机可能无法支持多点触控在固件上,由于Apple专利原因在欧洲和亚太地区的Android 2.1以后的新款机型固件均已经在屏幕驱动中支持,同时模拟器也无法实现多点触控的测试。 下面Android123一起用Android 2.0或以上SDK中的方法来实现如何通过应用层支持多点触控操作,对于常规的控件触控操作在内部为View的setOnTouchListener()接口实现的onTouchEvent()方法来处理。对于onTouchEvent方法的参数MotionEvent我们可以详细处理来实现对多点触控的了解,比如 event.getAction() //获取触控动作比如ACTION_DOWN event.getPointerCount(); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕 event.getPointerId(nID); //对于每个触控的点的细节,我们可以通过一个循环执行getPointerId方法获取索引 event.getX(nID); //获取第nID个触控点的x位置 event.getY(nID); //获取第nID个点触控的y位置 event.getPressure(nID); //LCD可以感应出用户的手指压力,当然具体的级别由驱动和物理硬件决定的 event.getDownTime() //按下开始时间 event.getEventTime() // 事件结束时间 event.getEventTime()-event.getDownTime()); //总共按下时花费时间 有关Android多点触控的更详细技术由于目前兼容性和固件问题android123将会在以后的内容中详细讨论,这里给大家起到抛砖引玉的作用。
android.os.Debug调试工具使用方法 Android开发技术
在Android软件开发中最终的性能测试和调试显得至观重要,今天Android123和大家一起讨论下Google送给我们的android.os.Debug类,使用起来比较简单,我们先导入 import android.os.Debug这个包。 在需要开始跟踪的地方加入 Debug.startMethodTracing(“/sdcard/cwj”); 最终在停止调试的地方加入 Debug.stopMethodTracing(); 最终在sdcard上生成的cwj文件我们可以用sdk\tools中的traceview来查看运行的结果。
Android Drawable叠加处理方法 Android开发技术
大家可能知道Bitmap的叠加处理在Android平台中可以通过Canvas一层一层的画就行了,而Drawable中如何处理呢? 除了使用BitmapDrawable的getBitmap方法将Drawable转换为Bitmap外,今天Android123给大家说下好用简单的LayerDrawable类,LayerDrawable顾名思义就是层图形对象。下面直接用一个简单的代码表示: Bitmap bm = BitmapFactory.decodeResource(getResources(),R.drawable.cwj); Drawable[] array = new Drawable[3]; array[0] = new PaintDrawable(Color.BLACK); //黑色 array[1] = new PaintDrawable(Color.WHITE); //白色 array[2] = new BitmapDrawable(bm); //位图资源 LayerDrawable ld = new LayerDrawable(array); //参数为上面的Drawable数组 ld.setLayerInset(1, 1, 1, 1, 1); //第一个参数1代表数组的第二个元素,为白色 ld.setLayerInset(2, 2, 2, 2, 2); //第一个参数2代表数组的第三个元素,为位图资源 mImageView.setImageDrawable(ld); 上面的方法中LayerDrawable是关键,Android开发网提示setLayerInset方法原型为public void setLayerInset (int index, int […]
AsyncTask对比Thread加Handler Android开发技术
很多网友可能发现Android平台很多应用使用的都是AsyncTask,而并非Thread和Handler去更新UI,这里Android123给大家说下他们到底有什么区别,我们平时应该使用哪种解决方案。从Android 1.5开始系统将AsyncTask引入到android.os包中,过去在很早1.1和1.0 SDK时其实官方将其命名为UserTask,其内部是JDK 1.5开始新增的concurrent库,做过J2EE的网友可能明白并发库效率和强大性,比Java原始的Thread更灵活和强大,但对于轻量级的使用更为占用系统资源。Thread是Java早期为实现多线程而设计的,比较简单不支持concurrent中很多特性在同步和线程池类中需要自己去实现很多的东西,对于分布式应用来说更需要自己写调度代码,而为了Android UI的刷新Google引入了Handler和Looper机制,它们均基于消息实现,有事可能消息队列阻塞或其他原因无法准确的使用。 Android开发网推荐大家使用AsyncTask代替Thread+Handler的方式,不仅调用上更为简单,经过实测更可靠一些,Google在Browser中大量使用了异步任务作为处理耗时的I/O操作,比如下载文件、读写数据库等等,它们在本质上都离不开消息,但是AsyncTask相比Thread加Handler更为可靠,更易于维护,但AsyncTask缺点也是有的比如一旦线程开启即dobackground方法执行后无法给线程发送消息,仅能通过预先设置好的标记来控制逻辑,当然可以通过线程的挂起等待标志位的改变来通讯,对于某些应用Thread和Handler以及Looper可能更灵活。
Android多人项目开发指导 Android开发技术
很多新的公司招聘了多个开发人员一起完成自己的Android项目开发,这里Android123就分工和开发模式以及部分实现细节给大家说下大概的多人开发分配。 1. 很多公司可能需要一个CAO架构出项目的各个细节用UML图表示,参照传统的开发模式可能类似于一些人写公共代码,比如I/O、相关的文件系统、数据库、网络通讯,部分完成UI相关的控件子类化和一部分的核心功能实现,这里更类似于MVC来实现所有的细节。 2. 目前就常规的中小型项目而言,使用SVN管理项目更清晰明了,公司已经假设好SVN服务器来管理整个项目的代码。 3. 模块的分工,这里我们给大家一些典型的方法,比如package名上使用类似 provider、util、data、view、model,由不同的人负责完成。 4. 项目的性能测试,对于Android开发要比iPhone麻烦的多,由于设备的性能、分辨率和固件的差异,可能导致软件运行的异常,这里我们推荐大家使用官方原版固件进行测试,第三方的固件存在很多类似“优化”这样的情况,可能对于软件的调试产生了很多的问题,同时手机尽量干净,后台不要运行太多任务,观察内存和CPU的执行,这里参考android.os.Debug和traceview的使用方法。 5. 异常处理,很多情况软件可能遇到Force Close的尴尬情况,FC和ANR的出现大大降低了用户体验,这里我们可能通过对代码更多的try和catch来防止OOM或Thread同步导致的问题。 6. 发布测试,对于软件发布时还要考虑用户体验度,删除不必要的permission,不要让用户感觉一个手电筒软件就有发送短信和拨打电话以及访问联系人的权限出现,同时尽量不要包含广告客户端,广告客户端可能是导致用户泄露隐私,影响系统运行效率,占用GPRS或3G上网流量等问题,对于靠广告作为盈利模式的软件可以目前考虑放弃或者说不适合竞争。 对于常规的中小型项目而言,遵循以上6点可以应付90%的问题,当然还有10%可能是长期的维护,分析用户的反馈和评论以及细节的调整问题,总而言之要考虑用户的感受,做软件要迎合不同年龄和人群,比如很多软件对于MM或非IT类人士可能不理解如何使用的,可以考虑推迟等等。
Android缩略图类源代码 Android开发技术
Android 2.2开始新增的缩略图类ThumbnailUtils的主要方法是静态的,对于Android 2.2或API Level8以下的工程可以直接使用,本类相对于我们常规的缩略图类考虑更周全,除了尺寸比例优化外,针对OOM的内存管理方面有更周全的处理方式,完整代码如下,使用方法和介绍请查看 ThumbnailUtils – Android2.2新增类 一文 public class ThumbnailUtils { private static final String TAG = "ThumbnailUtils"; /* Maximum pixels size for created bitmap. */ private static final int MAX_NUM_PIXELS_THUMBNAIL = 512 * 384; private static final int MAX_NUM_PIXELS_MICRO_THUMBNAIL = 128 * 128; private static final int UNCONSTRAINED = -1; /* […]
intent调用代码总结二 Android开发技术
很多网友在看完inent调用代码总结后再次贡献出很多实用的方法,这里Android123总结出剩余的一些,当然熟悉Intent机制的网友可能发现无非就是对Action和Category和Type加上附加的类型,程序通过UriMatch或Intent-filter进行判断来处理,原理比较简单这里Android开发网给出一些新的,代码如下: 进入联系人界面 Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);intent.setData(People.CONTENT_URI);startActivity(intent); 查看某个联系人,当然这里是ACTION_VIEW,如果为选择并返回action改为ACTION_PICK,当然处理intent时返回需要用到startActivityforResult Uri personUri = ContentUris.withAppendedId(People.CONTENT_URI, ID);//最后的ID参数为联系人Provider中的数据库BaseID,即哪一行 Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(personUri);startActivity(intent); 选择一个图片 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*");startActivityForResult(intent, 0); 调用Android设备的照相机,并设置拍照后存放位置 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/cwj", android123 + ".jpg"))); //存放位置为sdcard卡上cwj文件夹,文件名为android123.jpg格式startActivityForResult(intent, 0); 搜索指定package name在market上,比如搜索com.android123.cwj的写法如下 Uri uri = Uri.parse("market://search?q=pname:com.android123.cwj"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);
反射在Android开发中的利弊 Android开发技术
由于Android 2.2的推出,很多新的API加入导致很多项目移植需要考虑使用Java的反射机制Reflection来动态调用,动态调用的好处就是不需要使用引用文件,直接通过JDK中声明好的方法直接调用,本身原理基于JVM的,从Java 1.5开始支持,原理上就是根据类名而不实例化对象的情况下,获得对象的方法或属性而直接调用。 Android开发时反射能帮助我们多少? 1. 有些网友可能发现Android的SDK比较封闭,很多敏感的方法常规的用户无法编译,我们如果翻看了代码直接在反射中声明动态调用即可。比如很多internal或I开头的AIDL接口均可以通过反射轻松调用。 2. 反射对于Android123来说更重要的是考虑到应用的兼容性,我们目前主要兼容从Android 1.5到2.2的项目,API Level从3到8可以方便的扩充,调用前我们预留一个标志位声明该API的最低以及最高的API Level为多少可以调用。 3. 对于调试Java的反射是功臣了,在Logcat中我们可以看到出错的地方肯定有类似java.lang.reflect.XXX的字样,这种自检机制可以帮助我们方便的调试Android应用程序。 反射的缺点有哪些? 1. 因为是动态执行的,效率自然没有预编译时引用现有的库效率高,就像平时我们Win32开发时,可以不用h文件,直接通过GetProcAddress一样去动态获取方法的地址。当然效率要根据复杂程度而决定,一般稍微复杂的处理性能损失可能超过20%,对于一些复杂的涉及Java自动类型转换判断,执行时间可能是直接引用的上千倍,所以最终我们调试时必须考虑性能问题。 2. 因为反射是动态的,所以需要处理很多异常,不然Dalvik崩溃出Force Close的概率会大很多,很简单的一个反射就需要至少3个异常捕获,本身try-catch效率就不是很高,自然进一步影响运行效率,对于Android开发我们必须考虑这些问题。 3. 反射因为导致代码臃肿,自然稍微复杂的几个方法实用反射将会导致代码可读性和维护性降低,如果很抽象的调用Android开发网强烈不推荐这种方法。 最后要说的是Reflection并不是Java的专利,微软的.Net也同样支持,同时更多的动态语言如Ruby等均支持这一特性。
Android内存管理-SoftReference的使用 Android开发技术
很多时候我们需要考虑Android平台上的内存管理问题,Dalvik VM给每个进程都分配了一定量的可用堆内存,当我们处理一些耗费资源的操作时可能会产生OOM错误(OutOfMemoryError)这样的异常,Android123观察了下国内的类似Market客户端设计,基本上都没有采用很好的内存管理机制和缓存处理。 如果细心的网友可能发现Android Market客户端载入时,每个列表项的图标是异步刷新显示的,但当我们快速的往下滚动到一定数量比如50个,再往回滚动时可能我们看到了部分App的图标又重新开始加载,当然这一过程可能是从SQLite数据库中缓存的,但是在内存中已经通过类似SoftReference的方式管理内存。 在Java中内存管理,引用分为四大类,强引用HardReference、弱引用WeakReference、软引用SoftReference和虚引用PhantomReference。它们的区别也很明显,HardReference对象是即使虚拟机内存吃紧抛出OOM也不会导致这一引用的对象被回收,而WeakReference等更适合于一些数量不多,但体积稍微庞大的对象,在这四个引用中,它是最容易被垃圾回收的,而我们对于显示类似Android Market中每个应用的App Icon时可以考虑使用SoftReference来解决内存不至于快速回收,同时当内存短缺面临Java VM崩溃抛出OOM前时,软引用将会强制回收内存,最后的虚引用一般没有实际意义,仅仅观察GC的活动状态,对于测试比较实用同时必须和ReferenceQueue一起使用。 对于一组数据,我们可以通过HashMap的方式来添加一组SoftReference对象来临时保留一些数据,同时对于需要反复通过网络获取的不经常改变的内容,可以通过本地的文件系统或数据库来存储缓存,希望给国内做App Store这样的客户端一些改进建议。
Android控件TextProgressBar进度条上显文字 Android开发技术
Android系统的进度条控件默认的设计的不是很周全,比如没有包含文字的显示,那么如何在Android进度条控件上显示文字呢? 来自Google内部的代码来了解下,主要使用的addView这样的方法通过覆盖一层Chronometer秒表控件来实现,整个代码如下 public class TextProgressBar extends RelativeLayout implements OnChronometerTickListener { public static final String TAG = "TextProgressBar"; static final int CHRONOMETER_ID = android.R.id.text1; static final int PROGRESSBAR_ID = android.R.id.progress; Chronometer mChronometer = null; ProgressBar mProgressBar = null; long mDurationBase = -1; int mDuration = -1; boolean mChronometerFollow = […]
Android平板开发注意事项 Android开发技术
很多时候,我们可能需要考虑Android平板开发时需要注意问题,随着Galaxy Tab、Dell streak等产品的出现,未来Android平板可能将比iPad更具价格优势,至少品牌和定位将会更丰富。Android123今天就来和大家一起谈谈平板gPad相关的开发技术和注意事项。 目前Android 2.2 Froyo对平板的支持度不是很好,目前Google正在着手处理3.0中针对平板电脑的支持,未来将于2011年初有多款平板电脑上市,我们平时处理界面时尽量使用不依赖设备的,比如常规的图片使用dip这样的单位,文字使用sp,而对于px这样的应该尽量少用。对于简单的素材尽可能的大一些,但对于缩小时不能有严重的失真,这点Google Android似乎没有Symbian先进,没有使用svg这样的矢量方法解决,但是给我们提供的9patch方法来拉伸一些简单图形还是很有效的。 对于布局来说尽量使用相对布局和线性布局,平板的分辨率可能使用1024×576等等的非常规分辨率,处理背景图片时要格外注意,对于控件自绘来说计算好相对位置是十分关键的,我们可以在创建Android AVD的同时设置好类似平板的分辨率,看看应用的运行效果。 平板很多低端的可能没有GSM模块,无法拨打电话或GPRS等数据链接,我们应用在调用某些API时要做到异常处理,比如IMSI的获取。我们无需坐等Android 3.0或3.5的自然支持,经过简单的兼容性设计处理可以很好的让你的应用兼容更大的设备显示。
Android自绘GridView控件 Android开发技术
Android为我们提供了一个很好用的网格控件GridView,它的另外一种实现Google在提供PSDK时包含了一个简单的例子,大家一起来看看吧: 对于还不熟悉Android平台控件子类化的网友可以看看其具体实现的方法,主要是构造时提供了初始化资源、计算控件的尺寸和位置measure相关的处理,大家本次需要注意的是这个固定的Gird是从ViewGroup派生,没有实现onDraw,注意下面的onLayout方法,完整代码如下 public class FixedGridLayout extends ViewGroup { int mCellWidth; int mCellHeight; public FixedGridLayout(Context context) { super(context); } public FixedGridLayout(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes( attrs, R.styleable.FixedGridLayout); mCellWidth = a.getDimensionPixelSize( R.styleable.FixedGridLayout_cellWidth, -1); mCellHeight = a.getDimensionPixelSize( R.styleable.FixedGridLayout_cellHeight, -1); a.recycle(); } public void setCellWidth(int px) { […]
使用OpenGL开发一个指南针 Android开发技术
在Android设备中具备了很多新的特性,比如各种感应器,GL图形库支持。在大部分Android设备中都有磁力感应器,相对于重力感应而言它可以感应出方向,今天Android123就以Google的Samples的指南针例子和大家说下OpenGL的指南针的实现。 public class CompassActivity extends Activity implements Renderer, SensorEventListener { private GLSurfaceView mGLSurfaceView; //GL View private SensorManager mSensorManager; private float[] mGData = new float[3]; private float[] mMData = new float[3]; private float[] mR = new float[16]; private float[] mI = new float[16]; private FloatBuffer mVertexBuffer; private FloatBuffer mColorBuffer; private ByteBuffer mIndexBuffer; private float[] mOrientation […]
Android数组排序常见方法 Android开发技术
Android的数组排序方式基本上使用了Sun原生的Java API实现,常用的有Comparator接口实现compare方法和Comparable接口的compareTo方法,我们对于一个数组列表比如ArrayList可以通过这两个接口进行排序和比较,这里Android123给大家一个例子 private final Comparator cwjComparator = new Comparator() { private final Collator collator = Collator.getInstance(); public final int compare(Object a, Object b) { CharSequence a = ((Item) a).sName; CharSequence b = ((Item) b).sID; return collator.compare(a, b); } }; 我们的ArrayList对象名为mList,则执行排序可以调用方法 Collections.sort(mList, cwjComparator);
Android蓝牙控制之2.X或以上 Android开发技术
Android从2.0开始包含了完整的蓝牙组件,有关Android平台上的bluetooth控制常见的运行在API Level至少为5的代码如下: private BluetoothAdapter mAdapter = null; 开启蓝牙 if (!mAdapter.isEnabled()) { Intent cwj = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivity(cwj); } 设置可发现状态 Intent android123 = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); android123.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 500); //Android开发网提示这里为设置搜索超时500ms startActivity(android123); 本例使用的是Google推荐的通过Intent和Action方式调用系统的蓝牙宿主程序来控制蓝牙的开关,无需permission也可以很好的处理,希望未来Google应该在GPS控制上也提供类似的方法
Zipalign使用方法-SDK中的APK文件优化工具 Android开发技术
在Android SDK中包含了一个工具名为Zipalign,它可以优化你的APK程序包,我们都知道APK的MIME其实就是一个Zip压缩文件,通过Zipalign可以让你的应用程序运行更快,Android123猜测从原理上来讲应该是优化Zip文件的解压速度,毕竟这个工具的文件名为zip对齐。 在Android平台中,数据文件存储在apk文件中,可以多进程的访问,如果你开发过Win32可能知道程序的粒度对齐问题,不错虽然不是PE格式的文件,在Zip中一样,资源的访问可以通过更好的对其优化,而zipalign使用了4字节的边界对齐方式来影射内存,通过空间换时间的方式提高执行效率。下面Android开发网给大家一个例子来看下zipalign使用的例子: zipalign位于android sdk的tools文件夹下面,如果你使用windows操作系统可以通过cmd来执行它: 完整的命令行说明为 E:\android-sdk-windows\tools>zipalign.exe Zip alignment utilityCopyright (C) 2009 The Android Open Source Project Usage: zipalign [-f] [-v] <align> infile.zip outfile.zip zipalign -c [-v] <align> infile.zip <align>: alignment in bytes, e.g. ‘4’ provides 32-bit alignment -c: check alignment only (does not modify file) -f: overwrite existing […]
Android Widget开发模板 Android开发技术
Android上的Widget使用了Java语言开发比W3C的Widget运行效率提高了不少,可以做更多的事情调用系统的API,除了UI上的限制外,我们可以考虑帮助系统完善一些appWidget,Android123给出大家一个开发Widget的模板。 public class cwjWidget extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { context.startService(new Intent(context, UpdateService.class)); //这里创建一个服务,防止出现等待超时对话框 } public static class UpdateService extends Service { //这个内部的服务我们推荐新开一个线程操作一些容易阻塞的情况,比如网络下载等等 @Override public void onStart(Intent intent, int startId) { RemoteViews updateViews = buildUpdate(this); ComponentName thisWidget = new ComponentName(this, cwjWidget.class); AppWidgetManager manager = AppWidgetManager.getInstance(this); […]
Android开发者应该保持以下特质 Android开发技术
作为Android平台上的开发可能来看算是比较简单易学的,我们对于开发一些应用来说应该以量少质高的方式深入,目前Android Market充斥着大量重复而又低劣的应用,如何在众多软件中脱颖而出呢? 1. 用户群定位 – 目前我们要考虑软件是给什么样的人用的,操作人员的技术是什么,并不是所有的用户都是开发者理解很多专业术语。 2. 用户体验度 – 好的UI设计,尽量不要出现广告除了影响美观,浪费流量外还浪费屏幕资源,电池消耗等毕竟多开了一个Ad线程不是吗? 简单易用,不是每个人都是专家。 3. 严格测试 – 对于市面上很多软件对于版本升级或数据操作的可靠性不敢恭维,国内的大多数软件仍然存在着很多测试不充分出现的问题。 4. 注重反馈 – 很多地方我们的自己的测试人员可能无法发现有些问题,也许是因为机型或固件的问题造成的,所以软件应该提供一定的联系方式。 Android123推荐新手应该遵循 1. 深读SDK文档 2. 深读SDK的APIDemo和Samples 3. 掌握GIT开源代码 4. 多了解Android开源项目,学习别人的手法写程序。 10月5日我们将开始讨论各项Android开发中的具体技术,国庆还望各位开发者放松下来。
Android屏幕截图之View方法 Android开发技术
很多网友可能发现Android并没有提供屏幕截图ScreenShot的方法,了解Linux的网友可能知道直接读取/dev/graphics/fb0即可来实现framebuffer,当然了对于自己的View实现一些绘图或子类化的技术时可以不用系统级这样的方法,我们可以通过 view.setDrawingCacheEnabled(true); //其中View是你需要截图的的View Bitmap bm = view.getDrawingCache();
Android控件美化Shape你会用吗? Android开发技术
如果你对Android系统自带的UI控件感觉不够满意,可以尝试下自定义控件,我们就以Button为例,很早以前Android123就写到过Android Button按钮控件美化方法里面提到了xml的selector构造。当然除了使用drawable这样的图片外今天Android开发网谈下自定义图形shape的方法,对于Button控件Android上支持以下几种属性shape、gradient、stroke、corners等。 我们就以目前系统的Button的selector为例说下: <shape> <gradient android:startColor="#ff8c00" android:endColor="#FFFFFF" android:angle="270" /> <stroke android:width="2dp" android:color="#dcdcdc" /> <corners android:radius="2dp" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape> 对于上面,这条shape的定义,分别为渐变,在gradient中startColor属性为开始的颜色,endColor为渐变结束的颜色,下面的angle是角度。接下来是stroke可以理解为边缘,corners为拐角这里radius属性为半径,最后是相对位置属性padding。 对于一个Button完整的定义可以为 <?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" > <shape> <gradient android:startColor="#ff8c00" android:endColor="#FFFFFF" android:angle="270" /> <stroke android:width="2dp" android:color="#dcdcdc" /> <corners android:radius="2dp" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" […]

Android应用Icon大小在不同分辨率下定义 Android开发技术
对于Android平台来说,不同分辨率下Icon的大小设计有着不同的要求,对于目前主流的HDPI即WVGA级别来说,通常hdpi的应用icon大小为72×72,而标准的mdpi即hvga为48×48,对于目前HTC和Motorola推出的一些QVGA的使用了ldpi,图标为32×32,常见的Android图标大小设计规范如下表所示: Launcher 36 x 36 px 48 x 48 px 72 x 72 px Menu 36 x 36 px 48 x 48 px 72 x 72 px Status Bar 24 x 24 px 32 x 32 px 48 x 48 px Tab 24 x 24 px 32 x 32 px 48 x 48 px […]
控制Android LED灯颜色代码 Android开发技术
很多Android手机上都配有LED灯,比如HTC的手机在充电、新来短信等时候都会有响应的指示,其实很简单的这都是NotificationManager的一些参数而已,下面Android123给大家说下如何通过代码控制LED灯的闪烁,因为有些机型没有LED灯或颜色种类较少,发布时需要真机观察。 final int ID_LED=19871103; NotificationManager nm=(NotificationManager)getSystemService(NOTIFICATION_SERVICE); Notification notification = new Notification(); notification.ledARGB = 0xFFFFFF; //这里是颜色,我们可以尝试改变,理论上0xFF0000是红色,0x00FF00是绿色 notification.ledOnMS = 100; notification.ledOffMS = 100; notification.flags = Notification.FLAG_SHOW_LIGHTS; nm.notify(ID_LED, notification); nm.cancel(ID_LED);

