您好,登錄后才能下訂單哦!
好久沒有更新博客了,這段時間里和我的小伙伴們(”烏索普“、”丁二爺“、”小娜“、‘小雯’‘)參加了一個大學生Android應用軟件比賽,利用兩個月的課余時間做了一款MFNote(多功能記事本)軟件,中間的苦這里就不多說了,大家都懂得~~ 搞IT的熬夜寫代碼,相信那是每一個有志青年都必須經(jīng)歷的。。。哈哈!
先來幾張軟件截圖:
有興趣的同學可以下載下來玩玩!軟件下載地址:http://apk.hiapk.com/html/2013/10/1874574.html
接下來的幾篇博客我將會逐一將整個項目中一些我認為比較好玩的地方分享給大家,當然如果大家下載了這款軟件覺得有想要學習的東西,留言給我,我會將其抽取出來與大家分享!
ok! 轉入正題,開始我們今天的內容:實用的代碼框架。
說到代碼框架,對于個人開發(fā)者來說,做一款簡單的android應用其實也用不到那么多的條條框框,但是如果是一個團隊的協(xié)作,共同寫代碼,那就得前期先將代碼的框架搭建好,這樣才能更好的進行團隊分工和編寫代碼。
一、MainServices類:
主框架類: 統(tǒng)一接收任務消息,處理不同的任務。
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; /** * 主框架類: 統(tǒng)一接收任務消息,處理不同的任務 * @author ZHF * */ public class MainServices extends Service implements Runnable{ // 1.ArrayList是實現(xiàn)了基于動態(tài)數(shù)組的數(shù)據(jù)結構,LinkedList基于鏈表的數(shù)據(jù)結構。 // 2.對于隨機訪問get和set,ArrayList優(yōu)于LinkedList,因為LinkedList要移動指針。 // 3.對于新增和刪除操作add和remove,LinedList比較占優(yōu)勢,因為ArrayList要移動數(shù)據(jù)。 private static LinkedList<Task> tasks = new LinkedList<Task>(); //任務隊列,記得移除remove private static ArrayList<Activity> activities = new ArrayList<Activity>(); //存放需要返回數(shù)據(jù)的 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 = "第一次登錄成功"; //傳遞處理完的數(shù)據(jù) 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; //其他任務 } } }; /** * 根據(jù)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中注冊:
<serviceandroid:name=".logic.MainServices"></service>
二.IActivity接口
package com.zhf.android_framework01.ui; /** * 每個界面需要實現(xiàn)該接口,完成其中的抽象方法 * @author ZHF * */ public interface IActivity { /**初始化**/ public abstract void init(); /**刷新界面**/ public abstract void refresh(Object ...params); }
三.Task類
package com.zhf.android_framework01.model; import java.util.Map; /** * 任務實體: 任務的ID,任務參數(shù)taskParams * @author ZHF * */ public class Task { public static final int FIRST_LOGIN = 0; //登錄任務 private int taskId; //任務ID private Map<String, Object> taskParams; //任務參數(shù) 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類
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) { //接收傳回的數(shù)據(jù),刷新UI this.textView.setText(params[0].toString()); } }
還有一個xml:
<?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! 這里我們就簡單的將一款軟件的代碼框架搭建起來了。以后我們創(chuàng)建Activity時,只需要按照下面這幾條模式來添加代碼,就十分的方便了!
框架流程:
1.每次創(chuàng)建Activity需實現(xiàn)IActivity接口.
2.在onCreate()中將Activity添加到集合中。
3.每次要進行操作時,可生成一個新的Task,將其添加到任務集合中即可。
4.在主框架代碼中根據(jù)任務的ID來調用方法處理任務事件--->處理完成之后將結果以obj的形式傳遞到Handler中----->利用多態(tài)調用對應的refresh()來對應傳遞數(shù)據(jù),以達到刷新界面的效果。
5.退出程序時,可以調用主框架類MainServices中的exit()將所有的Activity關閉掉。(這里可以看一下前面的這篇博客:http://smallwoniu.blog.51cto.com/3911954/1248643)
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。