android筆記選

    first  首先學會佈局 html


注入解放雙手,用好一些插件好比butterKnife能省去不少findViewById的麻煩; android

用好屬性動畫,看過不少App,引導頁帶動畫的給人第一印象就很好,畢竟這是一個看「臉」的時代; git

雖然App設計風格一直都是IOS,仍是要支持MaterialDesign,畢竟很 cool,如今市面上這樣風格的仍是比較少; github

熟悉android-support-v7-21新組件包,好比RecycleView、DrawerLayout、CardView等等都已經有很高使用率; 編程

佈局複雜致使的性能問題不容小覷,多看一些相關知識,精簡佈局; 設計模式

2.圖片方面: 緩存

最喜歡Picasso,尤爲是管道式的調用,編程之美啊; 安全

並且Picasso還能夠支持高斯模糊,太方便了; 性能優化

3.網絡方面: 網絡

如今的趨勢基本上都是okHttp + retrofit,還好以前實習的時候師兄用的就是這個,感受仍是很方便的;

retrofit的風格好像是傳說中的REST,下階段須要看看源碼;

圖片上傳是個問題;

4.第三方:    

如今的App基本都要有這些功能:.分享、支付、定位、推送、統計、buggly、第三方登陸,我只用太高德定位和百度定位、極光推送、友盟推送也只是負責埋點,還沒了解完整流程。下一階段須要通通使用一次。

在項目過程當中還發現一個問題,在A項目中集成了分享的Module,結果導入到B中仍是有問題,結果還得須要一我的從新集成一次,效率不高。須要注意不要實現功能就算了,要提成一個單獨的、可插拔的Module,寫好回調,作到一鍵集成。

5.工具方面: 

AndroidStudio仍是很強大的,不少細小的功能點須要咱們花時間去發現,好比說內存使用監控、截屏、gif錄製、當前git分支名稱等等均可以找到,不瞭解的話太惋惜了,國內有個鏡像網站能夠直接更新SDK,很強大http://www.androiddevtools.cn/

Gradle真是個神奇的東西,又能構建、又能依賴更新、還能多渠道打包,須要好好看看;Gradle官方文檔

Git如今公司使用率仍是比較高的,使用很差,同步時各類問題太蛋疼,有效使用能在development和release版本間實現良好控制、友好協做;Git詳解

Maven 這個是由於身邊人基本都會,好像在項目管理、減小本地代碼方面有很大做用,須要學習學習;

6.工具類方面: 

作個2個商業項目 ,發現工具類基本都是通用的,因此有必要維護本身的工具類,工具類的內容包括且不限於:

本地緩存類、文件管理類、Json處理類、日誌類、網絡狀況類、字符串類、手機系統信息類、線程池類、經常使用的UI類、6.0之後還須要權限類(用於動態提示用戶是否提供某權限)等等等等,遇到新功能就添進去,這就是本身的行走江湖的利器之一啊。

7.架構方面:

其實我是拒絕談架構的,畢竟我仍是隻小菜鳥。可是最近項目要更換MVP架構,我也學了學,發現了一個重要的問題—–>要想懂新架構的好舊架構的差,不學點設計模式是不行的。因此設計模式是下一階段的重要任務。

MVP如今我還理解不太深,仍是先作好第一步吧:減輕Activity任務,把點擊響應儘可能放到自定義View或者Fragment裏;

一說架構、性能,就得考慮線程管理方面的東西,雖然我如今接觸的很少,可是好的應用要經得起高併發纔對,因此這也不能忘記。

8.渠道發佈: 

每一個App上線的畢竟之路就是打包、發佈,鑑於國內應用市場雜亂,多達900+個市場,若是沒有很好的打包方式,一個個打豈不是累死。好在如今gradle打包很強大,不過我也只是據說,尚未親手接觸過,須要先學好Gradle,而後體會體會它的便捷啊!

   two,學會使用Android開發的書籍,教程,工具

入門書籍

《Google Androidsdk揭祕》


《Learning Android(中文版)》

