手把手教你做個人 app

来源:http://www.cnblogs.com/WuXiaolong/archive/2017/01/06/6256810.html
-Advertisement-
Play Games

我們都知道,開發一個app很大程度依賴服務端:服務端提供介面數據,然後我們展示;另外,開發一個app,還需要美工協助切圖。沒了介面,沒了美工,app似乎只能做成單機版或工具類app,真的是這樣的嗎?先來展示下我的個人app,沒有服務端,沒有美工完成的,換言之,我幹了所有人的活: 這個app叫“微言” ...


我們都知道,開發一個app很大程度依賴服務端:服務端提供介面數據,然後我們展示;另外,開發一個app,還需要美工協助切圖。沒了介面,沒了美工,app似乎只能做成單機版或工具類app,真的是這樣的嗎?先來展示下我的個人app,沒有服務端,沒有美工完成的,換言之,我幹了所有人的活:

這個app叫“微言”,他對於我意義很重大,最初微言只是我一個練手的項目,剛剛工作,技術有限,微言只是sqlite記事本類app,只能本地操作,後來慢慢演變現在幾近完美的app,從中我學到很多,熟悉了立項到上線的整個流程,最新技術得以實踐,從一個程式猿思維從而向產品思維轉變,簡單的Photoshop等。當然長期的積累自然會帶來經濟方面的收益,這裡秀下我的app廣告收益,我的所有app之和:

最多一個月4000多,4000多什麼概念,比我當時薪資都高呢,這些“成就”有了我可以在此吹牛的資本,哈哈哈!

接下來,我一一分析,帶您完成這樣的一個完整的app。

沒有服務端

jsoup

我無意聽到大牛同事說到解析html,比較有興趣去搜索這是什麼玩意兒,知道了一個強大的東西jsoup,jsoup能解析html,即網站,於是我的微言脫離了單機版。對用戶而言,他不在乎數據從何而來,管您是從介面取的還是解析html,他們關心的是app體驗和功能的完善。我就這樣瞞天過海,數據取之網頁了,群里之前太多人太多人問我用的什麼伺服器,回覆太多次解析html後就不願意再回覆了。

我選擇這種方式有個最大的好處就是數據不需要本人維護,巧妙地避開了我不會服務端開發,更不需要做介面;解析html也有個最大的弊端,一旦對方網站節點變化了,或許您的app就掛了,必須及時去更新。

使用方法

步驟一
首先網路請求,這裡用的Retrofit,具體見:Android MVP+Retrofit+RxJava實踐小結。以解析我的博客http://wuxiaolong.me/ 示例,可以拿到類似以下數據:

在谷歌瀏覽器,我的博客頁面點擊右鍵-查看網頁源代碼(V),同樣看到以上數據。

步驟二
1、app/build.gradle

compile 'org.jsoup:jsoup:1.10.1'

