先来几张软件截图:
接下来的几篇博客我将会逐一将整个项目中一些我认为比较好玩的地方分享给大家,当然如果大家下载了这款软件觉得有想要学习的东西,留言给我,我会将其抽取出来与大家分享!
ok! 转入正题,开始我们今天的内容:实用的代码框架。
说到代码框架,对于个人开发者来说,做一款简单的android应用其实也用不到那么多的条条框框,但是如果是一个团队的协作,共同写代码,那就得前期先将代码的框架搭建好,这样才能更好的进行团队分工和编写代码。
<a href="http://blog.51cto.com/attachment/201310/200758983.png" target="_blank"></a>
一、MainServices类:
主框架类: 统一接收任务消息,处理不同的任务。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<code>package</code> <code>com.zhf.android_framework01.logic;</code>
<code>import</code> <code>java.util.ArrayList;</code>
<code>import</code> <code>java.util.LinkedList;</code>
<code>import</code> <code>com.zhf.android_framework01.model.Task;</code>
<code>import</code> <code>com.zhf.android_framework01.ui.IActivity;</code>
<code>import</code> <code>android.app.Activity;</code>
<code>import</code> <code>android.app.Service;</code>
<code>import</code> <code>android.content.Intent;</code>
<code>import</code> <code>android.os.Handler;</code>
<code>import</code> <code>android.os.IBinder;</code>
<code>import</code> <code>android.os.Message;</code>
<code>/**</code>
<code> </code><code>* 主框架类: 统一接收任务消息,处理不同的任务</code>
<code> </code><code>* @author ZHF</code>
<code> </code><code>*</code>
<code> </code><code>*/</code>
<code>public</code> <code>class</code> <code>MainServices </code><code>extends</code> <code>Service </code><code>implements</code> <code>Runnable{</code>
<code> </code>
<code>// 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。</code>
<code>// 2.对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。</code>
<code>// 3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。</code>
<code> </code><code>private</code> <code>static</code> <code>LinkedList<Task> tasks = </code><code>new</code> <code>LinkedList<Task>(); </code><code>//任务队列,记得移除remove</code>
<code> </code><code>private</code> <code>static</code> <code>ArrayList<Activity> activities = </code><code>new</code> <code>ArrayList<Activity>(); </code><code>//存放需要返回数据的 View</code>
<code> </code><code>private</code> <code>boolean</code> <code>isRun = </code><code>false</code><code>;</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>void</code> <code>onCreate() {</code>
<code> </code>
<code> </code><code>isRun = </code><code>true</code><code>;</code>
<code> </code><code>Thread thread = </code><code>new</code> <code>Thread(</code><code>this</code><code>);</code>
<code> </code><code>thread.start();</code>
<code> </code><code>super</code><code>.onCreate();</code>
<code> </code><code>}</code>
<code> </code><code>/**</code>
<code> </code><code>* 向集合中添加Activity对象</code>
<code> </code><code>* @param activity 需要向集合中添加的实例</code>
<code> </code><code>*/</code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>addActivity(Activity activity) {</code>
<code> </code><code>activities.add(activity);</code>
<code> </code><code>* 向集合中添加任务</code>
<code> </code><code>* @param task 任务实例</code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>newTask(Task task) {</code>
<code> </code><code>tasks.add(task);</code>
<code> </code><code>* 线程不断检测tasks中的任务</code>
<code> </code><code>public</code> <code>void</code> <code>run() {</code>
<code> </code><code>while</code><code>(isRun) {</code>
<code> </code><code>Task task = </code><code>null</code><code>;</code>
<code> </code><code>if</code><code>(!tasks.isEmpty()) {</code>
<code> </code><code>task = tasks.poll();</code>
<code> </code><code>if</code><code>(</code><code>null</code> <code>!= task) {</code>
<code> </code><code>doTask(task); </code><code>//处理任务</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>try</code> <code>{</code>
<code> </code><code>Thread.sleep(</code><code>1000</code><code>);</code>
<code> </code><code>} </code><code>catch</code> <code>(InterruptedException e) {</code>
<code> </code><code>e.printStackTrace();</code>
<code> </code><code>}</code>
<code> </code><code>* 处理任务(重要)</code>
<code> </code><code>* @param task 任务实体</code>
<code> </code><code>private</code> <code>void</code> <code>doTask(Task task) {</code>
<code> </code><code>Message msg = handler.obtainMessage();</code>
<code> </code><code>msg.what = task.getTaskId(); </code><code>//获取任务ID</code>
<code> </code><code>switch</code> <code>(msg.what) {</code>
<code> </code><code>case</code> <code>Task.FIRST_LOGIN:</code>
<code> </code><code>System.out.println(</code><code>"doTask---->>>first login!"</code><code>);</code>
<code> </code><code>msg.obj = </code><code>"第一次登录成功"</code><code>; </code><code>//传递处理完的数据</code>
<code> </code><code>break</code><code>;</code>
<code> </code><code>default</code><code>:</code>
<code> </code><code>handler.sendMessage(msg);</code>
<code> </code><code>* 处理器</code>
<code> </code><code>private</code> <code>Handler handler = </code><code>new</code> <code>Handler() {</code>
<code> </code><code>public</code> <code>void</code> <code>handleMessage(android.os.Message msg) {</code>
<code> </code><code>switch</code><code>(msg.what) {</code>
<code> </code><code>case</code> <code>Task.FIRST_LOGIN: </code><code>//登录</code>
<code> </code><code>IActivity activity = (IActivity) getActivityByName(</code><code>"LoginActivity"</code><code>);</code>
<code> </code><code>activity.refresh(msg.obj);</code>
<code> </code><code>break</code><code>;</code>
<code> </code><code>//其他任务</code>
<code> </code><code>};</code>
<code> </code><code>* 根据Activity的名字获取集合中对应的Activity</code>
<code> </code><code>* @param string Activity的名字</code>
<code> </code><code>* @return</code>
<code> </code><code>private</code> <code>Activity getActivityByName(String string) {</code>
<code> </code><code>if</code><code>(!activities.isEmpty()) {</code>
<code> </code><code>for</code> <code>(Activity activity : activities) {</code>
<code> </code><code>if</code><code>(</code><code>null</code> <code>!= activity) {</code>
<code> </code><code>if</code><code>(activity.getClass().getName().indexOf(string) > </code><code>0</code><code>) { </code><code>//为何不写!=-1,not subString,因为会忽略了单个字母的情况</code>
<code> </code><code>return</code> <code>activity; </code><code>//获取对应的Activity实例</code>
<code> </code><code>}</code>
<code> </code><code>return</code> <code>null</code><code>;</code>
<code> </code><code>//遍历所有Activity并finish</code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>exit() {</code>
<code> </code><code>for</code> <code>(Activity activity : activities) {</code>
<code> </code><code>activity.finish();</code>
<code> </code><code>System.exit(</code><code>0</code><code>);</code>
<code> </code><code>public</code> <code>IBinder onBind(Intent intent) {</code>
<code> </code><code>System.out.println(</code><code>"------->onBind"</code><code>);</code>
<code> </code><code>public</code> <code>void</code> <code>onStart(Intent intent, </code><code>int</code> <code>startId) {</code>
<code> </code><code>System.out.println(</code><code>"------->onStart"</code><code>);</code>
<code> </code><code>super</code><code>.onStart(intent, startId);</code>
<code> </code><code>public</code> <code>void</code> <code>onDestroy() {</code>
<code> </code><code>System.out.println(</code><code>"------->onDestroy"</code><code>);</code>
<code> </code><code>super</code><code>.onDestroy();</code>
<code>}</code>
这里用到了服务,所以记得在AndroidManifest中注册:
<code><</code><code>serviceandroid:name</code><code>=</code><code>".logic.MainServices"</code><code>></</code><code>service</code><code>></code>
二.IActivity接口
<code>package</code> <code>com.zhf.android_framework01.ui;</code>
<code> </code><code>* 每个界面需要实现该接口,完成其中的抽象方法</code>
<code>public</code> <code>interface</code> <code>IActivity {</code>
<code> </code>
<code> </code><code>/**初始化**/</code>
<code> </code><code>public</code> <code>abstract </code><code>void</code> <code>init();</code>
<code> </code><code>/**刷新界面**/</code>
<code> </code><code>public</code> <code>abstract </code><code>void</code> <code>refresh(</code><code>Object</code> <code>...params);</code>
三.Task类
<code>package</code> <code>com.zhf.android_framework01.model;</code>
<code>import</code> <code>java.util.Map;</code>
<code> </code><code>* 任务实体: 任务的ID,任务参数taskParams</code>
<code>public</code> <code>class</code> <code>Task {</code>
<code> </code>
<code> </code><code>public</code> <code>static</code> <code>final</code> <code>int</code> <code>FIRST_LOGIN = </code><code>0</code><code>; </code><code>//登录任务</code>
<code> </code><code>private</code> <code>int</code> <code>taskId; </code><code>//任务ID</code>
<code> </code><code>private</code> <code>Map<String, Object> taskParams; </code><code>//任务参数</code>
<code> </code><code>public</code> <code>Task(</code><code>int</code> <code>taskId, Map<String, Object> taskParams) {</code>
<code> </code><code>this</code><code>.taskId = taskId;</code>
<code> </code><code>this</code><code>.taskParams = taskParams;</code>
<code> </code><code>public</code> <code>int</code> <code>getTaskId() {</code>
<code> </code><code>return</code> <code>taskId;</code>
<code> </code><code>public</code> <code>void</code> <code>setTaskId(</code><code>int</code> <code>taskId) {</code>
<code> </code><code>public</code> <code>Map<String, Object> getTaskParams() {</code>
<code> </code><code>return</code> <code>taskParams;</code>
<code> </code><code>public</code> <code>void</code> <code>setTaskParams(Map<String, Object> taskParams) {</code>
四.LoginActivity类
<code>import</code> <code>android.os.Bundle;</code>
<code>import</code> <code>android.view.View;</code>
<code>import</code> <code>android.view.View.OnClickListener;</code>
<code>import</code> <code>android.widget.Button;</code>
<code>import</code> <code>android.widget.TextView;</code>
<code>import</code> <code>android.widget.Toast;</code>
<code>import</code> <code>com.zhf.android_framework01.R;</code>
<code>import</code> <code>com.zhf.android_framework01.logic.MainServices;</code>
<code> </code><code>* 登录界面: 测试框架是否运行正常</code>
<code>public</code> <code>class</code> <code>LoginActivity </code><code>extends</code> <code>Activity </code><code>implements</code> <code>IActivity{</code>
<code> </code>
<code> </code><code>private</code> <code>TextView textView;</code>
<code> </code><code>private</code> <code>Button btn_login; </code><code>//登录</code>
<code> </code><code>private</code> <code>Button btn_exit; </code><code>//退出</code>
<code> </code><code>private</code> <code>Intent service;</code>
<code> </code><code>protected</code> <code>void</code> <code>onCreate(Bundle savedInstanceState) {</code>
<code> </code><code>super</code><code>.onCreate(savedInstanceState);</code>
<code> </code><code>setContentView(R.layout.activity_main);</code>
<code> </code>
<code> </code><code>//启动软件界面后记得启动后台服务!</code>
<code> </code><code>service = </code><code>new</code> <code>Intent(</code><code>this</code><code>, MainServices.</code><code>class</code><code>); </code><code>//别忘了注册!</code>
<code> </code><code>startService(service); </code><code>//启动服务</code>
<code> </code><code>MainServices.addActivity(</code><code>this</code><code>); </code><code>//将该Activity实例加入到框架中,便于最终软件的退出</code>
<code> </code><code>this</code><code>.btn_login = (Button) </code><code>this</code><code>.findViewById(R.id.btn_login);</code>
<code> </code><code>this</code><code>.btn_login.setOnClickListener(</code><code>new</code> <code>OnClickListener() {</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>void</code> <code>onClick(View v) {</code>
<code> </code><code>Task task = </code><code>new</code> <code>Task(Task.FIRST_LOGIN,</code><code>null</code><code>); </code><code>//生成任务</code>
<code> </code><code>MainServices.newTask(task);</code>
<code> </code><code>});</code>
<code> </code><code>this</code><code>.btn_exit = (Button) </code><code>this</code><code>.findViewById(R.id.btn_exit);</code>
<code> </code><code>this</code><code>.btn_exit.setOnClickListener(</code><code>new</code> <code>OnClickListener() {</code>
<code> </code><code>//停止服务</code>
<code> </code><code>stopService(service);</code>
<code> </code><code>Toast.makeText(LoginActivity.</code><code>this</code><code>, </code><code>"后台服务已停止!"</code><code>, Toast.LENGTH_SHORT);</code>
<code> </code><code>MainServices.exit(); </code><code>//将所有的Activity结束掉</code>
<code> </code><code>this</code><code>.textView = (TextView) </code><code>this</code><code>.findViewById(R.id.tv_login);</code>
<code> </code><code>public</code> <code>void</code> <code>init() {</code>
<code> </code><code>public</code> <code>void</code> <code>refresh(Object... params) {</code>
<code> </code><code>//接收传回的数据,刷新UI</code>
<code> </code><code>this</code><code>.textView.setText(params[</code><code>0</code><code>].toString());</code>
还有一个xml:
<code><?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"utf-8"</code><code>?></code>
<code><</code><code>LinearLayout</code> <code>xmlns:android</code><code>=</code><code>"http://schemas.android.com/apk/res/android"</code>
<code> </code><code>android:layout_width</code><code>=</code><code>"fill_parent"</code>
<code> </code><code>android:layout_height</code><code>=</code><code>"fill_parent"</code>
<code> </code><code>android:orientation</code><code>=</code><code>"vertical"</code> <code>></code>
<code> </code><code><</code><code>TextView</code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/tv_login"</code>
<code> </code><code>android:layout_width</code><code>=</code><code>"wrap_content"</code>
<code> </code><code>android:layout_height</code><code>=</code><code>"wrap_content"</code>
<code> </code><code>android:text</code><code>=</code><code>"TextView"</code> <code>/></code>
<code> </code><code><</code><code>Button</code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/btn_login"</code>
<code> </code><code>android:layout_width</code><code>=</code><code>"match_parent"</code>
<code> </code><code>android:text</code><code>=</code><code>"点击测试框架"</code> <code>/></code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/btn_exit"</code>
<code> </code><code>android:text</code><code>=</code><code>"点击退出程序"</code> <code>/></code>
<code></</code><code>LinearLayout</code><code>></code>
效果图:
ok! 这里我们就简单的将一款软件的代码框架搭建起来了。以后我们创建Activity时,只需要按照下面这几条模式来添加代码,就十分的方便了!
框架流程:
1.每次创建Activity需实现IActivity接口.
2.在onCreate()中将Activity添加到集合中。
3.每次要进行操作时,可生成一个新的Task,将其添加到任务集合中即可。
4.在主框架代码中根据任务的ID来调用方法处理任务事件--->处理完成之后将结果以obj的形式传递到Handler中----->利用多态调用对应的refresh()来对应传递数据,以达到刷新界面的效果。
<a href="http://down.51cto.com/data/2363591" target="_blank">附件:http://down.51cto.com/data/2363591</a>
本文转自zhf651555765 51CTO博客,原文链接:http://blog.51cto.com/smallwoniu/1307060,如需转载请自行联系原作者