本書爲Android開發入門圖書,按部就班地介紹瞭如何利用Android基本構件來實現構造用戶界面、存儲數據、鏈接網絡等實踐中必不可少的需求。做者以親手實現一個類Twitter的應用爲主線,經過不斷爲其添加功能展開講解。而這一學習過程積累出的代碼模式庫,能夠靈活運用於真實Android應用開發。本書內容包括但不限於:Android平臺概覽、Android設計架構、Android開發環境配置、基本Android的用戶界面構建、UI元件組織方法、構建執行後臺任務與更新數據的服務、AIDL與NDK介紹等。

Android瘋狂講義》

課程涵蓋所有Android應用開發的基礎,根據技能點的做用分爲5個篇章,包括環境篇、控件篇、佈局篇、組件篇和通用篇,本課程的目標就是「看得懂、學得會、作得出」,爲後續的學習打下夯實的基礎。

密西西比河谷州立大學:Android應用程序開發(英文視頻,中文字幕)

課程介紹基於Android平臺上的應用開發,課程分爲六個模塊,分別涉及Android平臺概述和其基本構件、初次編寫Android應用程序及接收和顯示網絡數據等內容。經過本課程,你將很好地瞭解Android平臺,瞭解如何運用Android平臺,以及進一步研究該平臺的學習方向。

Android攻城獅

課程由淺入深地帶您學會Android的經常使用控件的開發和使用,以知識概念爲主導,實例代碼爲驅動,帶您走入一個神奇的移動開發世界。


課程講帶你熟悉Android開發中經常使用的調試方式,各類對話框,各類提示菜單,各類動畫效果等,來進一步充實你的Android知識。

進階

《Android的設計與實現:卷1》

本書是Android應用開發工程師和Android系統工程師進階修煉的必讀之做。它由資深Android內核專家親自執筆,從源代碼角度,系統、深刻、透徹剖析Android系統框架層(Framework)的設計思想和實現原理,爲Android應用工程師和系統工程師解決實際工做中的各類難題提供了原理性的指導。爲了下降讀者的閱讀成本,《Android的設計與實現:卷1》使用了大量簡單的UML類圖和序列圖來展現類的層次結構和方法的調用流程,使讀者能迅速讀完《Android的設計與實現:卷1》並領會其精髓!

深刻探索

《深刻理解Android:卷1》

這是一本以情景方式對Android的源代碼進行深刻分析的書。內容普遍,以對Framework層的分析爲主,兼顧Native層和Application層;分析深刻,每一部分源代碼的分析都力求透徹;針對性強,注重實際應用開發需求,書中所涵蓋的知識點都是Android應用開發者和系統開發者須要重點掌握的。

《深刻理解Android:卷2》

「深刻理解Android」系列的第2本,第1本書上市後得到廣大讀者高度評價,在Android開發者社羣內口口相傳。《深刻理解Android:卷2》不只繼承了第1本書的優勢並改正了其在細微處存在的一些不足,並且還在寫做的整體思想上進行了創新,更強調從系統設計者的角度去分析Android系統中各個模塊內部的實現原理和工做機制。從具體內容上講,重點是Android Framework的Java層,對Java層涉及的核心模塊和服務進行了深刻而細緻的分析。經過《深刻理解Android:卷2》,讀者不只能對Android系統自己有更深刻的理解,並且還能掌握分析大型複雜源代碼的能力。

《Android應用性能優化》

今天的Android應用開發者常常要想盡辦法來提高程序性能。因爲應用愈來愈複雜,這個問題也變得愈來愈棘手。《Android應用性能優化》主要介紹如何快速高效地優化應用,讓應用變得穩定高效,你將學會利用Android SDK和NDK來混合或單獨使用Java、C/C++來開發應用。《Android應用性能優化中還特別講解了以下內容:一些OpenGL的優化技術以及RenderScript(Android的新特性)的基礎知識;利用SDK來優化應用的Java代碼的技巧;經過高效使用內存來提高性能的技巧;延長電池使用時間的技巧;使用多線程的時機及技巧;評測剖析代碼的技巧。

