標籤: 程式開發

感謝-維美優健康事業有限公司 委託開發客製化CRM(Customer Management Software)

維美優客戶去年12月份與我接洽,一直想開發自己量身客製化的顧客關係管理系統,尋找很多市面上現有的CRM,跟自己經營的營養健康管理咨詢需求無法契合,因此由我們進行分析現行咨詢客戶流程,進行文件系統化與客戶合約歸納存檔,並進行客戶銷售資料檢索與預計達成率、客戶預約課程管理、預約咨詢排程管理、相關營運報表.

ux-indonesia-2NDWFiD0UMM-unsplash

網智數位-開發團隊一直突破開發技術、累積各種產業知識,而且在窗簾、窗材、拉門、布料業的商業管理軟體投入有特別的領域知識、也在圖控軟體(圖控軟件)、機械手臂、Android APP 、iPhone APP、3D列印 開發一直突破再創新,我們也堅持相信好的軟體可以協助企業,不管在管理營運角度、商品創新、決策分析等都絕對是不可缺少的關鍵因素,如果客戶您有任何軟體開發、程式開發委外需求,請聯繫我們讓我們協助您一起討論如何開發一個好的軟體來協助您。

網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen
my_qrcode_1519621481105

社區型太陽能面板遠端中央監控系統暨電子看板(軟體開發、監控系統)

我們軟體開發團隊這個月協助南部的多個大樓管理委員會,建置太陽能電力即時監控系統 以及大樓社區收費管理系統,主要是目前台灣各縣市陸續很多地方都有擺放建置太陽能板,作為電力儲備與節能規劃,而建置太陽能儲備電力,但很多地方都沒有利用資訊科技、軟體開發來作為即時統計數字彙整,所以南部多個大樓社區知道我們軟體開發團隊很擅長物聯網(IOT)與軟體科技的整合,開始由我們建立社區型太陽能遠端監控系統,讓社區住戶或是有興趣的人可以隨時透過該系統查詢目前的太陽能板發電狀況。

LINE_ALBUM_AI產生圖_240211_156

 

專案開發預計完成功能:

1. 每個有安裝太陽能板的住戶皆安裝感應數據接收器,用來收集每個住戶的太陽能板發電狀況,包含該位置太陽強度、風向(風速在下階段規畫內)、灰塵、溫濕度、目前發電的電壓/電流

2. 資訊透過無線或是有線網路送到中央機房,在網路上可以提供查詢,也可以在APP上即時看到自己家的太陽能狀態。並且,利用這些資訊和每日的紀錄資料,可以預估未來的發電量和預計的售電利潤

3. 社區入口設置一大型LCD來即時展示目前整個社區的太陽能發電狀態、目前的發電量等等。若住戶有在系統選擇開放資訊,也會輪播每個住戶單獨的太陽板目前狀態/每日發電量等等的資訊表格。

網智數位-軟體開發,專門針對客戶進行量身設計的客製化軟體,已有多年經驗,也在不同產業領域都有實作成功案例。

 

 

 

 

 

網智數位-軟體開發(軟件開發)

針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰

業務合作、軟體委外開發

業務窗口:allen@netqna.com

聯繫電話:0920-883-870

公司電話:02-55991310

公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓

skype: netqna

line:netqna

微信:netqna

黃先生 Allen

my_qrcode_1519621481105

Android APP 非同步下載圖片實作(背景服務)-APP開發教學

  此篇文章主要是示範教學如何開發Android APP時,利用背景服務來進行比較耗時的工作,使得使用者可以不會覺得APP停頓當掉的錯覺。

   背景服務程式(背景執行緒)主要在比較複雜的APP應用程式,它在執行運作時,例如從網路下載檔案、讀取後端資料庫的資料、讀取手機記憶卡的資料時,會需要較多時間,所以系統畫面沒辦法即時回應,甚至出現【應用程式沒有回應】的對話視窗,詢問使用者是否繼續等待或結束APP程式。

  

    而透過在背後另外建立自己的執行緒,去獨立執行比較耗時的工作任務,跟主畫面的執行緒沒有關聯,完全不會影響主畫面的更新與停頓狀態.

     這類性質的工作就適合利用 Android API 提供的 AyncTask 執行緒.

下面我在 res/laylout 設計一個簡單的APP主畫

繪圖

<?xml version="1.0″ encoding="utf-8″?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#607D8B">

<!– 顯示圖片的元件 –>

<ImageView

android:id="@+id/imageview"

