溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

【移動開發(fā)】Android應用程序中實用的代碼框架(一)

發(fā)布時間:2020-06-19 15:32:14 來源:網(wǎng)絡 閱讀:3593 作者:zhf651555765 欄目:開發(fā)技術

好久沒有更新博客了,這段時間里和我的小伙伴們(”烏索普“、”丁二爺“、”小娜“、‘小雯’‘)參加了一個大學生Android應用軟件比賽,利用兩個月的課余時間做了一款MFNote(多功能記事本)軟件,中間的苦這里就不多說了,大家都懂得~~ 搞IT的熬夜寫代碼,相信那是每一個有志青年都必須經(jīng)歷的。。。哈哈!【移動開發(fā)】Android應用程序中實用的代碼框架(一)


先來幾張軟件截圖:

【移動開發(fā)】Android應用程序中實用的代碼框架(一)【移動開發(fā)】Android應用程序中實用的代碼框架(一)【移動開發(fā)】Android應用程序中實用的代碼框架(一)


有興趣的同學可以下載下來玩玩!軟件下載地址:http://apk.hiapk.com/html/2013/10/1874574.html


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


ok! 轉入正題,開始我們今天的內容:實用的代碼框架。


說到代碼框架,對于個人開發(fā)者來說,做一款簡單的android應用其實也用不到那么多的條條框框,但是如果是一個團隊的協(xié)作,共同寫代碼,那就得前期先將代碼的框架搭建好,這樣才能更好的進行團隊分工和編寫代碼。

【移動開發(fā)】Android應用程序中實用的代碼框架(一)

一、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>

效果圖:

【移動開發(fā)】Android應用程序中實用的代碼框架(一)------點擊測試框架--------->【移動開發(fā)】Android應用程序中實用的代碼框架(一)


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)





附件:http://down.51cto.com/data/2363591
向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI