Effective Android设计

来源:互联网 发布:网络打假举报电话 编辑:程序博客网 时间:2024/06/06 09:34


摘要: 本文总结了自己在Android项目实施中遇到的设计问题。 即如何更好的进行组织和设计, 让项目更加稳定, 更容易维护, 详细情况请查看后文提供的代码。


最重要的一条

继承系统自身的Application 类, 对整个系统做优化处理, 经常用到的优化处理有:

  1.  释放(finish)自身创建的Activity类, 如果Activity类过多, 并且跳转比较严重,退出程序的时候,部分Activity对象是来不及释放的。 最佳的方式是利用Application类来处理(千万不要随便用一个类中的静态成员List<Activity>来处理,因为系统资源不足的时候,静态变量会直接被系统回收,从而List为空,系统将得不到释放。参考Android 完美退出 App
  2. 系统未捕获到的异常处理, 比如某些Null异常弹出一个对话框,然后系统崩溃退出,这个给用户非常不好的体验,正确的做法是平滑推出,并释放资源。参考Android中处理崩溃异常

Application类还有 其他的经典用法, 比如内存过多的情况怎么处理的问题, 这些值得开发者深入思考, 这边就不多说了。其它一些需要注意的问题, 也列在下面, 值得一看.


1 Manifest.xml使用Activity不要用相对路径

  •   Manifest节点需要指定package的名称, 启动Activity需要放置在Manifest节点宣扬的package中. 这个也是R.java的位置, 这点保留并且需要引起注意
  •  其它Activity节点的Android name保持全路径,不采用.开头的相对路径, 避免找不到
  • 采用Library包也需要使用该规则.

 2 重视android:layout_weight这个节点的应用.

  • layout_weight + Linear Layout +嵌套UI,基本上可以搞定一切跟对齐有关的问题, (如果你有设计过Swing/SWT的经验, 基本上其它的Layout都是浮云, LinearLayout 加上权重分配, 再结合嵌套方式, 基本上可以搞定一切问题。)
  •  对齐的方向上,必须用fillparent: android:layout_width="fill_parent"
  • 注意android:layout_weight的值越大,表示占领的位置越短

例子的部分代码如下, 这个貌似是做登录界面基本上都要碰到的难缠问题.

<LinearLayout android:layout_width="fill_parent"android:layout_marginTop="5dip" android:layout_height="wrap_content"android:orientation="horizontal"><TextView android:layout_height="wrap_content"android:layout_weight="5" style="@style/dialog_txt_view_font"android:layout_width="fill_parent" android:layout_marginLeft="5dip"android:layout_marginRight="5dip" android:text="密码:" android:gravity="left" /><EditText android:layout_height="35dip" style="@style/dialog_edit_txt_font"android:layout_width="fill_parent" android:layout_weight="2"android:layout_marginLeft="5dip" android:layout_marginRight="5dip"android:autoText="false" android:capitalize="none" android:gravity="fill_horizontal" /></LinearLayout>

运行的结果:


3界面风格定制尽量采用Style文件的方式

三点好处

  • 保持界面风格完全统一
  • 跟编程类似, 消除冗余代码, 方便重用
  • 修改、重构界面非常方便,维护非常Easy

使用style的方式,网上有很多资料, 因此不贴出具体的方式。 可以参照本文提供的代码及其注释

 

4 注意Layout文件的可重用部分分离, 并动态加载特殊性。

下面一个示意图说明UI的可重用性在一个Android项目中的平常:


上面两张图, 就是两个Activity, 他们都是上中下的结构, 方便起见的设计是: 分离一个父Layout面板. 并将中间的特殊UI分离出来。在具体的Activity中,利用动态的方式加载,代码如下:

LinearLayout specialUI = (LinearLayout)findViewById(R.id.specialUI);LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);   View listView = inflater.inflate(R.layout.listview_common,null); LayoutParams para = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);specialUI.addView(listView, para);itemlist = (ListView) findViewById(R.id.itemlist);refreshListItems();

运行的结果如下(中间是List效果, 可以参考一下):



这样做的必须性在于:

1. 保持一致性的需要

2.易维护的需要

 

5 采用Library项目管理自己的API.

个人一直在努力宣传作为软件工程师, 需要有自己的API库. Android中可以将工程设置为:Is Library. 或者引用其它的Library工程。下面是我曾经提到的内容。可以通过Google去查询需要的信息。

至于原因, 可以再重申一下,新手解决问题的方式是: 看到问题,调研,解决。老手解决的方式是:看到问题,参考从前案例,解决。个人的API 就是你从前的案例。千万别小看这个区别。


6 采用数据接口而不是类接口.

尽量传递数据作为协议接口, 避免类之间的相互依赖性。

比如,在我的程序中, 我用到了一个二维码的工具, 采用的方法是, 在二维码模块中, 写preference到xml中, 而在我的主程序中, 读取这个Preference. 这样二维码模块可以不需要知道主程序是谁. 这样二维码模块可以不受应用的左右,可以提供给任何程序使用。 完全做到了与业务无关



详细代码


   

原创粉丝点击