任何问题请联系WX:uu16853

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

购买更多有优惠!

Android开发之Java虚拟机原理和内存分配 Android开发技术

   开发出高效稳定的Android应用我们不得不需要了解下Java虚拟机的原理和内存分配机制,Android使用的是Google经过优化的Dalvik Java VM。通常情况下Java编译过的代码是一些class文件,通过Java VM的类解析器分析、效验后执行。Java语言和C/C++有着本质区别的就是内存管理上,Java VM有一个垃圾收集清理器GC可以自动的回收内存。   Java虚拟机在执行代码的时候,首先解析Class,查找该类的方法、常量,这些对于常规情况下都编译成二进制的代码保存在jar文件中,而对于Java的反射,VM的类加载器需要动态的查找这些类名,虽然节省了编译时间,但是运行时的查找大大降低运行效率。   对于Android应用来说,手机的RAM相对于PC还小了很多,同时电脑上的主流应用使用的是Visual C++编写,所以对于手机上已经不占优势的硬件来讲使用Java这样的内存大户语言必须严格的了解内存释放有助于提高程序的性能。对于Android的内存释放情况,大家可以在DDMS中的Logcat中看到类似  08:10:18.895: DEBUG/dalvikvm(1281): GC freed 38611 objects / 2097960 bytes in 182ms 这样的语句。可以大概了解你的应用的对象回收情况,如图     Android应用通常情况的运行的RAM占用在20MB左右,对于程序美工我们尽量用代码绘制方式实现,而不是贴图。下面我们一起看下有关内存的使用跟踪: 首先我们在Eclipse的DDMS中找到Devices设备管理,选择需要查看的进程,单击上方的Update head那个绿色的按钮,然后切换到Heap页面,单击Cause GC按钮即可,如图   如果你在左边找不到你应用的进程,可以先在手机上运行你的软件之后即可,同时上面的Update Heap按钮不要忘记,上图中标记为红色的一个都不能少。

设置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 即可。

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 […]

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;     […]

Android游戏开发之旅一 长按Button原理 Android开发技术

  今天Android123开始新的Android游戏开发之旅系列,主要从控制方法(按键、轨迹球、触屏、重力感应、摄像头、话筒气流、光线亮度)、图形View(高效绘图技术如双缓冲)、音效(游戏音乐)以及最后的OpenGL ES(Java层)和NDK的OpenGL和J2ME游戏移植到Android方法,当然还有一些游戏实现惯用方法,比如地图编辑器,在Android OpenGL如何使用MD2文件,个部分讲述下Android游戏开发的过程最终实现一个比较完整的游戏引擎。相信大家都清楚Android Market下载量比较好的都是游戏,未来手机网游的发展相信Android使用的Java在这方面有比iPhone有更低的入门门槛。   对于很多游戏使用屏幕控制一般需要考虑长按事件,比如在动作类的游戏中需要长按发射武器,结合Android Button模型,我们实现一个带图片的Button的长按,为了更清晰的显示原理,Android开发网这里使用ImageButton作为基类   public class RepeatingImageButton extends ImageButton {     private long mStartTime; //记录长按开始    private int mRepeatCount; //重复次数计数    private RepeatListener mListener;    private long mInterval = 500; //Timer触发间隔,即每0.5秒算一次按下        public RepeatingImageButton(Context context) {        this(context, null);    }     public RepeatingImageButton(Context context, AttributeSet attrs) {        this(context, attrs, android.R.attr.imageButtonStyle);    }     public RepeatingImageButton(Context context, […]

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数据库ContentProvider封装原理 Android开发技术

   大家都知道Android数据库使用的是SQLite,但是Google为了给我们简化操作,可以不用经常编写容易出错的SQL语句,直接通过ContentProvider来封装数据的query查询、添加insert、删除delete和更新update,我们就以Android系统的SDK中的例子来给大家简单的说明下吧。  public class NotePadProvider extends ContentProvider {     private static final String TAG = "NotePadProvider";     private static final String DATABASE_NAME = "note_pad.db"; //数据库存储文件名,包含了.db后缀    private static final int DATABASE_VERSION = 2; //数据库版本号,这个是自己定义的,未来扩展数据库时自己可以方便的定义升级规则    private static final String NOTES_TABLE_NAME = "notes"; //表名     private static HashMap<String, String> sNotesProjectionMap;  //常规的Notes    private static HashMap<String, String> sLiveFolderProjectionMap; //LiveFoder内容     […]

APK汉化原理及方法 Android开发技术

  我们继续上次的APK格式文件分析,本次探讨下有关APK汉化技术,其实对于软件汉化一直都属于比较简单的范畴,对于传统Win32程序或者说PE文件而言,代码被编译成为一个二进制的文件中,通过类似section的方式来区分资源,android平台中将代码逻辑和资源文件进行了分离,字符串被放在了一个名为resources.arsc的文件中,我们将一个apk文件修改后缀名为zip,然后解压缩可以看到如下文件。其中高亮部分就是我们需要的文件如图:   相对于传统软件汉化而言,android apk文件的汉化我们不需要脱壳,不需要修改API导入表,几乎仅仅是字符串替换的体力活,这里我们使用winhex这个十六进制的查看工具来作分析,可以看到加载后显示的文件字符集为ansi,每个偏移十六进制对应的正是原始的字符串,如下图,我们只需要替换即可做到汉化,不过这样看起来还很麻烦,android123会在近期推出一个汉化工具自动包含词库替换英文到中文,相关技术参考 APK文件格式分析,Android反编译入门(一)  文件描述。

100% Secure Checkout

PayPal / MasterCard / Visa