Android 最佳实践

从事android开发两年有余,但是自己的代码自己却不太敢恭维。于是我不得不来改善我的Android程序,为了使它变得更加的稳固,更加的专业。本文旁征博引,多处观点都是Google之,结合自己的经验总结了Android开发中的一些最佳实践,厚积方能博发,多积累多学习才能多进步。

Android Activity 的生命周期

生命周期(Lifecycle)描述的是Android一个页面从开始创建到消亡的整个过程。伴随着一系列对象的创建及消失,涵盖着整个页面所包含的业务逻辑。以及与用户之间的交互,接受用户的输入并返回输出信息给用户。

从其生命流程图中,我们可以看到Android单个Activity的生命周期主要为 onCreate -> onStart -> onResume -> Activity Running -> onPause -> onStop -> onDestroy. 通常单个App是由诸多的Activity组成的,一般情况我们肉眼所见的一个页面就是一个Activity,我们也经常再APP中点击Button或者Back,于是我们实现了Activity之间的切换。

1. onCreate()与onDestroy()

如何理解onCreate()呢?首先通过来自Google的官方解释来看onCreate()方法的作用:

onCreate(Bundle) is where you initialize your activity. Most importantly, here you will usually call setContentView(int) with a layout resource defining your UI, and using findViewById(int) to retrieve the widgets in that UI that you need
to interact with programmatically

所以onCreate方法主要用于初始化我们的Activity。在onCreate()方法中,我们通过setContentView(int)来为当前的Activity指定对应的View, 然后通过findViewById(int)通过id检索当前View中的组件。至此,onCreate()的一些基本的初始化工作完成, Activity全局的初始化工作应该都在onCreate()中完成,这些初始化状态一直会被保存直到onDestroy()被调用,也就意味着Activity消亡。

细心观察发现,Activity的onCreate(Bundle)函数会有一个Bundle类型的参数savedInstanceState,通过这个meaningful的名字可以看到此参数主要用于使用之前保存的数据。

与onCreate()对应的方法是onDestroy(), 后者主要是Activity被销毁时会被执行的方法,当我们调用this.finish()手动结束当前的Activity, 此时onDestroy()会被回调,我们可以在这里面做一些程序被销毁前的保存性操作。

2. onStart()与onStop()

这两种状态一般出现在,当用户从Activity A 跳转到Activity B 中,此时Activity A 的 onStop函数会被回调,此时Activity A 被压入到堆栈中,并处于不可见状态。一旦用户结束Activity B, 再次进入Activity A 中,系统会重新调用onRestart()和onStart()函数,于是这个Activity重新被唤醒。

3. onResume()与onPause()

通过字面意思理解为Activity的恢复和停止,一个典型的例子是APP运行过程中突然有电话或者闹铃,以至于当前的Activity被其他的Activity覆盖,这种情况下会触发onResume()和onPause()事件,当然如果APP经历onStart()和onStop()事件,也必然会先经过onResume()和onPause()事件。生命周期的流程图如上图所示,其形成的是一个完成的闭路。

通过应用程序的一套完整的Lifecycle,Android保证了APP在手机上进行良好的运行,并且运行过程互不干扰。Android生命周期的存在也表明在APP开发中,应该使Activity功能彼此对应,在onStart()中注册了某些事件,在onStop()中就应该进行反注册,例如地图开发中的GPS定位,就需要在onStart中进行注册,而在onStop()中进行反注册。还有一些网络访问回调也存在类似的情形,都需要我们在APP开发中注意,确保APP以最佳的状态运行。

Activity的职能-避免Activity类承载太多职能

Activity作为Android的Controller,直接负载着与用户的交互过程。开发中Activitiy很容易由于大量的动画,布局等操作而变得臃肿,特别使业务逻辑渐渐复杂时,Activity过大的代码量增加了维护成本,甚至开发者自己都很难读懂这个Activity真正的含义。为了避免这种情况,我们要尽量将纯UI布局和动画逻辑分离到第三方类中,在Activity与用户交互过程中,一旦需要某些UI操作和动画表现等,直接对其相关的UI布局等进行调用即可。我们的Activity只作为真正的Controller,控制着接收用户输入以及反馈输出,至于中间的逻辑则完全可以交给“Presenter”调用。

Android布局多屏适配

Android由于设备众多,分辨率众多,不同厂家定制的SDK也增加了适配成本。所以我们开发过程,就不应该使用太过绝对的布局,而应该尽量使用相对布局。过于绝对的布局可能在当前设备上表现良好,一旦在其他机器上运行则可能会出现布局错乱的问题。布局时也要避免View之间的深嵌套,根据你的设计图选择合适的布局方式,过重的布局会拖慢页面的渲染速度,进而影响整个APP的性能表现。

用Fragment代替Activity

自Android4.0之后,Android开始使用Fragment,并保持不断更新中。简言之,Fragment也是可以直接代替Activity的Controller,Fragment主要是为了适配手机和平板而生的,Fragment在手机上和Activity的表现无异,但是在平板上却可以以类似于组件的形式表现出来,这种形式更适合平板的大屏显示方式。Fragment让我们不用去同时维护手机和平板上的两套代码,方便了开发过程。

MVC最佳实践