2、解析html
要訣:多觀察html節點、標簽。
先觀察我們要解析的數據(以我的博客http://wuxiaolong.me/ 示例),首頁分別有標題、發表時間、文章分類、文章評論、文章摘要5個元素谷歌瀏覽器,我們這次只需要標題、發表時間、文章摘要;可以看到我的博客是分頁,第一頁網址是http://wuxiaolong.me 和第二頁網址卻是http://wuxiaolong.me/page/2/ ,之後區別就是頁碼,因此app做分頁的話要判斷第一頁和其他頁,最終我做成的效果:

我們一一分析,關於jsoup語法,這裡不說,見 jsoup官網

(1)標題數據結構如下:

<h1 class="post-title" itemprop="name headline">
<a class="post-title-link" href="/2016/10/31/AppShortcuts/" itemprop="url">Android App Shortcuts</a>
</h1>

觀察可根據class="post-title"的getElementsByClass解析:

//responseBody是retrofit網路請求返回的,轉成String,即我們需要解析的數據
Document document = Jsoup.parse(new String(responseBody.bytes(), "UTF-8"));
List<Element> titleElementList = new ArrayList<>();
Elements titleElements = document.getElementsByClass("post-title-link");
for (Element element : titleElements) {
    titleElementList.add(element);
    //text拿到文本,如這裡的“Android App Shortcuts”
    LogUtil.d("text=" + element.text());
    //拿到href屬性值,如這裡“/2016/10/31/AppShortcuts/”,即博客鏈接,如果跳轉詳情需要加上“http://wuxiaolong.me”
    LogUtil.d("href=" + element.attr("href"));
}

(2)發表時間數據結構如下:

<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">發表於</span>
<time itemprop="dateCreated" datetime="2016-10-31T21:49:53+08:00" content="2016-10-31">2016-10-31</time>
</span>

觀察,同樣用getElementsByClass解析:

List<Element> timeElementList = new ArrayList<>();
Elements timeElements = document.getElementsByClass("post-time");
for (Element element : timeElements) {
    //這裡通過解析"time"標簽,然後取文本,即“2016-10-31”
    LogUtil.d("time=" + element.getElementsByTag("time").text());
    timeElementList.add(element);
}

(3)文章摘要數據結構如下:

<div class="post-body" itemprop="articleBody">
<h1 id="簡介"><a href="#簡介" class="headerlink" title="簡介"></a>簡介</h1>
<p>Android 7.1允許您定義應用程式中特定操作的快捷方式。這些快捷鍵可以顯示桌面,例如Nexus和Pixel設備。快捷鍵可讓您的用戶在應用程式中快速啟動常見或推薦的任務。<br>每個快捷鍵引用一個或多個意圖,每個意圖在用戶選擇快捷方式時在應用程式中啟動特定操作。可以表達為快捷方式的操作示例包括:<br>
<div class="post-more-link text-center">
<a class="btn" href="/2016/10/31/AppShortcuts/" rel="contents">
閱讀全文 &raquo;</a>
</div>
</p>
</div>

恩,也是用的getElementsByClass解析:

List<Element> bodyElementList = new ArrayList<>();
Elements bodyElements = document.getElementsByClass("post-body");
for (Element element : bodyElements) {
    //這裡用text()只是拿到文本,但我想要直接返回html標簽,很好,jsoup有html()方法。
    LogUtil.d("body=" + element.html());
    bodyElementList.add(element);
}

3、核心代碼

private void loadMyBlog() {
    Call<ResponseBody> call;
    //分頁處理
    if (page == 1) {
        call = apiStores.loadMyBlog();
    } else {
        call = apiStores.loadMyBlog(page);
    }
    call.enqueue(new RetrofitCallback<ResponseBody>() {
        @Override
        public void onSuccess(ResponseBody responseBody) {
            try {
                Document document = Jsoup.parse(new String(responseBody.bytes(), "UTF-8"));
                List<Element> titleElementList = new ArrayList<>();
                Elements titleElements = document.getElementsByClass("post-title-link");
                for (Element element : titleElements) {
                    titleElementList.add(element);
                    //LogUtil.d("text=" + element.text());
                    //LogUtil.d("href=" + element.attr("href"));
                }
                List<Element> timeElementList = new ArrayList<>();
                Elements timeElements = document.getElementsByClass("post-time");
                for (Element element : timeElements) {
                    //LogUtil.d("time=" + element.getElementsByTag("time").text());
                    timeElementList.add(element);
                }
                //Elements categoryElements = document.getElementsByClass("post-category");
                //for (Element element : categoryElements) {
                //    LogUtil.d("category=" + element.getElementsByTag("a").text());
                //}
                List<Element> bodyElementList = new ArrayList<>();
                Elements bodyElements = document.getElementsByClass("post-body");
                for (Element element : bodyElements) {
                    LogUtil.d("body=" + element.html());
                    bodyElementList.add(element);
                }
                if (page == 1) {
                    dataAdapter.clear();
                }
                dataAdapter.addAll(titleElementList, timeElementList, bodyElementList);
                if (titleElementList.size() < 8) {
                    //因為我的博客一頁8條數據,當小於8時,說明沒有下一頁了
                    pullLoadMoreRecyclerView.setHasMore(false);
                } else {
                    pullLoadMoreRecyclerView.setHasMore(true);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        @Override
        public void onFailure(int code, String msg) {
            toastShow(msg);
        }
        @Override
        public void onThrowable(Throwable t) {
            toastShow(t.getMessage());
        }
        @Override
        public void onFinish() {
            pullLoadMoreRecyclerView.setPullLoadMoreCompleted();
        }
    });
    addCalls(call);
}

jsoup解析源碼

解析我的博客源碼已經上傳我的github,見:https://github.com/WuXiaolong/WeWin

想必這樣一一分析,您一定會jsoup解析html,如果還不會,私下給我發個大紅包,我再手把手教您,發個超大紅包,今晚我就是您的啦,嘿嘿。

題外

可能您擔心,jsoup解析html,這樣爬蟲難道不侵權嗎?是的,我也擔心,所以我的app也只在我的群里“宣傳宣傳”。

bmob

仔細的您,肯定發現了,jsoup爬數據,只能做展示功能,那我的微言里不是有評論功能嘛!這是怎麼做到的呢?我剛開始做app那會,個人app是做不了POST功能的,但bmob出現解決了個人開發者這個沒有伺服器的痛點,它就相當於一個資料庫,提供了sdk,您可以做增刪改查操作,我們只需要專註客戶端,後端就不用管了,話說如此,我們還是稍微懂點資料庫知識的,以便於我們更好利用bmob。除了bmob,現在還有leancloud、apicloud等都有類似的服務,很感謝他們,及時解決我們的剛需,個人app還可以有一線生機。

關於bmob、leancloud、apicloud如何使用,我知道聰明的您已經在看他們的官方文檔了。

沒有美工

美工切圖

在實際開發中,有些效果,只需要美工做張圖片就能輕鬆搞定,沒有美工切圖的配合,app開發似乎難以進展下去了,是嗎?其實我在《Android Design Support Library使用》一文提到一句話:“目前這個sample,Material design風格的效果都有了,相當一個空殼子,您只需在實際開發中塞真實數據就是一個perfect app”,對,就用谷歌的Material design風格就OK了,它提供了一套規範、圖片,足夠我們個人app使用了,而且現在還有vector,更是強大之極。比如微言-每日推薦右上角的刷新按鈕,如圖:

相應的xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_refresh"
        android:icon="@drawable/ic_loop_24dp"
        android:title="刷新"
        app:showAsAction="always" />
</menu>

平時ic_loop_24dp肯定是張圖片,然而我用的vector,代碼如下:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
    <path
        android:fillColor="?attr/colorControlNormal"
        android:pathData="M12,4L12,1L8,5l4,4L12,6c3.31,0 6,2.69 6,6 0,1.01 -0.25,1.97 -0.7,2.8l1.46,1.46C19.54,15.03 20,13.57 20,12c0,-4.42 -3.58,-8 -8,-8zM12,18c-3.31,0 -6,-2.69 -6,-6 0,-1.01 0.25,-1.97 0.7,-2.8L5.24,7.74C4.46,8.97 4,10.43 4,12c0,4.42 3.58,8 8,8v3l4,-4 -4,-4v3z"/>
</vector>

是不是很神奇,vector如何創建:

這裡隨便演示,創建了一個vector,關於vector學習可參考醫生的《Android Vector曲折的相容之路》一文,寫的很詳細,這裡不多說了。

app圖標

app當然希望有個漂亮的有意義的圖標,會用到Photoshop,我當然不會啊,那必須得學啊。一般安卓市場需要圖標尺寸1616,4848,512512,圓角,Android開發需要4848,7272,9696,144144,196196,因此PS的時候,只需要做個最大尺寸512*512,然後縮小即可。
圖標的PS步驟:
1、用photoshop打開您想修改的圖片
2、在左側工具欄中選擇“圓角矩形工具”(預設的是“矩形工具”,您只需要右擊圖標就可以發現“圓角矩形工具”),如上圖
3、在上面“半徑”框中輸入您想要的圓角半徑,一般圖片選25即可,為了效果明顯我設置為40,看上圖有一個框顯示半徑40.
4、在打開的圖片上畫一個圓角矩形,把圖片覆蓋住。
5、對著已經被覆蓋的圖片選區右擊,選擇“建立選區”,如果有視窗彈出直接點擊“確定”,在彈出的選項中直接點擊“確認”
6、在上方的“選擇”選項卡中點擊,在下拉框中找到“反向”,也可以使用快捷鍵ctrl+shilf+i。
7、在右下方的圖層欄中雙擊“背景”圖片(上面第一張圖片右下角可以看到),如果有視窗彈出直接點擊“確定”,完成解鎖。
8、按鍵盤上的"DELETE"鍵清除四個直角。
9、繼續右擊“形狀1”(在畫面右下方圖層那裡可以找到),在彈出選項中選擇“刪除圖層”,如果有視窗彈出直接點擊“是”。
10、OK,您可以看到一個圓角圖片。
11、最後在左上角點擊文件--》存儲為--》選擇png格式(其他格式也可以),完成。

為什麼微言的圖標是一個“言”字,因為我覺得這樣簡潔大方,簡單明瞭,言簡意賅……算了,不裝了,其他我不會P啊!

推廣技巧

做完一個個人app,是不是很有成就感啊,上線安卓市場,卻沒幾個下載量,尼瑪,勞資花了很長時間呢,這麼牛B的app怎麼沒人下載?!心情一下子跌倒谷底,那得讓更多的人知道自己的app啊,我是這樣做的:

1、邀請好評
您去下載一個app時,可能會看下這個app的評論,如果有很多好評,您會不會更願意去下載呢,是的,來看我的微言好評如潮:

哈哈哈,是不是很牛,邀請評論我寫成了工具類了,請笑納:

public class InviteCommentUtil {
    private String mDateFormat = "yyyy-MM-dd";
    private String mInviteCommentTime;

    /**
     * 選擇哪天彈邀請評論框
     */
    public void startComment(final Activity activity) {
        mInviteCommentTime = PreferenceUtils.getPreferenceString(activity, "inviteCommentTime", TimeUtil.getCurrentTime(mDateFormat));
        String saveCommentTime = PreferenceUtils.getPreferenceString(activity, "saveCommentTime", TimeUtil.getCurrentTime(mDateFormat));
          int compareDateValue = TimeUtil.compareDate(mInviteCommentTime, saveCommentTime, mDateFormat);
        if (compareDateValue == 1) {
            AlertDialog.Builder builder = new AlertDialog.Builder(
                    activity);
            int nowReadingTotal = ReadUtil.getReadedTotal();
            builder.setMessage(Html.fromHtml("您已經累計閱讀<font color=#FF0000>" + nowReadingTotal + "</font>字,再接再厲哦!如果喜歡我,希望您能在應用市場給予<font color=#FF0000>五星</font>好評!"));
            builder.setTitle("求好評");
            builder.setPositiveButton("好評鼓勵",
                    new android.content.DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            setComment(activity);
                            try {
                                Intent intent = new Intent(
                                        "android.intent.action.VIEW");
                                intent.setData(Uri
                                        .parse("market://details?id=com.android.xiaomolongstudio.weiyan"));
                                activity.startActivity(intent);
                                activity.overridePendingTransition(
                                        R.anim.enter_right_to_left, R.anim.exit);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }

                            dialog.dismiss();
                        }
                    });
            builder.setNegativeButton("下次再說",
                    new android.content.DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            setComment(activity);
                            dialog.dismiss();
                        }
                    });
            builder.create().show();
        }
    }

    /**
     * 保存,直到下周再提示
     */
    private void setComment(Activity activity) {
        PreferenceUtils.setPreferenceString(activity, "saveCommentTime", mInviteCommentTime);
    }
}

