今天我们就Android开发中的一些设计模式做一些基础性的掌握,在上一次的 Android开发之Java设计模式入门篇 中我们提到了一些有关 Java基础内容,本次就Android项目的架构设计相关内容做分析: 1. 静态工厂方法 静态工厂方法可以算是工厂方法加单例模式的整合在Android平台上,由于Android的Context可以很好的传递实例,静态工厂方法可以提到传统的类构造器,对于一些逻辑的服务提供类可以考虑这样的设计,比如文件下载、图片裁剪等操作。 2. Java的类访问权限 对于程序的可靠性而言,成员变量尽量私有,通过暴漏公开的方法来访问这些私有成员,提供类似getXXX和setXXX这样的方法,不仅是Java,这点C#对于属性的操作概念在Dot Net上已经深入人心,好处就是可以阻止继承后的访问换乱问题。 3. 使用枚举替代常量 Java在JDK 1.5开始加入了enum枚举类,相对于常规的final int这样的定义一些常量更简单安全,毕竟常量是一堆类似整形的数值,打印起来没有过多的意义,枚举对于继承后访问的清晰度可以很好的杜绝隐患发生。 4. 使用列表优先于数组 Java的集合类很方便,使用List类的列表在开销上比Object [ ] 这样的数组大,但是对于泛型的支持而言更好用强大。也可以避免一些不必要的错误,比如 cwjObject [] obj= new int[1]; obj[1] = "android开发网测试"; //这样会在运行时抛出类似ArrayStoreException这样的异常。 而使用列表则为: List<cwjObject> obj=new ArrayList<int>(); obj.add("android123测试"); // 由于传入列表的是字符串,和构造时类型的int不同,在编译时就提示错误,可以避免一些不必要的情况发生。 5. Java的foreach代替for Java的foreach仍然使用for来写,这点和C#直接用foreach关键字有点不同,但是使用方法是一样的,除了更简洁外,其实foreach比传统的for更加优化,比如传统的for第二个限制位,一般访问属性或方法,比如说 […]
August 2013
Android面试题,看看你基础如何? Android开发技术
近期很多公司招聘Android程序员,就一些常见的Android面试基础题做下总结,看看你能做出多少道? 1. Intent的几种有关Activity启动的方式有哪些,你了解每个含义吗? 这里Android123提示大家,Intent的一些标记有FLAG_ACTIVITY_BROUGHT_TO_FRONT 、FLAG_ACTIVITY_CLEAR_TOP、FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET、FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS、FLAG_ACTIVITY_MULTIPLE_TASK和FLAG_ACTIVITY_NEW_TASK 等。每种含义大家看SDK文档和具体跑下这样你的记忆会更深刻些。 2. Activity和Task的启动模式有哪些? 每种含义是什么? 有关在AndroidManifest.xml中的android:launchMode定义,主要有standard、singleTop、singleTask和singleInstance,同时对于android:taskAffinity这些问题大家也要了解,Android开发网在以前的文章中讲过,不过很多开发者仍然不是很清楚,这些基础问题我们以后仍然会再次总结。 3. 通过Intent传递一些二进制数据的方法有哪些? 1). 使用Serializable接口实现序列化,这是Java常用的方法。 2). 实现Parcelable接口,这里Android的部分类比如Bitmap类就已经实现了,同时Parcelable在Android AIDL中交换数据也很常见的。 4. 能说下Android应用的入口点吗? 在Google的虚拟机中Application实例中已经实现了main方法,有关具体的Application介绍可以参考 Android程序的入口点是什么,不是Main()吗 5. Java基础问题,说说HashSet和HashTable的区别? 这个相信Java程序员都知道HashSet相对于HashMap就是不能存放重复的数据,对于HashTable来说,存放的数据不能出现key或value为null这样的情况。 6. Java基础问题,用Java的集合类写下广度优先搜索. 这个属于基础数据结构问题,通过队列处理一层一层,相对于深度优先的栈处理方式来说更实用一些。 7. Android都有哪些XML解析器,都熟练掌握吗? 这里XmlPull、SAX和DOM相信做过Web开发的都已经滚瓜烂熟了。 8. SQLite支持事务吗? 添加删除如何提高性能? SQLite作为轻量级的数据库,比MySQL还小,但支持SQL语句查询,提高性能可以考虑通过原始经过优化的SQL查询语句方式处理。 9. Android Service和Binder、AIDL你都熟练吗? 作为Android重要的后台服务,这些每个Android开发者都应该掌握,这也算是和Java […]
设置Activity大小不再全屏原理 Android开发技术
如何设置Activity的大小,让你的窗口看起来不再是全屏的。有些网友可能知道通过主题比如Theme.Dialog来实现,不过今天Android123告诉大家设置Activity不再全屏显示的原理。Android Theme也主要是通过定义Style来实现的,实现的原理大家可以直接看Android Framework中的定义,今天给一种更简单,但相对灵活的方法,比如不要Theme.Dialog中的边框,下面就一起来看下自定义Activity大小的实现方法。 1. 创建一个样式文件到你的工程,保存在在res/values/styles.xml,这里文件名不能随便修改,内容为,注意保存时使用UTF-8编码。 <?xml version="1.0" encoding="utf-8"?> <resources> <style name="Theme.Android123" parent="android:style/Theme.Dialog"> <item name="android:windowBackground">@drawable/bg</item> </style> </resources> 2. 上面我们定义的主题风格为Theme.Android123,父风格仍然从Theme.Dialog实现,但我们自定义了背景,位置在drawable/bg中,这里我们创建一个bg.xml文件放到res/drawable文件夹中,bg.xml的内容为 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:Android="http://schemas.android.com/apk/res/android"> <padding android:left="15dp" android:top="15dp" android:right="15dp" android:bottom="15dp" /> <stroke android:width="3dip" color="#000000" /> <corners android:radius="5dp" /> <solid android:color="#ffffff" /> </shape> 里面我们定义了一个shape对象,实现背景drawable形状,其中padding代表距离边框,这里我们设置了左、上、右、下四个位置的间距。stroke可以制造出一些3D立体效果,corners是四个角,radisu属性可以设置半径,值越大越圆滑,根据运行效果你可以微调,最后soild是填充颜色,这里我们用了ffffff表示纯白。 3. 最后在androidmanifest.xml中,在你的activity节点加一个 android:theme属性,值为@style/Theme.Android123 即可。
控制软键盘显示和隐藏 Android开发技术
如何用Java代码控制Android软键盘的显示和隐藏呢? 过去我们在 EditText中显示隐藏Android输入法窗口 提到过,部分网友可能没有太注意。 InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);imm.hideSoftInputFromWindow(myEdit.getWindowToken(), 0); //myEdit是你的EditText对象 下面就可以通过下面方法可以恢复显示 boolean showSoftInput(View view, int flags, ResultReceiver resultReceiver) boolean showSoftInput(View view, int flags) void showSoftInputFromInputMethod(IBinder token, int flags)
Live Wallpaper动态壁纸开发 Android开发技术
对于Android 2.1来说Live Wallpapers动态壁纸的加入为Android桌面加入了更好的动态效果。如何开发一个Android动态桌面呢? 下面Android123给大家一个详细的步骤创建属于你自己的Live Wallpaper吧。 1. 首先我使用Eclipse创建一个标准的Android工程这里package name我们使用cn.com.android123.cwj,然后进入工程的/res/文件夹,删除layout这个文件夹,当然里面的main.xml也会被删除的,对于Live Wallpaper来说传统的布局文件是不需要的。 2. 类似AppWidget一样,我们可以加入动态壁纸的设置界面,我们在/res/文件夹中新建一个名为xml的文件夹,新建一个utf8编码的xml文件,名为livewallpaper.xml,内容为 <?xml version="1.0" encoding="utf-8"?> <wallpaper xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="cn.com.android123.cwj.LiveWallpaperSettings" android:thumbnail="@drawable/icon"/> 这里我们可以看到上面的节点名为wallpaper,而设置的界面为 cn.com.android123.cwj.LiveWallpaperSettings 这个Activity,而在添加动态壁纸时显示图标为/res/drawable/icon 这个文件,同时我们再创建一个xml文件用于LiveWallpaperSettings这个Activity的布局,我们起名为livewallpaper_settings.xml内容为 <?xml version="1.0" encoding="utf-8"?><PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="@string/livewallpaper_settings" android:key="livewallpaper_settings"> <ListPreference android:key="livewallpaper_testpattern" android:title="标题" android:summary="简单描述" android:entries="@array/livewallpaper_testpattern_names" android:entryValues="@array/livewallpaper_testpattern_prefix"/> <CheckBoxPreference android:key="livewallpaper_movement" android:summary="动态描述" android:title="动态标题" android:summaryOn="动态测试" android:summaryOff="静止测试"/></PreferenceScreen> 3. 创建一个名为LiveWallpaper的类作为动态壁纸的主类,从WallpaperService父类继承,这里我们可以像写标准Android服务那样开发,代码为 public class LiveWallpaper extends WallpaperService{ public static final String SHARED_PREFS_NAME = "livewallpapersettings"; @Override public void onCreate() { super.onCreate(); } @Override public void onDestroy() { super.onDestroy(); } @Override public Engine onCreateEngine() { return new TestPatternEngine(); } […]

ListView的右边滚动滑块启用方法 Android开发技术
很多开发者不知道ListView列表控件的快速滚动滑块是如何启用的,这里Android开发网告诉大家,辅助滚动滑块只需要一行代码就可以搞定,如果你使用XML布局只需要在ListView节点中加入 android:fastScrollEnabled="true" 这个属性即可,而对于Java代码可以通过myListView.setFastScrollEnabled(true); 来控制启用,参数false为隐藏。 还有一点就是当你的滚动内容较小,不到当前ListView的3个屏幕高度时则不会出现这个快速滚动滑块,同时Android123大家该方法仍然是AbsListView的基础方法,可以在ListView或GridView等子类中使用快速滚动辅助。
Neither user nor current process错误 Android开发技术
有时候我们可能在Androidmanifest.xml中声明了某些权限,比如说 android.permission.SET_TIME 可能出现ERROR/AndroidRuntime(3759): java.lang.SecurityException: Neither user 10024 nor current process has android.permission.SET_TIME 这样的错误,10024是系统的UID,所以如果你没有系统的UID使用Platform的APK签名是没有权限使用相关方法的。 对于这种情况考虑 1.拥有Root权限,这里Android123推荐大家发掘自己的潜能,寻找0day漏洞。 2.设置你APK为UID和system的一样,但必须找到你当前固件平台的签名,参考 platform.x509.pem和platform.pk8的用处
AsyncTask实现原理和内部代码 Android开发技术
Android从1.5开始引入了AsyncTask这个类,可以帮助我们解决线程和界面刷新问题,主要是对Thread+Handler这样的封装,但在设计模式和代码维护方面都有不错的表现。对于AsyncTask的实现原理和内部的代码如何实现Android123一起和大家分享,早在2008年时Google推出了一个示例应用叫PhotoStream来演示UI在多线程网络慢速I/O下的刷新问题,里面的线程构造使用的正是AsyncTask的雏形,由于内部使用Java 1.5的并发库比普通初级Android开发者编写的Thread+Handler稳定很多,下面我们就android.os.AsyncTask的实现 public abstract class AsyncTask<Params, Progress, Result> { private static final String LOG_TAG = "AsyncTask"; private static final int CORE_POOL_SIZE = 5; //线程池数量 private static final int MAXIMUM_POOL_SIZE = 128; //线程池中最大线程数 private static final int KEEP_ALIVE = 1; private static final BlockingQueue<Runnable> sWorkQueue = new LinkedBlockingQueue<Runnable>(10); //使用并发库的阻塞队列初始时保存10个Runnable对象 private static […]
IntentService实现原理及内部代码 Android开发技术
很多网友可能发现Android中除了Service还有一个IntentService,他们之间到底有哪些区别呢? 在继承关系上而言IntentService是Service的子类,内部实现的代码中涉及到一些Android入门开发者不了解的Looper,Android123在早期的文章中已经说明他们的用法,这里不再赘述,有关原理大家可以看源码实现如下: public abstract class IntentService extends Service { private volatile Looper mServiceLooper; private volatile ServiceHandler mServiceHandler; //一个Handler封装了Looper对象 private String mName; private boolean mRedelivery; private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { onHandleIntent((Intent)msg.obj); stopSelf(msg.arg1); } } public IntentService(String name) […]
PendingIntent实现原理和代码 Android开发技术
对于Android的Intent相关内容,可能部分初级Android开发者不知道PendingIntent是干什么的? 对于Notification和SmsManager中的sendMessage以及AlarmManager中的set这些方法中均有PendingIntent,到底PendingIntent和Intent有哪些不同呢? 一、Intent 通常Android中的Intent位于 android.content.Intent的实现比较简单,直接从Object类实现,内部主要是保存了一些String或Int、轻量级的数组,提供了一些方法主要是赋值或取值。 二、PendingIntent 这里和Intent的不同分在了android.app.PendingIntent这个包中,属于app层而不是数据存储封装的content层,从首段我们看到了PendingIntent是针对将要发生的事情,比如短信发送时,本对象用于跟踪未来短信的接收情况,主要是短信回执报告和发送成功或失败,因为GSM通讯到RIL再到移动基站的过程很漫长,通过开一个Thread等待对于我们的应用是比较麻烦和耗资源,而Android的框架层的TelephonyManager底层远程服务会跟踪,最终通过PendingIntent来跟踪,有关具体实现原理和代码如下: public final class PendingIntent implements Parcelable { //实现了Parcelable接口,可以方便的处理二进制数据和用于远程服务的数据交换 private final IIntentSender mTarget; public static final int FLAG_ONE_SHOT = 1<<30; public static final int FLAG_NO_CREATE = 1<<29; public static final int FLAG_CANCEL_CURRENT = 1<<28; public static final int FLAG_UPDATE_CURRENT = 1<<27; […]
HashSet的equals和hashCode重写问题 Android开发技术
通常在Android开发中可以方便的使用Java的集合类,对于HashSet可能部分网友比较陌生,相对于HashMap他们有哪些不同呢? HashSet从名称上看可以理解为Hash+Set,Set集合是不允许元素重复的,所以使用时必须考虑元素的重复问题,一般我们需要重写equals和hashCode来实现内部元素的比较排序等。重写方法比较简单 @Override public boolean equals(Object obj) { if (obj instanceof T) { return obj.equals(T.obj); } return false; } @Override public int hashCode() { return T.hashCode(); }
Android数据库SQLite性能优化技巧 Android开发技术
对于Android使用的数据库而言,官方提供了开源的SQLite,由于支持SQL语言查询底层开源整体性能表现的比较稳定,如果提高你的Android数据库性能? 下面Android开发网就平时用到的技巧和大家分享: 1. 相对于封装过的ContentProvider而言,使用原始SQL语句执行效率高,比如使用方法rawQuery、execSQL的执行效率比较高。 2. 对于需要一次性修改多个数据时,可以考虑使用SQLite的事务方式批量处理,我们定义SQLiteDatabase db对象,执行的顺序为 db.beginTransaction(); //这里处理数据添加,删除或修改的SQL语句 db.setTransactionSuccessful(); //这里设置处理成功 db.endTransaction(); //这句很重要,告诉数据库处理完成了,这时SQLite的底层会执行具体的数据操作。 3. 打好SQL语句的基础,对于查询,以及分配表的结构都十分重要,Android123建议有时间的网友可以查看下SQLite的源码对底层实现加深了解后可以很好的做性能调优。
Concurrent并发库常见问题总结 Android开发技术
对于Android开发者来说掌握Java的concurrent并发库十分重要,本次Android123就并发库的一些常见问题做总结: 1. 原子操作 如果你过去开发过Win32驱动可能发现很多Native API都是有关原子操作的(atomic operation),对于Java来说int、boolean这样的类型是原子的,而long和double就没有那么幸运了。原子操作是什么呢? 比如说Java线程的停止,在早期的JDK中提供了Thread.stop方法,但这个并不是线程安全的,而目前我们停掉一个Java线程都是用一个boolean变量来设置一个标记,你考虑这个boolean标记的改变是通过外部的其他线程,这样产生的同步问题如何解释呢? 这就是原子操作带来的好处,对于Long型我们可以使用java 1.5以后加入的concurrent.atomic的AtomicLong,对于Android来说支持以下原子类型: AtomicBoolean、AtomicInteger、AtomicIntegerArray、AtomicIntegerFieldUpdater<T>、AtomicLong、AtomicLongArray、AtomicLongFieldUpdater<T> 、AtomicMarkableReference<V> 、AtomicReference<V> 、AtomicReferenceArray<E>、AtomicReferenceFieldUpdater<T, V> 和AtomicStampedReference<V> 。 2. 并发库的CopyOnWriteArrayList 对于CopyOnWrite机制可以解决读取频繁,写入较少时的并发效果,有关这方面内容我们在 Android开发之Java并发包集合类性能分析 有过讲解。 3.
WakeLock使用方法示例代码 Android开发技术
Android中提供了一个名为WakeLock的类在android.os.PowerManager.WakeLock中,从名字来看WakeLock是唤醒锁的意思,它可以控制屏幕的背光开关,所以在电源管理类。 WakeLock实例化方法比较简单,因为是系统的远程服务,通过下面的代码来构造 PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "Android123"); //最后一个参数为实例名,可以换成其他的。 wl.acquire(); //唤醒点亮屏幕 //这个期间屏幕将点亮 wl.release(); //恢复屏幕到黑暗 当然Android考虑到安全并不是说开发者有了权限,就可以随意的控制屏幕的背光显示或无,只有通过acquire点亮的背光才能使用release让其关闭背光,如果直接调用release方法关闭屏幕将会产生一个异常。 从Android 2.1 API Level7开始增加了一个判断屏幕是否处于点亮状态可以使用public boolean isScreenOn ()这个方法,代码为 PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);boolean isScreenOn = pm.isScreenOn(); 而对于Android 2.2 API Level为8时增加了一个reboot(),可以重启手机进入恢复模式,同时你需要申请权限 <uses-permission android:name="android.permission.REBOOT"></uses-permission> 来实现,不过Android开发网不保证该方法在所有固件上有效,部分厂商考虑到安全并没有开发这个重启方法。
设置ScrollView滚动条的颜色 Android开发技术
很多开发者在做Android UI时不知道如何设置ScrollView滚动条控件的滑块颜色,其实通过ScrollView的xml布局属性android:scrollbarThumbVertical可以关联一个drawable对象,比如说在ScrollView中我们有 android:scrollbars="vertical" //滚动条是垂直的 android:scrollbarThumbVertical="@drawable/red" //垂直滚动条颜色为red,red可以是一个png的图片或用shape组成的xml图形文件组成的drawable对象。

Android 2.3系统自带高清UI图标下载 Android开发技术
有关Android 2.3系统自带图标素材,原始高清晰PNG透明格式图标这里Android开发网整理如下, 原始PNG格式图标,Android123本地下载 http://down.android123.com/android-icon.rar (1.59MB)
android_asset这个URL详细使用方法 Android开发技术
对于Android项目来说,保存一些额外的资源文件可以通过R.raw或asset,对于一般比较零碎的小文件我们可以放在assets,今天就看下android_asset这个uri,比如 file:///android_asset/cwj.html 这个文件在Java代码访问,那么相对于工程目录为 /assets/cwj.html 中,一般我们用WebView的load方法可以直接载入这个URI,比如说 objWebView.loadUrl("file:///android_asset/cwj.html"); 最后Android123提示大家,主要是这里的文件有1MB的未压缩限制,也就是说未压缩能让Android识别的文件不能超过1MB大小,有关可以查看Asset限制文件大小UNCOMPRESS_DATA_MAX为1MB
Android开发经验谈之应用间数据共享 Android开发技术
对于应用程序之间的数据共享,Android提供了比较灵活的方式,相关的开发经验下面是Android123平时使用的方法。 1. 简单配置文件: SharedPreferences方式存储的配置文件,我们在各个应用间可以通过getSharedPreferences("Android123", Context.MODE_PRIVATE); 这样的方式存储,最后是共享模式,这里使用了私有,而通过全局读、全局写可以让其他的应用访问,通过createPackageContext方法,但是在Android 1.5 以后,共享访问需要相同UID和签名才可以访问。 2. SQLite数据库文件 对于一些较为复杂的配置或数据,在Android平台上我们一般使用SQLite数据库存储,对于共享我们可以提供ContentProvider接口来实现,我们虽然可以获取当前应用的数据库保存位置,通过Context的getDatabasePath(String name)这个方法,由于应用的PackageName比较长可能会发生变动,Android提供了类似Intent的方式来匹配一些Uri,比如说电话拨号为 tel:// 而对于网址可以使用 http:// 对于定做坐标使用geo://,而我们的数据库可以通过UriMatcher类的addURI添加一些Uri,通过隐式Intent方式实现自己的处理方式,具体的大家可以查看短信应用的开源代码 Mms.git 了解。 3. 对于运行中的高性能数据共享 在Android中共享内存方法可以使用Linux底层的mmap方式,对于跨进程访问,使用IPC,当然Android还提供了AIDL远程服务来实现数据绑定访问处理,所以说对于Android Service的开发,一定要记住通过Bind方式来开发,比较典型的有音乐播放器,Music.gif
android.hardware.USB类介绍 Android开发技术
在最新的Android版本中,android.hardware.USB是一个新增类,提供了USB相关事件的插拔,以及状态模式的广播。这里,可以看到USB连接、断开、是否为U盘、ADB模式等等。定义如下 public class Usb { public static final String ACTION_USB_CONNECTED = "android.hardware.action.USB_CONNECTED"; public static final String ACTION_USB_DISCONNECTED = "android.hardware.action.USB_DISCONNECTED"; public static final String ACTION_USB_STATE = "android.hardware.action.USB_STATE"; public static final String USB_CONNECTED = "connected"; public static final String USB_FUNCTION_MASS_STORAGE = "mass_storage"; public static final String USB_FUNCTION_ADB = "adb"; public […]
Android xliff和字符串资源 Android开发技术
很多Android开发者可能会发现部分资源字符串在/res/values/string.xml中包含有类似xliff的节点,Xliff是XML Localization Interchange File Format 的缩写,中文名为XML本地化数据交换格式,对于在Android的资源字符串中,可能会有类似下面的 <xliff:g id="cwj">%1$s</xliff:g> 这里,id我们可以随便定义,后面的%1$s有点像C#中的字符串格式化标志,这里1%表示这是第一个可替换量,如果一个String中有多个需要替换的变量,可以为 <string name="info">开发者<xliff:g id="name">%1$s</xliff:g> 来自 <xliff:g id="company">%2$s</xliff:g> 公司</string> 对于上面的字符串,在工程中我们可以使用String strInfo=getResources().getString(R.string.info,"cwj","android123"); 来拼接,返回一个新的字符串strInfo中。
Android Canvas绘图抗锯齿解决方法 Android开发技术
对于Android来说Canvas一般大量用于自定义View和游戏开发中,对于图形的基础绘制类,提供的drawText、drawBitmap以及drawCircle都需要抗锯齿处理才能让人满意,下面Android123将他们分为两大种情况。 一、包含Paint参数情况时,对于drawText、drawBitmap这样的方法,一般最后一个参数为Paint对象,Paint对象一般用于设置笔刷颜色和大小,同时包含了抗锯齿的方法,比如说objPaint.setAntiAlias(true); 这个方法执行后即可有比较明显的改善。 二、部分方法没有Paint参数,比如说setDrawFilter这个方法,它的参数只有 PaintFlagsDrawFilter对象,我们自己构造一个新的对象,比如说new PaintFlagsDrawFilter(0,Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG)这样就过滤器可以让文本和位图经过圆滑处理。

Android 3.1 USB配件开发之介绍篇 Android开发技术
从Android 3.1开始将支持USB配件连接到Android设备,通过附件通讯协议,同时在Android 2.3.4中通过附加库也可以兼容这些功能,目前可以在Nexus S、Nexus One上进行开发测试,可以实现两种工作模式,分别为Host Mode和Accessory Mode,前者Android设备将作为宿主为USB设备供电,比如连接一个键盘,而Accessory Mode将作为附件模式,这时可能Android设备变成一个辅助的设备,比如作为PC上的手写板,这时PC为Android设备供电,如下图所示: 无论何种模式,Android设备都和连接的USB设备进行类似串口的通讯,对于调试,我们仍然可以使用adb来实现,比如说连接Android设备到PC上,输入 adb tcpip 5555 接着输入 adb connect <device-ip-address>:5555 其中device-ip-address为android设备的ip地址, 如果你的设备是监听USB连接,可以输入 adb usb
Intent调用大全,史上最全的 Android开发技术
//调用浏览器 Uri uri = Uri.parse("");Intent it = new Intent(Intent.ACTION_VIEW,uri);startActivity(it); //显示某个坐标在地图上 Uri uri = Uri.parse("geo:38.899533,-77.036476");Intent it = new Intent(Intent.Action_VIEW,uri);startActivity(it); //显示路径 Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en");Intent it = new Intent(Intent.ACTION_VIEW,URI);startActivity(it); //拨打电话 Uri uri = Uri.parse("tel:10086");Intent it = new Intent(Intent.ACTION_DIAL, uri); startActivity(it); Uri uri = Uri.parse("tel.10086");Intent it =new Intent(Intent.ACTION_CALL,uri);需要添加 <uses-permission id="android.permission.CALL_PHONE" /> 这个权限到androidmanifest.xml //发送短信或彩信 Intent it = new Intent(Intent.ACTION_VIEW); […]
Android驱动大全 Android开发技术
对于开发者来说SDK自带的驱动可以兼容比较基础的设备,比如说HTC Dream、Nexus系列的手机,找到合适的Android驱动并不难,下面Android123列出OEM厂商的官方驱动下载链接, Acer http://www.acer.com/worldwide/support/mobile.html Asus http://support.asus.com/download/ Dell http://support.dell.com/support/downloads/index.aspx?c=us&cs=19&l=en&s=dhs&~ck=anavml Foxconn http://drivers.cmcs.com.tw/ Fujitsu Toshiba http://www.fmworld.net/product/phone/sp/android/develop/ Garmin-Asus https://www.garminasus.com/en_US/support/pcsync/ HTC http://www.htc.com Click on the support tab to select your products/device. Different regions will have different links. Huawei http://www.huaweidevice.com/worldwide/downloadCenter.do?method=list&flay=software&directoryId=20&treeId=0 KT Tech http://www.kttech.co.kr/cscenter/download05.asp for EV-S100(Take) Kyocera http://www.kyocera-wireless.com/support/phone_drivers.htm LGE http://www.lg.com/us/mobile-phones/mobile-support/mobile-lg-mobile-phone-support.jsp Motorola http://developer.motorola.com/docstools/USB_Drivers/ Pantech http://www.isky.co.kr/cs/software/software.sky?fromUrl=index Samsung http://www.samsung.com/us/support/downloads Sharp http://k-tai.sharp.co.jp/support/ SK Telesys http://www.sk-w.com/service/wDownload/wDownload.jsp Sony Ericsson […]
ViewGroup代码示例 Android开发技术
有关Android的ViewGroup的使用例子比较少,早期的Android Home中使用到了这个ViewGroup相对于GridView来说ViewGroup更为灵活,下面是Android中一段经典的示例代码 public class FitCenterFrameLayout extends ViewGroup { public FitCenterFrameLayout(Context context) { super(context); } public FitCenterFrameLayout(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //修改尺寸 final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec); final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec); setMeasuredDimension(width, height); int childWidthSpec = MeasureSpec.makeMeasureSpec(width, […]

Android 3.x屏幕兼容性设计 Android开发技术
对于Android 3.x honeycomb系统来说屏幕的兼容性很重要,这里目前我们就主流的Android 1.5~2.3.4的软件如何兼容Android 3.0有关屏幕分辨率和资源的兼容设计方法如下: 首先设置选择主流的Android 2.2 SDK,API Level为8,如果需要兼容 <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8"/> ,有关layout仍然仅为两种横屏和竖屏,这里Android123再次提醒,大多数的平板在横屏操作上的时间大幅超越竖屏,这点测试时需要注意,设置drawable版本,注意-v6如图所示: 有关其他的细节可以参考 让你的应用兼容Android 3.0系统
Android开发易错点总结 Android开发技术
对于Android程序员来说平时开发Android应用很多地方需要我们注意,下面是Android123通过浏览大部分源码易的地方。 一、数据库的Cursor 对于Android SQLite数据库封装的查询返回对象Cursor来说比较容易出错的有 1. Cursor返回可能为null 如果query返回的Cursor对象为空,执行cursor的任何方法肯定有空指针异常了,这点Android的代码有40%都没有注意到。 2. Cursor返回为0 我们仅仅判断不为空还不行,如果Cursor的对象为0,执行了moveToFirst(); 这样的方法就比较尴尬了,这点Android开发网格外提示大家注意。 3. 遍历Cursor时没有执行moveToFirst(),这样游标的位置就不确定了。 4. Cursor使用完后要手动关闭,cursor.close()这个方法不要忘记了。 5. Cursor的类型获取,比如说getInt和getLong,由于在SQLite中boolean和long型均为SQLite的Integer所以,读取时一定记住转换。 二、新建的service、activity没有在androidmanifest.xml中注册,对于activity还好说,如果是service同时service使用的package name和主程序的package name有出入还记得手动写上相对的包名 三、Parcelable使用时内部类的异常处理,比如内部存储Bitmap对象时,如果Bitmap对象为空就会出现问题了。 有关更多的常见Android开发易错点,Android123会不断完善和总结。