android:layout_width="match_parent"

android:layout_height="match_parent" />

<!– 開始下載圖片的按鈕元件 –>

<Button

android:id="@+id/download_btn"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_alignParentTop="true"

android:layout_margin="6sp"

android:onClick="clickDownLoadButton"

android:text="背後執行下載圖片"

android:textSize="24sp" />

<LinearLayout

android:id="@+id/op_panel"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignBottom="@id/imageview"

android:layout_centerInParent="true"

android:background="@drawable/operation_drawable"

android:orientation="horizontal"

android:padding="6sp"

android:visibility="invisible">

<!– 顯示前一張圖片 –>

<ImageButton

android:id="@+id/previous"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_weight="1″

android:onClick="clickMoveButton"

android:src="@drawable/ic_keyboard_arrow_left_white_48dp" />

<!– 顯示下一張圖片 –>

<ImageButton

android:id="@+id/next"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_weight="1″

android:onClick="clickMoveButton"

android:src="@drawable/ic_keyboard_arrow_right_white_48dp" />

</LinearLayout>

</RelativeLayout>

程式解說:

上面主要畫面配置檔,提供一個按鈕,可以下載7張圖片,並將下載的圖片依序可以輪流顯示每張圖片,每張圖片都是透過背後執行緒進行下載,檔執行任務完成後,在將 LinearLayout容器顯示出來,這個容器很簡單放入兩個 ImageButton ,用來切換上一

張與下一張圖片。

現在回到 Java 主程式,宣告一個繼承

AppCompatActivity 的類別

public class AsyncTaskDemo extends AppCompatActivity {

private ImageView imageview;

private LinearLayout op_panel;

private Bitmap[] images;

// 目前畫面顯示的圖片編號

private int position = 0;

// 顯示下載進度用的進度對話框

private ProgressDialog progressDialog;

程式解說:


在上面主要宣告幾個欄位 Fields , 用來對應之前的配置畫面元件,還有 Bitmap[] 陣列,存放下載的圖片,以及一個進度用的是從 PrgressDialog。

然後重點在 Button 圖片下載的程式碼邏輯:

public void clickDownLoadButton(View view) {

// 這邊可以讓下載按鈕消失

findViewById(R.id.download_btn).setVisibility(View.INVISIBLE);

// 建立下載圖片的AsyncTask物件

final DownloadImageTask downloadImageTask = new DownloadImageTask();

// 顯示 進度對話框

progressDialog = new ProgressDialog(this);

progressDialog.setTitle(“Download");

progressDialog.setMessage(“Please wait for download…");

progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

progressDialog.setProgress(0);

progressDialog.setCancelable(false);

// 加入取消工作的按鈕

progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, “Cancel",

new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

// 取消AsyncTask的工作,參數指定為true,表示取消正在執行的工作

// 呼叫這個方法的AsyncTask物件,在結束doInBackground方法後,

// 不會呼叫onPostExecute方法,改為呼叫onCancelled方法

downloadImageTask.cancel(true);

}

});

// 顯示進度對話框

progressDialog.show();

// 啟動AsyncTask物件

downloadImageTask.execute();

}

上面程式主要宣告一個 DownloadImageTask ,

這個程式主要是繼承了 AsyncTask 類別

// 呼叫這個物件的execute方法後就會執行這個方法

// 參數是AsyncTask泛型指定的第一個型態的陣列

@Override

protected Void doInBackground(Void… args) {

// 讀取陣列資源,下載的圖片名稱

Resources res = getResources();

String[] imageNames =

res.getStringArray(R.array.android_icons_array);

// 讀取儲存圖片的網路位置

String baseUrl = getString(R.string.base_url);

// 設定進度對話框的最大進度數量

progressDialog.setMax(imageNames.length);

for (int i = 0; i < imageNames.length; i++) {

// 判斷是否取消工作

if (isCancelled()) {

break;

}

// 下載圖片的完整網址

String url = baseUrl + imageNames[i];

// 從網際網路下載圖片

downloads.add(loadBitmap(url));

// 執行進度處理,參數會傳送給onProgressUpdate方法

publishProgress(i + 1);

}

// 如果已經下載圖片

if (downloads.size() > 0) {

// 建立儲存圖片的Bitmap陣列

images = new Bitmap[downloads.size()];

// 把List物件轉換為陣列

downloads.toArray(images);

}

return null;

}

// 執行進度處理,參數是AsyncTask泛型指定的第二個型態的陣列

// 在doInBackground方法中,呼叫publishProgress方法後,

// 就會執行這個方法並接收放在publishProgress方法中的參數

@Override

protected void onProgressUpdate(Integer… values) {

// 設定進度對話框的進度

progressDialog.setProgress(values[0]);

// 設定ImageView使用的ImageView物件

imageview.setImageBitmap(downloads.get(downloads.size() – 1));

}

// doInBackground方法結束後就會執行這個方法

// 參數是AsyncTask泛型指定的第三個型態的陣列

// 接收doInBackground方法的回傳值

@Override

protected void onPostExecute(Void result) {

// 結束進度對話框

progressDialog.dismiss();

// 設定ImageView使用的ImageView物件

imageview.setImageBitmap(images[0]);

// 顯示上下張圖片的操作按鈕

op_panel.setVisibility(View.VISIBLE);

}

// 呼叫cancel方法後執行這個方法

// 參數是AsyncTask泛型指定的第三個型態的陣列

// 接收doInBackground方法的回傳值

@Override

protected void onCancelled(Void result) {

if (images != null) {

// 設定ImageView使用的ImageView物件

imageview.setImageBitmap(images[0]);

// 顯示上下張圖片的操作按鈕

op_panel.setVisibility(View.VISIBLE);

}

}

完成上面所有程式,就完成一個非同步的下載圖片實作案例,這邊我是預期看這篇實作教學的本身對 Android 開發有一定的經驗,如果對於這篇教學有任何問題,可以寄發郵件向我詢問。

程式執行結果

繪圖2

繪圖3

網智數位-軟體開發(軟件開發)

針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰

業務合作、軟體委外開發

業務窗口:allen@netqna.com

聯繫電話:0920-883-870

公司電話:02-55991310

公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓

skype: netqna

line:netqna

微信:netqna

黃先生 Allen

my_qrcode_1519621481105

ERP Plus AI 對紡織業龍頭大廠的關鍵角色

   我曾經在成衣上市知名公司軟體開發部門服務過,特別體會到人人說的夕陽產業,但確能如此獲利驚人,其中主要的關鍵因素,就是掌舵者如何帶領企業與時俱進地調整企業策略來快速調整企業營運方向,才可以面對產業競爭日益激烈。

 

IMB00576_IMB00576013

 

   這當然一個重要成敗關鍵要素,就是好的ERP管理系統,可以迅速了解在世界各地的工廠,哪裡生產成本較低廉、產能足夠滿足客戶交貨日、再例如今年發生激烈的中美貿易戰,好的系統應該可以知道那裡生產、那裡採購,可以有效降低關稅成本、運輸成本、如何不同區域生產再進行合單,(題外話,中美貿易戰,讓我越南的客戶轉單效益明顯增加XDXD) ,今天就看到成衣大廠出現一個ERP + AI 的應用提升了,公司的訂單能見度、透過AI自動辨識各種訂單來源並轉至各個子系統。

    企業董事長進一步解釋,紡織業的訂單其實非常複雜,不像一般訂單只有品名和數量,而是隱含非常多的資訊,例如:織法、顏色、原物料、洗標上的資訊…等,再加上訂單本身格式也不一致,有些是 Word 檔、PDF 檔或是一封電子郵件。

 

     如此複雜多元的訂單來源與格式,導致儒鴻在接到客戶訂單後,須仰賴專員人工判讀、手動輸入再加以彙整,才能將訂單上的各式資料轉至 ERP 系統,產出工單、採購單…等等單據,進行後續的生產排程作業。

   「儒鴻的目標是 2020 年前,所有的管理系統都能智慧化,也就是做到資訊自動拋轉,」洪鎮海說,因為目前的管理系統是以財務會計為核心去設計,為了配合財會作業,導致很多作業流程不順暢,未來希望能結合 AI 技術優化流程,讓資訊可以自動拋轉至相關系統。再接下來,則是 2022 年走向生產製造智慧化,將 AI 技術大量導入工廠,並將各個作業站點整合起來,實現工業 4.0 的目標。

 

    綜觀現今歐美各國製造大廠,皆紛紛透過智慧化及大數據分析的轉型,創造出更多服務價值,台灣製造業若是要繼續保持競爭力,勢必得向儒鴻一樣,積極擁抱科技創新,才能在國際市場上永保領先地位。

 