和Web开发中的MVC框架类似,我们同样可以对APP进行MVC化。具体而言,Activity是我们的Controller控制器,而对数据的读取与查询等具体语句则应该通过DataManager进行处理,类似于我们通常所说的Service,Service不直接和界面进行交互。用户的交互都是与Activity发生的,Service会提供一些数据读取相关的方法,以供Activity调用。

本文抛砖引玉,参考别人的文章,结合自己的实践经历总结了一些实践性的经验。个中不足,烦请大家不吝赐教,当然更欢迎大家一起交流。

文章参考:http://clayallsopp.com/posts/android-best-practices-tips/

时间: 2024-10-16 19:01:40

Android 最佳实践的相关文章

Android最佳实践之高效的应用导航

设计(一)- 规划Screens和他们之间的关系 原文地址:http://developer.android.com/training/design-navigation/screen-planning.html#beyond-simplistic-design 设计和开发Android应用程序的第一个步骤是确定用户能够查看和处理应用.一旦你知道用户与之交互的应用程序之间交互什么数据,下一步就是设计交互,允许用户导航到app的不同部分,进入和退出应用程序中的界面. 这篇文章开始向你展示如何规划高

Android最佳实践之性能 - 电池续航时间优化

Doze和App Standby的优化(API23) 参考地址:http://developer.android.com/training/monitoring-device-state/doze-standby.html 从Android 6.0 (API level 23)开始,Android提供了两个节电功能用来增加电池的续航时间.Doze 可以在设备长时间不使用时,通过延迟后台CPU和网络的活动来减少电池的消耗:App Standby将延迟没有交互的app网络活动. Doze和App S

Android最佳实践之性能 - 提升Layout性能

优化布局结构 参考地址:http://developer.android.com/training/improving-layouts/optimizing-layout.html 布局是Android应用程序的关键部分,直接影响到用户体验.如果实现的不好,布局会消耗大量内存,应用程序UI会变得缓慢.Android SDK包含工具来帮助你识别布局性能问题,结合最佳实践,你将能够实现流畅的滚动体验和一个最低内存的占用. 我们有一个误解,就是使用基本的布局结构,可以实现最有效率的布局.加到App中的

Android最佳实践——深入浅出WebSocket协议

首先明确一下概念,WebSocket协议是一种建立在TCP连接基础上的全双工通信的协议.概念强调了两点内容: TCP基础上 全双工通信 那么什么是全双工通信呢? 全双工就是指客户端和服务端可以同时进行双向通信,强调同时.双向通信 WebSocket可以应用于即时通信等场景,比如现在直播很火热,直播中的弹幕也可以使用WebSocket去实现. WebSocket的协议内容可以见The WebSocket Protocol,讲得最全面的官方说明.简单介绍可以见维基百科WebSocket 在Andro

Android最佳实践之UI

为多屏设计(一) - 支持多个屏幕尺寸 参考地址:http://developer.android.com/training/multiscreen/index.html Android UI设计提供了一个灵活的框架,允许应用程序为不同设备显示不同的布局,创建自定义UI部件,在App外部控制系统的Window. Android的设备尺寸参差不齐,从几寸的小手机到几十寸的TV设备,我们需要学会为这么多的设备做出适配让尽可能多的人有更好的体验.支持多个屏幕尺寸有以下几种方式: - 确保你的布局可以充

android最佳实践之设备兼容性

由于不同手机的尺寸大小,屏幕分辨率可能存在差异.在开发应用的时候,你或许遇到过这些的问题: 1, 为什么图片在另外的手机上显示的时候变小了,又或是缩小了? 2, 为什么在layout中定义好的格局在另外的手机上变形了? 3, 为什么自己自定义的控件尺寸显示不正常了? ................ 这些都是android中比较常见的设备兼容性相关的问题,其实解决这类问题也不难,只要掌握了一些基本概念和android内部处理兼容性问的机制,这些问题都可以迎刃而解. 下边收集了一些关于尺寸兼容性问

Android最佳实践之Notification、下拉刷新、内存及性能建议等

Notification通知 参考地址:http://developer.android.com/training/notify-user/index.html 通知(Notification)是Android中使用的非常多的一个事件提示机制. 创建一个Notification 例子中的Notification是基于Support Library中的NotificationCompat.Builder类.我们使用时要继承这个类,它提供了各个平台最好的Notification支持. 创建一个Not

我的Android最佳实践之—— 解决闪空界面问题

进入应用时,由于应用的启动Activity都会有默认的theme,所以会跳一下原始界面,才启动我们定义的theme. 修改这个问题的方法,就是给应用启动的Activity设置一个空的theme.如下面的例子: 联系人启动时的Activity为PeopleActivity ,我们就在manifest文件中设置PeopleActivity 的theme为一个空的theme <activity android:name=".activities.PeopleActivity" andr

我的Android最佳实践之—— Android启动画面的实现方法

本文实例讲述了Android启动画面的实现方法.分享给大家供大家参考.具体分析如下: 在应用程序中经常用到启动画面,会启动一个后台线程为主程序的运行准备资源.Android要实现启动画面可以这样做: 这是splash.xml布局文件的代码: <LinearLayout   xmlns:android="http://schemas.android.com/apk/res/android"   android:layout_height="fill_parent"