註意:這裡邀請評論時間控制好,不能太頻繁了,不然用戶會反感的。

2、專註一個市場
不知道您有沒有發現,某個市場您明明沒有發佈,卻能搜到您的app,沒錯,一些市場會抓您的這個app,比如豌豆莢,百度,因此策略,專註一個市場,這個市場出名了,還怕其他市場不知道嗎?當然我們是爭取每個市場都能發佈上線,多一個下載是一個。
微言位於分類下前排

多次進入精品系列

如何進入前排或精品,邀請好評是關鍵的一步。

3、新品推薦
新品上線,很多市場有新品推薦,比如小米、妹紙、360、應用寶,一般需要自薦,一旦被推薦,下載量是可觀的,微言肯定被推薦過啦。哦,更新版本也算新品哦。

4、微博
這是我好哥們教我的,他真的好牛,個人app做的更牛,給您們看一個鏈接:http://weibo.com/p/1008082a702d2cb6146485e5dc3d624d31def6 ,就知道如何在微博上推廣了,沒錯,就是話題,用兩個#號圈起來,發微博,就是一個話題,別人可以這個話題下討論,無形中形成了推廣作用。

5、app分享
app分享功能肯定是要做的,萬一用戶覺得您的這個app很棒,想推薦給好友,結果沒分享功能,豈不歇菜,分享微博可以加兩個#號圈起來哦。