部分來源是來自 https://buzzorange.com/techorange/2018/11/13/textile-industry-in-transformation/?fbclid=IwAR1–REv_GPwT-PzXqfHviIGLy0sO61EQfb309XLuNEBHpzUI99t-vbibr4

 

(其他筆者自行撰寫參考文章)

 MPS主生產計畫專文介紹(一)
MRPⅡ/ERP 能力需求計畫原理
庫存管理-概念與釐清
庫存管理探討-VMI
真正的庫存量形成探討
庫存管理的中樞控管法則(上)
庫存管理的中樞控管法則(下)
庫存目標6大範疇(程式開發、程式設計、軟體開發、系統開發)
BOM表管理與設定﹣輔料是否需輸入BOM
何謂 進銷存、ERP、WMS?三者差異性【軟體開發、軟件開發、程式設計】
ERP 產品成本管理與計算
庫存量正確性衡量法則
粗能力需求計畫(RCCP) – 專文介紹
如何利用軟體來協助企業銷售統計和分析
開發進銷存、ERP、PDM,物料欄位收集與建立重要性(ERP開發、軟體開發、進銷存)
ERP 各種計劃階段的差異
ERP 系統的淺談與優勢
ERP 系統在中小企業如何有效利用條碼與QRCode
[ ERP/MRP 系統 ] – 專案導入深入剖析
ERP 導入的投資報酬評估(ERP客製化、進銷存軟體)
ERP 與 CRM 整合對企業的重要性(軟體開發、ERP客製化)

網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

 my_qrcode_1519621481105

傢具批發業 B To C 貿易業軟體(軟體開發、客製化軟體、軟件開發)

       上個星期在台中一個從事家具貿易業(上得國際貿易股份有限公司)的老闆聯繫我,說他找了很多家軟體,包含 正航、凌越 等知名進銷存套裝軟體(事實上我對這些套裝軟體是給予正面評價,任何軟體一定有它生存地優勢),但都無法符合他的公司的運作流程,因為他們在大陸有工廠合夥公司,所以需整合大陸的流程,而客戶的下單確實屬於 B to C模式,也就是跟市面上所有知名套裝軟體流程都不一樣,客戶(上得)公司本身不輸入訂單,訂單是開放給第三者(也就是此貿易商的客戶,例如大型傢具業、跑單幫客戶、知名連鎖店等),在網路下單並由這些第三者客戶指定此(上得)貿易商如何多批出貨,也就是貿易商也同時是物流配送角色,所以貿易商的客戶群是訂單的下單者、出貨排單者,卻更具有挑戰性地系統功能是,庫存量查詢必須是針對這些客戶,可以查詢各自的已下單未出貨的產品庫存量,這流程是屬與 B to C範疇,一般這些套裝軟體根本無法支援,所以客戶正式委託我們進行量身客製化的軟體設計與程式開發,並未來計劃再分不同階段進行系統開發。

 

LINE_ALBUM_AI產生圖_240212_790LINE_ALBUM_AI產生圖_240212_791

 

網智數位-軟體開發,專門針對客戶進行量身設計的客製化軟體,已有多年經驗,也在不同產業領域都有實作成功案例。

網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

my_qrcode_1519621481105

區塊鏈挖礦-電力、算力監控管理軟體(雲端挖礦平台)

