天天看點

【移動開發】Android應用程式中實用的代碼架構(一)

【移動開發】Android應用程式中實用的代碼架構(一)

先來幾張軟體截圖:

接下來的幾篇部落格我将會逐一将整個項目中一些我認為比較好玩的地方分享給大家,當然如果大家下載下傳了這款軟體覺得有想要學習的東西,留言給我,我會将其抽取出來與大家分享!

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&lt;Task&gt; tasks = </code><code>new</code> <code>LinkedList&lt;Task&gt;();  </code><code>//任務隊列,記得移除remove</code>

<code>    </code><code>private</code> <code>static</code> <code>ArrayList&lt;Activity&gt; activities = </code><code>new</code> <code>ArrayList&lt;Activity&gt;();  </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----&gt;&gt;&gt;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) &gt; </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>"-------&gt;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>"-------&gt;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>"-------&gt;onDestroy"</code><code>);</code>

<code>        </code><code>super</code><code>.onDestroy();</code>

<code>}</code>

這裡用到了服務,是以記得在AndroidManifest中注冊: 

<code>&lt;</code><code>serviceandroid:name</code><code>=</code><code>".logic.MainServices"</code><code>&gt;&lt;/</code><code>service</code><code>&gt;</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&lt;String, Object&gt; taskParams; </code><code>//任務參數</code>

<code>    </code><code>public</code> <code>Task(</code><code>int</code> <code>taskId, Map&lt;String, Object&gt; 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&lt;String, Object&gt; getTaskParams() {</code>

<code>        </code><code>return</code> <code>taskParams;</code>

<code>    </code><code>public</code> <code>void</code> <code>setTaskParams(Map&lt;String, Object&gt; 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>&lt;?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"utf-8"</code><code>?&gt;</code>

<code>&lt;</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>&gt;</code>

<code>    </code><code>&lt;</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>/&gt;</code>

<code>    </code><code>&lt;</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>/&gt;</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>/&gt;</code>

<code>&lt;/</code><code>LinearLayout</code><code>&gt;</code>

效果圖:

ok! 這裡我們就簡單的将一款軟體的代碼架構搭建起來了。以後我們建立Activity時,隻需要按照下面這幾條模式來添加代碼,就十分的友善了!

架構流程:

1.每次建立Activity需實作IActivity接口.

2.在onCreate()中将Activity添加到集合中。

3.每次要進行操作時,可生成一個新的Task,将其添加到任務集合中即可。

4.在主架構代碼中根據任務的ID來調用方法處理任務事件---&gt;處理完成之後将結果以obj的形式傳遞到Handler中-----&gt;利用多态調用對應的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,如需轉載請自行聯系原作者