《Android軟件安全與逆向分析》

由淺入深、按部就班地講解了Android系統的軟件安全、逆向分析與加密解密技術。包括Android軟件逆向分析和系統安全方面的必備知識及概念、如何靜態分析Android軟件、如何動態調試Android軟件、Android軟件的破解與反破解技術的探討,以及對典型Android病毒的全面剖析。

工具和資源

官方資源

Android開發者中心

Android開發官方文檔。這個沒必要多說了。

Android 設計指南(官方英文版))》(非官方簡體中文版 

指導你設計一款Android應用。內容涉及:Android應用設計原則、UI概覽、風格、模式和控件設計方面。

技術問答

Stack Overflow。Stack Overflow Android的標籤頁包括很完整的信息,頗有參考價值!

週刊和聚合

Android週刊(英文) (中文)

每週更新的Android開發週刊。內容包括:開發資訊、技術文章、App設計、工具等。

Android開發話題

伯樂頭條的Android開發話題聚合了不少Android開發相關的文章、教程、資訊等。內容來自Android原創技術博客做者或者讀者分享,伯樂在線安卓頻道團隊整理。這個話題即將提供訂閱功能,關注話題後便可收到每週推送精選內容推送。

工具和開發庫

Android開源工具和庫

GitHub上最熱門的Android開源工具和開發庫。

Android開發工具(中文)

由伯樂在線安卓開發頻道團隊整理。持續更新各類優秀的Android開發工具。

其實Android的書籍不少,最基本的是掌握Android按鈕的代碼功能實現,其次多看看安卓巴士網站的代碼

三,Android經常使用代碼片斷

  

1
2
3
4
5
6
7
8
9
publicstaticintdip2px(Context context, floatdpValue) {
    finalfloatscale = context.getResources().getDisplayMetrics().density;
    return(int) (dpValue * scale + 0.5f);
}
 
publicstaticintpx2dip(Context context, floatpxValue) {
    finalfloatscale = context.getResources().getDisplayMetrics().density;
    return(int) (pxValue / scale + 0.5f);
}

px-sp轉換

1
2
3
4
5
6
7
8
9
publicstaticintpx2sp(Context context, floatpxValue) {
        finalfloatfontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return(int) (pxValue / fontScale + 0.5f);
    }
 
publicstaticintsp2px(Context context, floatspValue) {
        finalfloatfontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return(int) (spValue * fontScale + 0.5f);
    }

把一個毫秒數轉化成時間字符串


格式爲小時/分/秒/毫秒(如:24903600 –> 06小時55分03秒600毫秒)

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
/**
     * @param millis
     *            要轉化的毫秒數。
     * @param isWhole
     *            是否強制所有顯示小時/分/秒/毫秒。
     * @param isFormat
     *            時間數字是否要格式化,若是true:少位數前面補全;若是false:少位數前面不補全。
     * @return 返回時間字符串:小時/分/秒/毫秒的格式(如:24903600 --> 06小時55分03秒600毫秒)。
     */
    publicstaticString millisToString(longmillis, booleanisWhole,
            booleanisFormat) {
        String h = "";
        String m = "";
        String s = "";
        String mi = "";
        if(isWhole) {
            h = isFormat ? "00小時": "0小時";
            m = isFormat ? "00分": "0分";
            s = isFormat ? "00秒": "0秒";
            mi = isFormat ? "00毫秒": "0毫秒";
        }
 
        longtemp = millis;
 
        longhper = 60* 60* 1000;
        longmper = 60* 1000;
        longsper = 1000;
 
        if(temp / hper > 0) {
            if(isFormat) {
                h = temp / hper < 10? "0"+ temp / hper : temp / hper + "";
            } else{
                h = temp / hper + "";
            }
            h += "小時";
        }
        temp = temp % hper;
 
        if(temp / mper > 0) {
            if(isFormat) {
                m = temp / mper < 10? "0"+ temp / mper : temp / mper + "";
            } else{
                m = temp / mper + "";
            }
            m += "分";
        }
        temp = temp % mper;
 
        if(temp / sper > 0) {
            if(isFormat) {
                s = temp / sper < 10? "0"+ temp / sper : temp / sper + "";
            } else{
                s = temp / sper + "";
            }
            s += "秒";
        }
        temp = temp % sper;
        mi = temp + "";
 
        if(isFormat) {
            if(temp < 100&& temp >= 10) {
                mi = "0"+ temp;
            }
            if(temp < 10) {
                mi = "00"+ temp;
            }
        }
 
        mi += "毫秒";
        returnh + m + s + mi;
    }

格式爲小時/分/秒/毫秒(如:24903600 –> 06小時55分03秒)。

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
/**
     *
     * @param millis
     *            要轉化的毫秒數。
     * @param isWhole
     *            是否強制所有顯示小時/分/秒/毫秒。
     * @param isFormat
     *            時間數字是否要格式化,若是true:少位數前面補全;若是false:少位數前面不補全。
     * @return 返回時間字符串:小時/分/秒/毫秒的格式(如:24903600 --> 06小時55分03秒)。
     */
    publicstaticString millisToStringMiddle(longmillis, booleanisWhole,
            booleanisFormat) {
        returnmillisToStringMiddle(millis, isWhole, isFormat, "小時", "分鐘", "秒");
    }
 
    publicstaticString millisToStringMiddle(longmillis, booleanisWhole,
            booleanisFormat, String hUnit, String mUnit, String sUnit) {
        String h = "";
        String m = "";
        String s = "";
        if(isWhole) {
            h = isFormat ? "00"+ hUnit : "0"+ hUnit;
            m = isFormat ? "00"+ mUnit : "0"+ mUnit;
            s = isFormat ? "00"+ sUnit : "0"+ sUnit;
        }
 
        longtemp = millis;
 
        longhper = 60* 60* 1000;
        longmper = 60* 1000;
        longsper = 1000;
 
        if(temp / hper > 0) {
            if(isFormat) {
                h = temp / hper < 10? "0"+ temp / hper : temp / hper + "";
            } else{
                h = temp / hper + "";
            }
            h += hUnit;
        }
        temp = temp % hper;
 
        if(temp / mper > 0) {
            if(isFormat) {
                m = temp / mper < 10? "0"+ temp / mper : temp / mper + "";
            } else{
                m = temp / mper + "";
            }
            m += mUnit;
        }
        temp = temp % mper;
 
        if(temp / sper > 0) {
            if(isFormat) {
                s = temp / sper < 10? "0"+ temp / sper : temp / sper + "";
            } else{
                s = temp / sper + "";
            }
            s += sUnit;
        }
        returnh + m + s;
    }

把一個毫秒數轉化成時間字符串。格式爲小時/分/秒/毫秒(如:24903600 –> 06小時55分鐘)

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
/**
     *
     * @param millis
     *            要轉化的毫秒數。
     * @param isWhole
     *            是否強制所有顯示小時/分。
     * @param isFormat
     *            時間數字是否要格式化,若是true:少位數前面補全;若是false:少位數前面不補全。
     * @return 返回時間字符串:小時/分/秒/毫秒的格式(如:24903600 --> 06小時55分鐘)。
     */
    publicstaticString millisToStringShort(longmillis, booleanisWhole,
            booleanisFormat) {
        String h = "";
        String m = "";
        if(isWhole) {
            h = isFormat ? "00小時": "0小時";
            m = isFormat ? "00分鐘": "0分鐘";
        }
 
        longtemp = millis;
 
        longhper = 60* 60* 1000;
        longmper = 60* 1000;
        longsper = 1000;
 
        if(temp / hper > 0) {
            if(isFormat) {
                h = temp / hper < 10? "0"+ temp / hper : temp / hper + "";
            } else{
                h = temp / hper + "";
            }
            h += "小時";
        }
        temp = temp % hper;
 
        if(temp / mper > 0) {
            if(isFormat) {
                m = temp / mper < 10? "0"+ temp / mper : temp / mper + "";
            } else{
                m = temp / mper + "";
            }
            m += "分鐘";
        }
 
        returnh + m;
    }

把日期毫秒轉化爲字符串

1
2
3
4
5
6
7
8
9
10
11
12
/**
     * @param millis
     *            要轉化的日期毫秒數。
     * @param pattern
     *            要轉化爲的字符串格式(如:yyyy-MM-dd HH:mm:ss)。
     * @return 返回日期字符串。
     */
    publicstaticString millisToStringDate(longmillis, String pattern) {
        SimpleDateFormat format = newSimpleDateFormat(pattern,
                Locale.getDefault());
        returnformat.format(newDate(millis));
    }

把日期毫秒轉化爲字符串(文件名)

1
2
3
4
5
6
7
8
9
10
11
/**
     * @param millis
     *            要轉化的日期毫秒數。
     * @param pattern
     *            要轉化爲的字符串格式(如:yyyy-MM-dd HH:mm:ss)。
     * @return 返回日期字符串(yyyy_MM_dd_HH_mm_ss)。
     */
    publicstaticString millisToStringFilename(longmillis, String pattern) {
        String dateStr = millisToStringDate(millis, pattern);
        returndateStr.replaceAll("[- :]", "_");
    }

轉換當前時間爲易用時間格式


1小時內用,多少分鐘前; 超過1小時,顯示時間而無日期; 若是是昨天,則顯示昨天 超過昨天再顯示日期; 超過1年再顯示年。

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
publicstaticlongoneHourMillis = 60* 60* 1000; // 一小時的毫秒數
publicstaticlongoneDayMillis = 24* oneHourMillis; // 一天的毫秒數
publicstaticlongoneYearMillis = 365* oneDayMillis; // 一年的毫秒數
 
publicstaticString millisToLifeString(longmillis) {
        longnow = System.currentTimeMillis();
        longtodayStart = string2Millis(millisToStringDate(now, "yyyy-MM-dd"),
                "yyyy-MM-dd");
 
        // 一小時內
        if(now - millis <= oneHourMillis && now - millis > 0l) {
            String m = millisToStringShort(now - millis, false, false);
            return"".equals(m) ? "1分鐘內": m + "前";
        }
 
         // 大於今天開始開始值,小於今天開始值加一天(即今天結束值)
        if(millis >= todayStart && millis <= oneDayMillis + todayStart) {
            return"今天 "+ millisToStringDate(millis, "HH:mm");
        }
 
         // 大於(今天開始值減一天,即昨天開始值)
        if(millis > todayStart - oneDayMillis) {
            return"昨天 "+ millisToStringDate(millis, "HH:mm");
        }
 
        longthisYearStart = string2Millis(millisToStringDate(now, "yyyy"),
                "yyyy");
         // 大於今天小於今年
        if(millis > thisYearStart) {
            returnmillisToStringDate(millis, "MM月dd日 HH:mm");
        }
 
        returnmillisToStringDate(millis, "yyyy年MM月dd日 HH:mm");
    }

字符串解析成毫秒數

1
2
3
4
5
6
7
8
9
10
11
publicstaticlongstring2Millis(String str, String pattern) {
        SimpleDateFormat format = newSimpleDateFormat(pattern,
                Locale.getDefault());
        longmillis = 0;
        try{
            millis = format.parse(str).getTime();
        } catch(ParseException e) {
            Log.e("TAG", e.getMessage());
        }
        returnmillis;
    }

手機號碼正則


1
publicstaticfinalString REG_PHONE_CHINA = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";

郵箱正則

最後一點,就是使用Android測試工具,會測試Android程序bug更好,公司不想花錢請測試人員,Java程序使用junit測試工具,Android呢?----UI antomator,appium,monkeyrunner等Android測試工具.


  最後一點,就是感謝上帝,共享源代碼


end

adiOS

相關文章
相關標籤/搜索