網智數位-軟體開發團隊與台灣比特幣挖礦知名團隊-比特空間,可參閱(https://www.facebook.com/btspace/)與非凡新聞強力報導-台灣真行第46集 比特空間https://www.youtube.com/watch?=E8Qssnd_0Kw),該比特幣團隊已經擁有數百臺機器進行挖礦算力運作買賣。

      也因為隨著挖礦機器數量越來越多,需要投入大量人力時間進行監控,所以委託我們開發團隊,進行開發管理數百臺挖礦機,可以得知每臺挖礦算力效益、運作狀態、發送mail通知挖礦機異常、顯示卡效能統計圖表、整合全球最大的算力平台 NiceHash,進行快速呈現每台目前的挖礦算力狀況。

 

客戶挖礦雲端中心

LINE_ALBUM_AI產生圖_240212_617LINE_ALBUM_AI產生圖_240212_619

 

網智數位-軟體開發,專門針對客戶進行量身設計的客製化軟體,已有多年經驗,也在不同產業領域都有實作成功案例。

 

網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen
my_qrcode_1519621481105

模具行業管理軟體-ERP軟體開發、客製化軟體

            就在上個月一家在印尼多年(印尼石通企業),再從事生產模具開發、維修服務的台商找上我 Allen,希望我可以協助量身定做模具行業的生產管理流程,開發符合他們的軟體系統,因為之前他們委託過其他軟體合作廠商,但總覺得系統無法真的流程整合,因此該公司總經理在印尼9月份就透過Line 與我聯繫,先確定我是否在行業的流程整合可以給予整合意見,並提供他們現在的軟體系統畫面給我,告知他們使用上遇到的瓶頸,線上討論幾次確認我們是可以提供客製化服務,就回台灣時與我們當面討論許久,並正式分多次階段委託我們正式進行客製化軟體開發,幫工廠端可以提升資訊化管理能力。

LINE_ALBUM_AI產生圖_240211_266LINE_ALBUM_AI產生圖_240211_287

網智數位-軟體開發,專門針對客戶進行量身設計的客製化軟體,已有多年經驗,也在不同產業領域都有實作成功案例。

 

 

網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

my_qrcode_1519621481105

Flir、Fluke 報告輸出軟體-案例分享 – 客製化軟體、軟體開發、軟件開發

我們累積了多年的軟體開發設計經驗,針對許多產業領域,幾乎都從無到有地,跟客戶需求討論與了解,到開發出客戶需要的軟體,這邊我要分享我們針對機電顧問產業,常需要派出很多工程師前往客戶那邊進行拍照(紅外線熱像儀 Flir / Fluke),拍完照回到公司,要花很多人工作業時間進行貼圖製作、報告內容異常原因判斷、溫度等資訊填寫,花了許多時間才能製作好一個給客戶的報告內容,因此萌生了設計出一套有效率的管理輸出檢驗輸出報告軟體,只要透過軟體系統,指定拍照的資料夾位置,系統可以批次匯入所有照片,並進而歸類整理出客戶、區域、設備位置、盤名名稱、檢測人員、氣溫、濕度、以及根據指定的程式,進行判斷檢測結果,如下圖系統自動產生的報告樣式之一

螢幕快照 2018-10-08 下午8.28.42

我們也聆聽客戶使用軟體需求的反饋,因常常要定期送出臺電的制式報告,如高低壓電力設備定期檢測紀錄總表、高壓保護電驛檢測紀錄表、低壓設備檢測紀錄 、高低壓設備熱顯影檢測紀錄 規範報表格式等。


系統軟體都可以直接支援自動匯出符合提供給臺電的報告格式。

系統-檢測報告輸出選項

螢幕快照 2018-10-08 下午8.35.23

高低壓設備熱顯影檢測紀錄(八張格式)

螢幕快照 2018-10-08 下午8.37.22


針對歷年的報告,都可以下條件,搜尋列出

螢幕快照 2018-10-08 下午8.39.25

軟體客製化案例分享-


網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen
my_qrcode_1519621481105

裝潢報價、設計業報價系統、木工估價系統

網智數位-今年針對木工裝潢業、建材行、土木工程業量身定做一套報價軟體,該系統軟體這個月又收到客戶的建議,我們進行優化改善一下幾個功能與報表。

1.裝潢業一開始根據客戶需求預算進行估價後,常常遇到客戶需要追加減估價項目,而估價項目我們的系統也可以單獨呈現報表給客戶簽收,以及收款金額也會自動累積統計。

螢幕快照 2018-09-26 下午9.51.55

在原本的估價單畫面,可以切換到 -估價單追加減項明細 頁籖

系統保留了10個追加減,可以針對每次客戶需求變動,增加多筆估價項目


每次的追加,都可以個別列印出追加的估價項目,也可以選取是否列印價格

螢幕快照 2018-09-26 下午10.02.25

螢幕快照 2018-09-26 下午10.02.46


2.估價單,會自動統計所有的追加減項目與金額,讓你一目了然

螢幕快照 2018-09-26 下午10.07.57


3.可以列印出規範的合約書,並記錄在估價單,未來可以追溯估價單的合約編號。


4.多條件搜尋所有估價單,並自動計算符合條件的估價單,交易金額、已收取金額、未收餘額、折讓金額,並可以連動開立收款單,在一個表單畫面一次完成作業與統計。

螢幕快照 2018-09-26 下午10.10.37

這邊我們只列出部分功能,其他功能或者有特殊客製化需求,都可以與我們聯繫,我們在軟體開發、客製化與系統導入在各行業已有多年經驗,都可以協助提升客戶的作業效率、數據分析全面提升客戶的管理競爭力。


網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen
my_qrcode_1519621481105

Xamarin 跨平台程式開發-訊息傳遞 – 軟體開發 教學

   在 Xamarin 開發 IOS、Android、UWP APP時,常常會遇到訊息接受與訊息傳遞,那麼這邊我想簡單示範如何在 Xamarin 實作一個訂閱訊息程式開發技巧。

Android 執行結果畫面

螢幕快照 2018-07-25 下午10.27.43螢幕快照 2018-07-25 下午10.28.49螢幕快照 2018-07-25 下午10.29.10

   Xamarin 透過 MessagingCenter 這個靜態類別來支援訂閱/通知訊息,這個類別主要需要知道三個 Methods ,分別為 Subscribe<TSender, TArgs> 與 Send<TSender, TArgs>、Unsubscribe<TSender, TArgs>。

Subscribe<TSender, TArgs> 方法用來訂閱訊息,當有訊息接受到時,可以通知使用者,例如出現對話訊息、畫面顯示訊息。

Send<TSender, TArgs> 方法用來通知訊息,已告知那些訂閱訊息者。

Unsubscribe<TSender, TArgs> 原先進行訂閱訊息接受,現在進行取消訂閱,後續如果有訊息通知,都不進行接受訊息。

程式範例示範

image

public class MainPageViewModel
     {
         public ObservableCollection<string> Greetings { get; set; }


        public MainPageViewModel ()
         {
             Greetings = new ObservableCollection<string> ();


           MessagingCenter.Subscribe<MainPage> (this, “哈嘍", (sender) => {
                 Greetings.Add(“哈嘍");
             });


            MessagingCenter.Subscribe<MainPage, string> (this, “哈嘍", (sender, arg) => {
                 Greetings.Add(“哈嘍 " + arg);
             });

         }
     }

在上面程式範例 宣告 一個 MainPageViewModel Class,這個作為 ViewModel 用途,在建構式裡實作訂閱服務,這個機制可以減少程式物件耦合度。

下面這行程式碼,主要是用於實作一個名叫 “哈嘍”的訂閱服務  MessagingCenter.Subscribe<MainPage> (this, “哈嘍", (sender) => {  Greetings.Add(“哈嘍"); });


