怎样搭建一个android开发框架

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样搭建一个android开发框架相关的知识,希望对你有一定的参考价值。

搭建android开发环境
准备工作:下载Eclipse、JDK、Android SDK、ADT插件
下载地址:Eclipse:http://www.eclipse.org/downloads/
JDK:http://www.oracle.com/technetwork/java/javase/downloads/jdk7u9-downloads-1859576.html
Android SDK:http://developer.android.com/sdk/index.html
ADT:http://developer.android.com/tools/sdk/eclipse-adt.html
1、安装和配置JAVA开发环境:
①把准备好的Eclipse和JDK安装到本机上(最好安装在全英文路径下),并给JDK配置环境变量,其中JDK的变量值为JDK安装路径的根目录,如我的为:D:\Program Files\Java\jdk1.7.0_02;
②打开命令提示符(cmd),输入java -version命令,显示如下图则说明JAVA环境变量已经配置好了。
2、安装ADT插件:
①打开已安装好的Eclipse,选择菜单栏上的“Help”->在弹出的下拉框中单击选择“Install new software...”;
②在新打开的对话框中我们完全可以直接在"Work with"中输入:https://dl-ssl.google.com/android/eclipse/在线安装ADT插件,但由于Google的服务器搭建在国外,所以通过这种方式安装起来会比较慢,而且可能会出现人品差死活装不上的情况,所以不推荐在线安装。
③我推荐直接通过下载好的ADT插件压缩包进行安装(此种方式可以在离线环境下进行)。具体步骤是:在新打开的对话框中点击“Add”按钮->在打开的对话框中点击“Archive”按钮选择之前已经下载好保存在本地硬盘的ADT插件压缩包,至于上面的“Name”可以随便取,这只是一个代号而已,没什么实际作用。
④在上一步中点击“Ok”按钮后我们会发现中间的空白处出现了两行复选框,单击"Select All"按钮选中所有的复选框,这步过后一路“Next”,需要“Accept”的就选中“Accept”,直到点击“Finish”结束,这样ADT插件就安装好了。整个过程需要的时间视机器性能而定。安装好ADT插件后,Eclipse的工具栏会出现一排Android的图标,如下图:
3、安装SDK:
①把下载好的Android SDK安装到本机上(最好安装在全英文路径下),并为Android SDK配置环境变量。Android SDK的环境变量值为SDK安装目录下的platform-tools文件夹和tools文件夹子目录路径,如我的分别为:E:\My Studying\Android\android-sdk\platform-tools、E:\My Studying\Android\android-sdk\tools,在变量值中,两个路径用逗号隔开。
②打开命令提示符(cmd),分别输入android -h和adb命令,显示如下图则说明Android SDK环境变量已经配置好了。
③打开Android SDK的安装目录,双击 "SDK Manager"->在打开的窗口中先选择你需要安装的SDK版本,其中“Status”表示该SDK包是否安装,如我选的是“Android2.2(API 8)”(我的之前已经安装过了,所以“Status”为“Installed”)->再点击“Install packages...”按钮,在弹出来的窗口中最好选“Accept All”这样才能安装你刚才选的所有的包->最后点“Install”按钮就开始安装了,整个过程会很慢,这需要你的耐心。
另外我们还可以通过在Eclipse上的工具栏中点击下图指示的图标打开“SDK Manager”然后进行安装,这样和上面的SDK安装方式一样,就不累述了。
④最后再选择Eclipes主菜单上的"Windows"->选择"preferrnces";
⑤在弹出来的对话框中选中左边栏的“Android”->通过右侧的“Browse...”按钮选择SDK的安装路径根目录->点击最下方的“Ok”按钮,这样SDK就在Eclipse上加载成功了。
4、创建Android模拟器(AVD):
①打开Eclipse->在Eclipse的工具栏上单击下图指示的图标打开“Android Virsual Device Manager”窗口;
②在“Android Virsual Device Manager”窗口单击“New”按钮->在弹出来的窗口中"Name"可以随便取;“Target”指模拟器的系统版本;“SD Card”的"size"是指手机存储卡的大小,只要你不在模拟器上装太多的应用,一般给个二三十MB就够了;“Skin”是指屏幕的分辨率大小,其中“Built in”是一般手机常用标准屏幕分辨率大小,而“Resolution”是自定义屏幕分辨率大小,具体做法,可以根据自身情况选择。->一切设置好后点击“Create AVD”,这时一个模拟器就创建好了。如果有必要,我们可以创建多个模拟器用于测试时使用。
附:Android模拟器型号以及其对应的分辨率大小:

