【移动开发】Android应用程序中实用的代码框架(一)
好久沒有更新博客了,這段時間里和我的小伙伴們(”烏索普“、”丁二爺“、”小娜“、‘小雯’‘)參加了一個大學生Android應用軟件比賽,利用兩個月的課余時間做了一款MFNote(多功能記事本)軟件,中間的苦這里就不多說了,大家都懂得~~ 搞IT的熬夜寫代碼,相信那是每一個有志青年都必須經歷的。。。哈哈!
先來幾張軟件截圖:
有興趣的同學可以下載下來玩玩!軟件下載地址:http://apk.hiapk.com/html/2013/10/1874574.html
接下來的幾篇博客我將會逐一將整個項目中一些我認為比較好玩的地方分享給大家,當然如果大家下載了這款軟件覺得有想要學習的東西,留言給我,我會將其抽取出來與大家分享!
ok! 轉入正題,開始我們今天的內容:實用的代碼框架。
說到代碼框架,對于個人開發者來說,做一款簡單的android應用其實也用不到那么多的條條框框,但是如果是一個團隊的協作,共同寫代碼,那就得前期先將代碼的框架搭建好,這樣才能更好的進行團隊分工和編寫代碼。
一、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 | package?com.zhf.android_framework01.logic; import?java.util.ArrayList; import?java.util.LinkedList; import?com.zhf.android_framework01.model.Task; import?com.zhf.android_framework01.ui.IActivity; import?android.app.Activity; import?android.app.Service; import?android.content.Intent; import?android.os.Handler; import?android.os.IBinder; import?android.os.Message; /** ?* 主框架類:???? 統一接收任務消息,處理不同的任務 ?* @author ZHF ?* ?*/ public?class?MainServices?extends?Service?implements?Runnable{ ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? //? 1.ArrayList是實現了基于動態數組的數據結構,LinkedList基于鏈表的數據結構。 //? 2.對于隨機訪問get和set,ArrayList優于LinkedList,因為LinkedList要移動指針。 //? 3.對于新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList要移動數據。 ????private?static?LinkedList<Task> tasks =?new?LinkedList<Task>();??//任務隊列,記得移除remove ????private?static?ArrayList<Activity> activities =?new?ArrayList<Activity>();??//存放需要返回數據的 View ????private?boolean?isRun =?false; ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????@Override ????public?void?onCreate() { ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????????isRun =?true; ????????Thread thread =?new?Thread(this); ????????thread.start(); ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????????super.onCreate(); ????} ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????/** ?????* 向集合中添加Activity對象 ?????* @param activity 需要向集合中添加的實例 ?????*/ ????public?static?void?addActivity(Activity activity) { ????????activities.add(activity); ????} ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????/** ?????* 向集合中添加任務 ?????* @param task 任務實例 ?????*/ ????public?static?void?newTask(Task task) { ????????tasks.add(task); ????} ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????/** ?????* 線程不斷檢測tasks中的任務 ?????*/ ????@Override ????public?void?run() { ????????while(isRun) { ????????????Task task =?null; ????????????if(!tasks.isEmpty()) { ????????????????task = tasks.poll(); ????????????????if(null?!= task) { ????????????????????doTask(task);?//處理任務 ????????????????} ????????????} ????????????try?{ ????????????????Thread.sleep(1000); ????????????}?catch?(InterruptedException e) { ????????????????e.printStackTrace(); ????????????} ????????} ????} ????/** ?????* 處理任務(重要) ?????* @param task? 任務實體 ?????*/ ????private?void?doTask(Task task) { ????????Message msg = handler.obtainMessage(); ????????msg.what = task.getTaskId();?//獲取任務ID ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????????switch?(msg.what) { ????????case?Task.FIRST_LOGIN: ????????????System.out.println("doTask---->>>first login!"); ????????????msg.obj =?"第一次登錄成功";??//傳遞處理完的數據 ????????????break; ????????default: ????????????break; ????????} ????????handler.sendMessage(msg); ????} ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????/** ?????* 處理器 ?????*/ ????private?Handler handler =?new?Handler() { ????????public?void?handleMessage(android.os.Message msg) { ????????????switch(msg.what) { ????????????case?Task.FIRST_LOGIN:??//登錄 ????????????????IActivity activity = (IActivity) getActivityByName("LoginActivity"); ????????????????activity.refresh(msg.obj); ????????????????break; ????????????//其他任務 ????????????} ????????} ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????}; ????/** ?????* 根據Activity的名字獲取集合中對應的Activity ?????* @param string? Activity的名字 ?????* @return ?????*/ ????private?Activity getActivityByName(String string) { ????????if(!activities.isEmpty()) { ????????????for?(Activity activity : activities) { ????????????????if(null?!= activity) { ????????????????????if(activity.getClass().getName().indexOf(string) >?0) {?//為何不寫!=-1,not subString,因為會忽略了單個字母的情況 ????????????????????????return?activity;??//獲取對應的Activity實例 ????????????????????} ????????????????} ????????????} ????????} ????????return?null; ????}; ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????//遍歷所有Activity并finish ????public?static?void?exit() { ????????for?(Activity activity : activities) { ????????????activity.finish(); ????????} ????????System.exit(0); ????} ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????@Override ????public?IBinder onBind(Intent intent) { ????????System.out.println("------->onBind"); ????????return?null; ????} ????@Override ????public?void?onStart(Intent intent,?int?startId) { ????????System.out.println("------->onStart"); ????????super.onStart(intent, startId); ????} ????@Override ????public?void?onDestroy() { ????????System.out.println("------->onDestroy"); ????????super.onDestroy(); ????} } |
這里用到了服務,所以記得在AndroidManifest中注冊:?
| 1 | <serviceandroid:name=".logic.MainServices"></service> |
二.IActivity接口
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package?com.zhf.android_framework01.ui; /** ?* 每個界面需要實現該接口,完成其中的抽象方法 ?* @author ZHF ?* ?*/ public?interface?IActivity { ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????/**初始化**/ ????public?abstract?void?init(); ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????/**刷新界面**/ ????public?abstract?void?refresh(Object?...params); } |
三.Task類
| 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 | package?com.zhf.android_framework01.model; import?java.util.Map; /** ?* 任務實體: 任務的ID,任務參數taskParams ?* @author ZHF ?* ?*/ public?class?Task { ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????public?static?final?int?FIRST_LOGIN =?0;?//登錄任務 ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????private?int?taskId;?//任務ID ????private?Map<String, Object> taskParams;?//任務參數 ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????public?Task(int?taskId, Map<String, Object> taskParams) { ????????this.taskId = taskId; ????????this.taskParams = taskParams; ????} ????public?int?getTaskId() { ????????return?taskId; ????} ????public?void?setTaskId(int?taskId) { ????????this.taskId = taskId; ????} ????public?Map<String, Object> getTaskParams() { ????????return?taskParams; ????} ????public?void?setTaskParams(Map<String, Object> taskParams) { ????????this.taskParams = taskParams; ????} } |
四.LoginActivity類
| 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 | package?com.zhf.android_framework01.ui; import?android.app.Activity; import?android.content.Intent; import?android.os.Bundle; import?android.view.View; import?android.view.View.OnClickListener; import?android.widget.Button; import?android.widget.TextView; import?android.widget.Toast; import?com.zhf.android_framework01.R; import?com.zhf.android_framework01.logic.MainServices; import?com.zhf.android_framework01.model.Task; /** ?* 登錄界面: 測試框架是否運行正常 ?* @author ZHF ?* ?*/ public?class?LoginActivity?extends?Activity?implements?IActivity{ ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????private?TextView textView; ????private?Button btn_login;?//登錄 ????private?Button btn_exit;?//退出 ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????private?Intent service; ????@Override ????protected?void?onCreate(Bundle savedInstanceState) { ????????super.onCreate(savedInstanceState); ????????setContentView(R.layout.activity_main); ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????????//啟動軟件界面后記得啟動后臺服務! ????????service =?new?Intent(this, MainServices.class);??//別忘了注冊! ????????startService(service);?//啟動服務 ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????????MainServices.addActivity(this);?//將該Activity實例加入到框架中,便于最終軟件的退出 ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????????this.btn_login = (Button)?this.findViewById(R.id.btn_login); ????????this.btn_login.setOnClickListener(new?OnClickListener() { ????????????@Override ????????????public?void?onClick(View v) { ????????????????Task task =?new?Task(Task.FIRST_LOGIN,null);?//生成任務 ????????????????MainServices.newTask(task); ????????????} ????????}); ????????this.btn_exit = (Button)?this.findViewById(R.id.btn_exit); ????????this.btn_exit.setOnClickListener(new?OnClickListener() { ????????????@Override ????????????public?void?onClick(View v) { ????????????????//停止服務 ????????????????stopService(service); ????????????????Toast.makeText(LoginActivity.this,?"后臺服務已停止!", Toast.LENGTH_SHORT); ????????????????MainServices.exit();??//將所有的Activity結束掉 ????????????} ????????}); ????????this.textView = (TextView)?this.findViewById(R.id.tv_login); ????} ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????@Override ????public?void?init() { ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????} ????@Override ????public?void?refresh(Object... params) { ????????//接收傳回的數據,刷新UI ????????this.textView.setText(params[0].toString()); ????} } |
還有一個xml:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?xml?version="1.0"?encoding="utf-8"?> <LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android" ????android:layout_width="fill_parent" ????android:layout_height="fill_parent" ????android:orientation="vertical"?> ????<TextView ????????android:id="@+id/tv_login" ????????android:layout_width="wrap_content" ????????android:layout_height="wrap_content" ????????android:text="TextView"?/> ????<Button ????????android:id="@+id/btn_login" ????????android:layout_width="match_parent" ????????android:layout_height="wrap_content" ????????android:text="點擊測試框架"?/> ????<Button ????????android:id="@+id/btn_exit" ????????android:layout_width="match_parent" ????????android:layout_height="wrap_content" ????????android:text="點擊退出程序"?/> </LinearLayout> |
效果圖:
------點擊測試框架--------->
ok! 這里我們就簡單的將一款軟件的代碼框架搭建起來了。以后我們創建Activity時,只需要按照下面這幾條模式來添加代碼,就十分的方便了!
框架流程:
1.每次創建Activity需實現IActivity接口.
2.在onCreate()中將Activity添加到集合中。
3.每次要進行操作時,可生成一個新的Task,將其添加到任務集合中即可。
4.在主框架代碼中根據任務的ID來調用方法處理任務事件--->處理完成之后將結果以obj的形式傳遞到Handler中----->利用多態調用對應的refresh()來對應傳遞數據,以達到刷新界面的效果。
5.退出程序時,可以調用主框架類MainServices中的exit()將所有的Activity關閉掉。(這里可以看一下前面的這篇博客:http://smallwoniu.blog.51cto.com/3911954/1248643)
附件:http://down.51cto.com/data/2363591
? ? ?本文轉自zhf651555765 51CTO博客,原文鏈接:http://blog.51cto.com/smallwoniu/1307060,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的【移动开发】Android应用程序中实用的代码框架(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大型网站架构之JAVA中间件
- 下一篇: MongoDB安装与副本集配置