6、QQ群
如果您直接群里發app的下載鏈接,只會一個結果:被T。像我們程式猿,大部分都是技術群,我的做法是寫文章分享我app用的技術,文章會附上app下載地址,然後有這個技術興趣的人可能詢問,這樣我就名正言順地“推廣”了,哈哈,我好壞!

以上僅我知道的,不一定有效,畢竟我不是專業的推廣人員。

如何賺錢

萬事俱備,只欠東風,當您的用戶量足夠大的時候,自然有人找您,投資您的app,這個過程前期0收益,耗得精力時間不算,可能還得燒錢,不適合個人開發者,我選擇的是賺賺小錢,app加廣告的方式。
廣告平臺選擇第三方的,最早我使用的多盟,但是一段時間發現我根本沒什麼收益,感覺多盟扣量好嚴重,之後嘗試多易傳媒、艾德思奇、芒果聚合,也使用過點樂積分,發現一些市場不讓上線積分類app,放棄之,還有百度移動廣告聯盟、騰訊的廣點通,谷歌的也玩過,收益最穩定屬百度的,這點不黑它。
至於廣告集成,也是提供sdk,自行去他們的官網瞭解吧。

推薦閱讀

一套完整的Android通用框架
Android Design Support Library使用
AndroidMVPSample

聯繫作者