Standard Width Height DAR Pixeis
HVGA 480 * 320 3:2 153,600
QVGA 320 * 240 4:3 76,800
WQVGA400 400 * 240 5:3 96,000
WQVGA432 432 * 240 9:5 103,680
WVGA800 800 * 480 5:3 384,000
WVGA852 854 * 480 409,920

至此为止,在Eclipse上就已经成功搭建Android开发环境了。
参考技术A 相对于传统计算机程序语言来说,Android开发学习资源上还稍微欠缺一些,对于一些基础应用讲解还稍显匮乏,本篇所讲述的Android培训内容可以帮助大家更好的理解Android项目快速开发框架。结合之前所用的ormlite和hessian,再加上SAE已经支持JAVA,把服务端切换到JAVA,也就有了本文。使用hessian来做数据传输,ormlite来实现客户端与服务端的数据存储,极大的减少了CRUD工作。本文为探索贴,未正式用于大型项目,欢迎大家讨论使用!正文一、简介1.1 ormliteOrmlite[Object Relational Mapping Lite (ORM Lite)]对象关系映射精简版(精简版的ORM)提供了一些简单的,轻量级持久化Java对象到SQL数据库,同时也避免了复杂性和更多的标准的ORM包的开销的功能。支持数据库的jdbc调用,当然,最重要的肯定是它支持android原生的数据库api调用sqlite。——转载自这里。1.2 hessian使用方法参照本博两篇文章:[hessdroid]Android下使用Hessian与Java服务端通讯[hessdroid]Android下使用Hessian与Java服务端通讯的传值测试1.3 Android快速开发框架说明考虑如下几个特点:a). 客户端(Android)和服务端均使用Java语言b). 客户端(Android)和服务端均支持Hessian和ormlite框架c). 完整的支持面向对象开发:存储和交互传输二、准备2.1 开发环境为了便于同时开发Android和Java Web,这里下载的是Eclipse IDE for Java EE Developers版本,然后安装最新的ADT插件和TOMCAT插件。2.2 服务端应用服务器使用Tomcat,采用Java(JSP/Servlet)来实现服务端的业务逻辑,数据库使用mysql。快速框架搭建推荐大家使用XAMPP(集成Apache、MySQL、php等,支持绿色安装)。2.3 客户端普通的Android环境2.4 通信与存储说明服务端与客户端通过Hessian进行数据交换,通过Ormlite保存数据库(通过JDBC保存到服务端的MYSQL数据库,也可以直接保存到客户端的sqlite数据库);三、代码3.1 项目工程截图(服务端)HOLib共用于客户端和服务端,保证接口和数据对象一致性。3.2 重点代码分析3.2.1 服务端web.xml<?xml version="1.0" encoding="ISO-8859-1"?><web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd" version="2.4"> <servlet> <servlet-name>user</servlet-name> <servlet-class>com.nmbb.ho.server.servlet.UserServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>user</servlet-name> <url-pattern>/user.do</url-pattern> </servlet-mapping> <listener> <listener-class>com.nmbb.ho.server.StartupInit</listener-class> </listener></web-app>StartupInit.javapublic class StartupInit implements ServletContextListener @Override public void contextInitialized(ServletContextEvent arg0) try TableUtils.dropTable(OrmliteHelper.getConnection(), POUser.class, true); //创建数据库 TableUtils.createTable(OrmliteHelper.getConnection(), POUser.class); catch (SQLException e) e.printStackTrace(); @Override public void contextDestroyed(ServletContextEvent arg0) 代码说明:StartupInit可用于创建数据库表结构,这里用于测试,真实环境注意数据丢失问题。POUser.java@DatabaseTable(tableName = "nmbb_users")public class POUser implements Serializable /** 用户编号,6位数字 */ @DatabaseField(generatedId = true) public int suid; /** 用户名 */ @DatabaseField(width = 30) public String username; /** 密码 */ @DatabaseField(width = 30) public String password; /** 昵称 */ @DatabaseField(width = 60) public String nickname; /** 200 正常 201 数据校验错误 202用户已经存在 */ public int status = 200; /** 用于放错误信息 */ public String msg; public POUser() 代码说明:注意需要一个空的构造函数,其他请参考ormlite资料。UserServlet.java/*** 用户Servlet** @author 农民伯伯* @see http://www.cnblogs.com/over140/archive/2013/02/19/2917231.html**/public class UserServlet extends HessianServlet implements IUserService @Override public POUser register(String username, String password) POUser result = new POUser(); System.out.println("[UserServlet.register]..."); // 检测数据是否合法 if (isEmpty(username) || isEmpty(password)) result.status = 201; result.msg = "用户名或密码不能为空"; else // 检测用户是否存在 OrmliteHelper<POUser> db = new OrmliteHelper<POUser>(); if (db.exist(POUser.class, "username", username)) result.status = 202; result.msg = "用户名已经存在"; else result.username = username; result.password = password; db.create(result);// 入库 result.msg = "注册成功"; System.out.println("create user suid:" + result.suid); return result; @Override public List<POUser> query(int suid, int startIndex, int pageSize) return new OrmliteHelper<POUser>().query(POUser.class, "suid", suid, startIndex, pageSize) ; /** * 判断字符串是否为空 * * @param str * @return */ public static boolean isEmpty(String str) return str == null || str.length() == 0; 3.2.2 客户端(Android) public class UserActivity extends Activity @Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); public void OnClickRegiger(View view) new AsyncTask<Void, Void, POUser>() @Override protected POUser doInBackground(Void... params) String url = "http://192.168.68.23:8081/HOServer/user.do"; HessianProxyFactory factory = new HessianProxyFactory(); try factory.setDebug(true); factory.setReadTimeout(5000); //不设置会报 expected hessian reply at 0x48 factory.setHessian2Reply(false); IUserService basic = (IUserService) factory.create(IUserService.class, url, getClassLoader()); return basic.register("admin", "123456"); catch (MalformedURLException e) Log.e("UserActivity", "OnClickRegiger", e); catch (Exception e) Log.e("UserActivity", "OnClickRegiger", e); return null; @Override protected void onPostExecute(POUser result) if (result != null) if (result.status == 200) //保存入库 new DbHelper<POUser>().create(result); Toast.makeText(UserActivity.this, "" + result.msg, Toast.LENGTH_LONG).show(); ; .execute(); 代码说明:1、DbHelper在源码里给出。2、如果项目无法编译通过,请注意设置项目的字符编码、JDK版本、Android的版本。三、总结5.1 优点a). 完全面向对象开发b). 降低项目的复杂度,减少引入其他框架所带来的复杂性c). 非常适合一个开发服务端和客户端充分的利用的框架的特点,提交开发效率,适合中小型项目快速开发。5.2 缺点a). 注意服务端与客户端共用id的问题5.3 其他a). ormlite支持标准的JPA助记符,这里。这样服务端采用Hibernate应该也是可以的,有时间可以做一个整合例子看看。学习语言同做事情一样,想通其中的关系,就会事半功倍,对语言要深入的理解,本回答被提问者和网友采纳