在底下的主程式 MainPage ,實作訂閱通知服務,主要程式邏輯,我透過註解程式說明

public partial class MainPage : ContentPage
     {
         public MainPage()
         {
             InitializeComponent();


            //這邊我綁定一個ViewModel
             BindingContext = new MainPageViewModel();


            //宣告一個按鈕物件,當點選按鈕時,觸發一個發送訊息
             var button1 = new Button { Text = “Say 哈嘍" };
             button1.Clicked += (sender, e) =>
             {
                 MessagingCenter.Send<MainPage>(this, “哈嘍");
             };


            //宣告一個按鈕物件,當點選按鈕時,觸發一個發送訊息,並傳遞內容參數,傳遞的內容是 Allen
             var button2 = new Button { Text = “Say Hi to Allen" };
             button2.Clicked += (sender, e) =>
             {
                 MessagingCenter.Send<MainPage, string>(this, “哈嘍", “Allen");
             };


            //宣告一個按鈕物件,當點選按鈕時,觸發一個取消訂閱服務,並取消對話視窗訊息!
             var button3 = new Button { Text = “取消訂閱服務,並取消對話視窗訊息!" };
             button3.Clicked += (sender, e) =>
             {
                 MessagingCenter.Unsubscribe<MainPage, string>(this, “哈嘍");
                 DisplayAlert(“取消訂閱服務",
                     “This page has stopped listening, so no more alerts; however the ViewModel is still receiving messages.",
                     “OK");
             };


            //訂閱服務(背後的ViewModel還是仍然保持本身實作的訂閱服務),並出現對話視窗訊息
             MessagingCenter.Subscribe<MainPage, string>(this, “哈嘍", (sender, arg) =>
             {
                 DisplayAlert(“訊息已接受", “參數訊息 為 " + arg, “OK");
             });


            //綁定接受到的訂閱訊息
             var listView = new ListView();
             listView.SetBinding(ListView.ItemsSourceProperty, “Greetings");


            //放置物件內容
             Content = new StackLayout
             {
                 Padding = new Thickness(0, 20, 0, 0),
                 Children = { button1, button2, button3, listView }
             };
         }


在 iPhone X 執行畫面如下

螢幕快照 2018-07-25 下午10.20.29螢幕快照 2018-07-25 下午10.20.46

網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen
my_qrcode_1519621481105