我的微信公眾號:吳小龍同學,歡迎關註交流~

最後

我的幾個app,都是我個人做到了很滿意,功能都很完善,以至於我後來覺得沒什麼好更新的,再加上廣告收益好也就一段時間,移動廣告商雨後春筍,導致廣告單價太低,而且安卓市場對個人開發者各種限制,比如不讓上線視頻類app;某度,某60必須用自家的加固才讓上線app等,就沒什麼動力繼續維護app,做事還是要有動力的,不然活著幹嗎?不過我知道有人還在堅持做個人app,做的好的,日入幾百甚至上千的。app最終目的就是賺錢。



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • service—Android的四大組件之一。人稱“後臺服務”指其本身的運行並不依賴於用戶可視的UI界面 實際開發中我們經常需要service和activity之間可以相互傳遞數據維持程式的運行。 先瞭解Service的生命周期吧。 新建一個類繼Service: 新建以上類並繼承Service後只會 ...
  • Android Butterknife 8.4.0 使用方法總結 ...
  • Android SDK版本號 與 API Level 對應關係如下表: Code nameVersionAPI level (no code name) 1.0 API level 1 (no code name) 1.1 API level 2 2008 年9月發佈的Android第一版 Cupc ...
  • APP簡介 律師查詢是基於聚合數據的律師查詢介面做的,這個介面目前處於停用狀態,但是,由於我是之前申請的,所以,還可以用,應該是無法再申請了。 效果圖 開發 一、HttpHelper 既然是請求介面的,那就少不了請求方式,這裡是比較常用的HttpClient,用起來也比較方便,單獨封裝一個HttpH ...
  • 作者:Antonio Leiva 時間:Jan 5, 2017 原文鏈接:https://antonioleiva.com/lambdas-kotlin/ 由於Lambda表達式允許更簡單的方式建模式函數,所以它是Kotlin和任何其他現代開發語言的最強工具之一。 在Java6中,我們僅能下麵方法這 ...
  • 看完這篇你學到什麼: 熟悉gradle的構建配置 熟悉代碼構建環境的目錄結構,你知道的不僅僅是只有src/main 開發、生成環境等等環境可以任意切換打包 多渠道打包 APK輸出文件配置 需求 一般我們開發的環境分為:debug 和 release,但是你想再分內測1環境、內測2環境等等怎麼辦呢? ...
  • UI層複習筆記 在main文件中,UIApplicationMain函數一共做了三件事 根據第三個參數創建了一個應用程式對象 預設寫nil,即創建的是UIApplication類型的對象,此對象看成是整個應用程式的一個抽象,負責存儲應用程式的狀態。 根據第四個參數創建了一個應用程式代理類對象 所謂代 ...
  • 昨天 提交App Store 的時候被拒了 We discovered one or more bugs in your app when reviewed on iPhone running iOS 10.2 on Wi-Fi connected to an IPv6 network. Speci ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...