Android实际开发中的首页框架搭建(首页框架实现)

本来这一篇是前两天就要写的,奈何事多缠身,推到今日,为自己的拖延感到愧疚。。。

上一篇大概把项目的结构完成了,下一步就是实现首页切换功能了

首先在activity目录下新建一个HomeActivity,作为承载多个fragment的容器

代码如下

  1 /*
  2  * *
  3  *  * *******************************************************
  4  *  *
  5  *  * @文件名称:HomeActivity.java
  6  *  * @文件作者:ouyangshengduo Copyright(c) 2017. All rights reserved.
  7  *  * @创建时间:17-3-21 下午10:08
  8  *  * @文件描述:
  9  *  * @修改历史:Last modified 17-3-21 下午9:58 ********************************************************
 10  *
 11  */
 12 
 13 package oysd.com.framebulding.activity;
 14 
 15 import android.app.Fragment;
 16 import android.app.FragmentManager;
 17 import android.app.FragmentTransaction;
 18 import android.os.Bundle;
 19 import android.support.v7.app.AppCompatActivity;
 20 import android.view.View;
 21 import android.widget.RelativeLayout;
 22 import android.widget.TextView;
 23 
 24 import oysd.com.framebulding.R;
 25 import oysd.com.framebulding.view.fragment.home.HomeFragment;
 26 import oysd.com.framebulding.view.fragment.home.MessageFragment;
 27 import oysd.com.framebulding.view.fragment.home.MineFragment;
 28 
 29 public class HomeActivity extends AppCompatActivity implements View.OnClickListener {
 30 
 31     /**
 32      * fragment相关
 33      */
 34     private FragmentManager fm;
 35     private HomeFragment mHomeFragment;
 36     private MessageFragment mMessageFragment;
 37     private MineFragment mMineFragment;
 38     private Fragment mCurrent;
 39 
 40 
 41     private RelativeLayout mHomeLayout;
 42     private RelativeLayout mMessageLayout;
 43     private RelativeLayout mMineLayout;
 44     private TextView mHomeView;
 45     private TextView mMessageView;
 46     private TextView mMineView;
 47 
 48     @Override
 49     protected void onCreate(Bundle savedInstanceState) {
 50         super.onCreate(savedInstanceState);
 51         setContentView(R.layout.activity_home_layout);
 52         //初始化这个界面的控件
 53         initView();
 54 
 55         mHomeFragment = new HomeFragment();
 56         fm = getFragmentManager();
 57         FragmentTransaction fragmentTransaction = fm.beginTransaction();
 58         fragmentTransaction.replace(R.id.content_layout,mHomeFragment);
 59         fragmentTransaction.commit();
 60     }
 61 
 62     private void initView() {
 63         mHomeLayout = (RelativeLayout) findViewById(R.id.home_layout_view);
 64         mHomeLayout.setOnClickListener(this);
 65         mMessageLayout = (RelativeLayout) findViewById(R.id.message_layout_view);
 66         mMessageLayout.setOnClickListener(this);
 67         mMineLayout = (RelativeLayout) findViewById(R.id.mine_layout_view);
 68         mMineLayout.setOnClickListener(this);
 69 
 70         mHomeView = (TextView) findViewById(R.id.home_image_view);
 71         mMessageView = (TextView) findViewById(R.id.message_image_view);
 72         mMineView = (TextView) findViewById(R.id.mine_image_view);
 73         mHomeView.setBackgroundResource(R.mipmap.comui_tab_home_selected);
 74     }
 75 
 76     /**
 77      * 隐藏Fragment方法
 78      * @param fragment
 79      * @param ft
 80      */
 81     private void hideFragment(Fragment fragment, FragmentTransaction ft) {
 82         if (fragment != null) {
 83             ft.hide(fragment);
 84         }
 85     }
 86 
 87     @Override
 88     public void onClick(View v) {
 89         FragmentTransaction fragmentTransaction = fm.beginTransaction();
 90         switch (v.getId()) {
 91             case R.id.home_layout_view:
 92                 mHomeView.setBackgroundResource(R.mipmap.comui_tab_home_selected);
 93                 mMessageView.setBackgroundResource(R.mipmap.comui_tab_message);
 94                 mMineView.setBackgroundResource(R.mipmap.comui_tab_person);
 95 
 96                 //隐藏其他的Fragment
 97                 hideFragment(mMessageFragment, fragmentTransaction);
 98                 hideFragment(mMineFragment, fragmentTransaction);
 99                 //将我们的HomeFragment显示出来
100                 if (mHomeFragment == null) {
101                     mHomeFragment = new HomeFragment();
102                     fragmentTransaction.add(R.id.content_layout, mHomeFragment);
103                 } else {
104                     mCurrent = mHomeFragment;
105                     fragmentTransaction.show(mHomeFragment);
106                 }
107                 break;
108             case R.id.message_layout_view:
109                 mMessageView.setBackgroundResource(R.mipmap.comui_tab_message_selected);
110                 mHomeView.setBackgroundResource(R.mipmap.comui_tab_home);
111                 mMineView.setBackgroundResource(R.mipmap.comui_tab_person);
112 
113                 hideFragment(mHomeFragment, fragmentTransaction);
114                 hideFragment(mMineFragment, fragmentTransaction);
115                 if (mMessageFragment == null) {
116                     mMessageFragment = new MessageFragment();
117                     fragmentTransaction.add(R.id.content_layout, mMessageFragment);
118                 } else {
119                     mCurrent = mMessageFragment;
120                     fragmentTransaction.show(mMessageFragment);
121                 }
122                 break;
123             case R.id.mine_layout_view:
124                 mMineView.setBackgroundResource(R.mipmap.comui_tab_person_selected);
125                 mHomeView.setBackgroundResource(R.mipmap.comui_tab_home);
126                 mMessageView.setBackgroundResource(R.mipmap.comui_tab_message);
127                 hideFragment(mMessageFragment, fragmentTransaction);
128                 hideFragment(mHomeFragment, fragmentTransaction);
129                 if (mMineFragment == null) {
130                     mMineFragment = new MineFragment();
131                     fragmentTransaction.add(R.id.content_layout, mMineFragment);
132                 } else {
133                     mCurrent = mMineFragment;
134                     fragmentTransaction.show(mMineFragment);
135                 }
136                 break;
137         }
138 
139         fragmentTransaction.commit();
140     }
141 }
View Code

然后在Fragment的目录下,新建自己的Fragment,我这里分三个,HomeFragment,MessageFragment,MineFragment

代码如下,这里只贴了HomeFragment,因为都是空的,所以其他的Fragment除了布局文件不一样,都差不多,没有实现什么功能,后期会慢慢往里面添加功能

 1 /*
 2  * *
 3  *  * *******************************************************
 4  *  *
 5  *  * @文件名称:HomeFragment.java
 6  *  * @文件作者:ouyangshengduo Copyright(c) 2017. All rights reserved.
 7  *  * @创建时间:17-3-21 下午10:11
 8  *  * @文件描述:
 9  *  * @修改历史:Last modified 17-3-21 下午10:11 ********************************************************
10  *
11  */
12 
13 package oysd.com.framebulding.view.fragment.home;
14 
15 import android.os.Bundle;
16 import android.view.LayoutInflater;
17 import android.view.View;
18 import android.view.ViewGroup;
19 
20 import oysd.com.framebulding.R;
21 import oysd.com.framebulding.view.fragment.BaseFragment;
22 
23 /**
24  * HomeFragment
25  */
26 public class HomeFragment extends BaseFragment {
27 
28 
29     private View mContentView;
30 
31     public HomeFragment() {
32 
33     }
34 
35     @Override
36     public void onCreate(Bundle savedInstanceState) {
37         super.onCreate(savedInstanceState);
38     }
39 
40     @Override
41     public View onCreateView(LayoutInflater inflater, ViewGroup container,
42                              Bundle savedInstanceState) {
43         // Inflate the layout for this fragment
44         mContext = getActivity();
45         mContentView = inflater.inflate(R.layout.fragment_home_layout, container, false);
46         return mContentView;
47     }
48 }
View Code

 

对于HomeActivity中的Fragment的切换,这里要讲一下一个知识点,Fragment的切换以及切换方式,

我们来大概浏览一下Android里面的Fragment的源码,就能知道它的切换方式了,截图如下:

 

 所以Fragment的切换方式真正意义上我觉得分三种,(add,remove),(hide,show),(detach,attach),replace是先remove再add的,所以和第一种是一样的,

他们之间的区别(个人总结,不对请喷):

第一种(add,remove,replace):每次都会新建Fragment实例

第二种(hide,show):比较消耗内存的方式,但是是我们实际开发中用的最多的,因为它不会每次都新建Fragment实例,有新的Fragment的时候,加到FragmentManager里面去就行

第三种(detach,attach):Fragment实例没有被销毁还是占内存,但每一次View都会被销毁,之后我们需要每一次都需重新要绘制View,所以实际开发中很少用,特别麻烦,而且也没有优化多少内存

 

以上,是对于一个项目的首页框架的搭建以及Fragment之间的切换,比较基础,其中的知识点如下:

知识点一:使用BaseFragment/BaseActivity的作用:抽象到父类的思维模式

知识点二:Fragment的切换以及切换的方式

知识点三:项目结构以及命名规范

 

源码地址:https://github.com/ouyangshengduo/FrameBulding

 

以上是关于怎样搭建一个android开发框架的主要内容,如果未能解决你的问题,请参考以下文章

基于 MVP 架构使用Android通用开发框架快速开发微博项目实战

怎样在eclipse中搭建android开发环境

怎样在NetBeans上搭建Android开发环境

怎样搭建android开发平台

怎样用ADT Bundle搭建Android开发环境

转Android开发学习总结——搭建最新版本的Android开发环境