20172327 2017-2018-2 《第一行代碼Android》第一章學習總結

來源:互聯網
上載者:User

標籤:目標   特定   not   nal   組複製   模式切換   ble   1.0   樣本   

學號 2017-2018-2 《第一行代碼Android》第一章學習總結教材學習內容總結
- Android系統架構:


1.Linux核心層

Android系統是基於Linux核心的,這一層為Android裝置的各種硬體提供了底層的驅動,如顯示驅動,音頻驅動,照相機驅動,藍牙堆疊,Wi-Fi驅動,電源管理等。

2.系統運行底層

- 通過一些C/C++庫來為Android系統提供了主要的特性支援

庫名 功能
SQLite庫 提供資料庫的支援
OpenGL/ES庫 提供3D繪圖支援
Webkit庫 提供了瀏覽器核心的支援


- Android執行階段程式庫(主要提供一些核心庫,允許開發人員使用Java語言來編寫Android應用。)
Dalvik虛擬機器(5.0系統後改為ART運行環境) 使每個Android應用都能運行在獨立進程當中,並擁有一個自己的Dalvik虛擬機器執行個體。

3.應用程式框架層

主要提供了構建應用程式時可能用到的各種API,Android內建的核心應用就是使用這些API完成的,開發人員也可以用這些API來構建自己的應用程式。

4.應用程式層

應用程式都是屬於這一層,連絡人,簡訊,遊戲等都是。


總結:

  • 1 Android的系統架構採用分層架構的思想,架構清晰,層次分明,協同工作。
  • 2 Android的系統架構不僅從宏觀上認識了Android系統,同時,也給我們的學習與實踐指明了方向。若是從事Android應用開發,那應該研究Android的應用程式框架層和應用程式層;若是從事Android系統開發,那應該研究Android的系統庫和Android運行時;若是從事Android驅動開發,那應該研究Android的Linux核心。總之,找准切入點,實踐出真知。
- Android應用開發特色:


1.四大組件

  • 活動(Activity)
    Android應用程式的門面,凡是你在應用中看到得東西,都是放在活動中。
  • 服務(service)
    無法看到,在後台默默運行,退出應用後,服務仍然是可以繼續啟動並執行。
  • 廣播接收器(Broadcast Receiver)
    允許你的應用接收來自各處的廣播訊息,如電話,簡訊等。
  • 內容提供器(Content Provider)
    程式之間共用資料。


2.豐富的系統控制項

  • Android為開發人員提供了豐富的系統控制項,可以使我們輕鬆的編寫出漂亮的介面。你也可以定製自己的控制項。


3.SQLite資料庫

  • 輕量級,運行速度快,嵌入式,關係型資料庫。支援SQL文法,還可通過Android封裝好的API進行操作,讓儲存和讀取資料更方便。


4.強大的多媒體

  • 音樂,視頻,錄音,拍照,鬧鐘等,均可通過代碼控制。


5.地理位置定位

  • 地理位置定位應該是一個亮點,Android手機內建GPS,所以走到哪都可以定位到自己的位置,發揮出創意十足的應用,結合地圖功能,LBS (通過電信行動電信業者的無線電通訊網路(如GSM網、CDMA網)或外部定位方式(如GPS)擷取移動終端使用者的位置資訊(地理座標,或大地座標),在地理資訊系統(外語縮寫:GIS、外語全稱:Geographic Information System)平台的支援下,為使用者提供相應服務的一種增值業務。)這一領域潛力無限。
- 開發環境構建工具:


1.JDK

  • JDK是Java語言的軟體開發套件,它包含了Java的運行環境,工具合集,基礎類庫等內容。


2.Android SDK

  • Android SDk 是Google提供的Android開發套件,在開發Android程式時,我們需要通過引入該工具包,來使用Android相關的API。


3.Android Studio

  • 2013年Google推出的一款官方的IDE工具,不在以外掛程式形式存在,Android Studio在開發Android程式方面遠比以前用的Eclipse強大和方便的多。
- 分析Android程式:


建立完畢以後,將項目結構模式切換成Project

1.整體目錄結構分析


說明:除了APP目錄外,其他目錄都是自動產生的。APP目錄的下的內容才是我們的工作重點。

2.APP目錄結構分析


說明:程式的預設運行效果就是不寫一行代碼,直接部署到模擬器上的運行效果。

3.定義主活動

        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />                //這兩句代碼錶示MainActivity是主活動,點擊表徵圖後首先運行此活動            </intent-filter>        </activity>


說明: 這段代碼錶示對MainActivity活動進行註冊,沒有在AndroidManifest.XML中註冊的活動是不能使用的。

4.主活動分析

package com.example.zy.myapplication;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity {    protected void onCreate(Bundle savedInstanceState) {        //活動被建立必須要調用下述的方法        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }}


說明:
1.我們之前說了應用程式中所有的可以看到的東西都是放到活動中的,所以首先必須要繼承自活動。
  2.主活動的繼承關係:

  3.super.onCreate(savedInstanceState)就是調用父類的onCreate建構函式,時用來建立活動的,savedInstanceState是儲存當前Activity的狀態資訊。

5.HelloWorld來自哪?
其實在Android程式的設計講究邏輯和視圖分類,因此是不推薦在活動中直接編寫介面的,更加通用的方法是在布局檔案中編寫介面,然後在活動中引入進來。

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.zy.myapplication.MainActivity">    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="Hello World!" /></RelativeLayout>


說明: 我們看到其中有一個TextView,這是Android的一個控制項,用於在布局中顯示文字的。

6.詳解res目錄


說明:之所以有這麼多的mipmap開頭的檔案夾,其實主要是為了讓程式能夠更好地相容各種裝置。
開啟values目錄下的strings.xml檔案:

<resources>    <string name="app_name">My Application</string></resources>

這裡定義了一個應用程式名稱的字串,我們可以使用以下兩種方式引用它:

  • 在代碼中通過: ◇ R.string.app_name
  • 在XML檔案通過: ◇ @string/app_name


7.詳解build.gradle
在AS中,我們是通過Gradle來構建項目的。Gradle是一個非常先進的項目構建工具,它使用了一種基於Groovy的領特定領域語言(DSL)來聲明項目設定,摒棄了傳統基於 XML的繁瑣配置。

I.最外端的build.gradle

buildscript {    repositories {        jcenter()    }    dependencies {        classpath ‘com.android.tools.build:gradle:2.1.0‘    }}allprojects {    repositories {        jcenter()    }}


說明:

  • 兩處repositories中都使用了jcenter(),jcenter是一個代碼託管倉庫,很多Android開源項目都會選擇將代碼託管到jcenter上,聲明了這些配置,我們就可以在項目中輕鬆引用任何jcenter上的開源項目了。
  • dependencies 使用了classpath 聲明了一個Cradle外掛程式。


II.APP目錄下的build.gradle

apply plugin: ‘com.android.application‘android {    compileSdkVersion 25    buildToolsVersion "25.0.2"    defaultConfig {        applicationId "com.example.zy.myapplication"        minSdkVersion 15        targetSdkVersion 25        versionCode 1        versionName "1.0"    }    buildTypes { //用於指定產生安裝檔案的相關配置,一般有release和deubug兩項。        release {            minifyEnabled false  //是否對代碼進行混淆            proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘ //代碼的混淆規則        }    }}dependencies { //用於指定當前項目的所有依賴關係    compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])    //上著為本地依賴關係,將libs目錄下*jar包添加到構建路徑當中        testCompile ‘junit:junit:4.12‘    //聲明測試案例庫的    compile ‘com.android.support:appcompat-v7:25.2.0‘    //這是一個標準的遠程依賴庫格式,Gradle在構建項目時會檢查是否有此庫的緩衝,如果沒有則連網下載.添加依賴庫聲明:compile project(‘:helper‘),將helper依賴關係加入.}


說明:

  • 第一行引用了一個外掛程式,com.android.application‘是一個應用程式模組,可以直接運行,com.android.library是一種庫模組,只能作為程式碼程式庫依附於別的應用程式模組來運行。
  • 接下來是一個大的Android閉包,這個閉包可以配合項目構建的各種屬性。
        compileSdkVersion 25 :指定使用Android6.0系統的SDK編譯。
        buildToolsVersion :指定項目構建工具的版本。
  • 接下來是一個defaultConfig閉包,可以對項目的更多細節進行配置。
        applicationId :執行項目的包名
         minSdkVersion 15 項目最低相容的Android系統版本
         targetSdkVersion 25 你在該秒版本上做過了充分的測試,系統會為你的應用程式啟動一些最新的功能和特性。
         versionCode 1 項目版本號碼
         versionName "1.0" 項目的版本名
- 可見度:


1.父類的私人成員也被子類繼承,雖不能以成員名直接地訪問這些私人成員,但可以間接地訪問。

- 類間繼承關係地設計:

1.軟體設計中必須特別精心地研究和設計類間繼承關係地參差結構。

2.final方法常用於保證該方法能在所有的子類中得到使用。final修飾符也可以作用於整個類。final類不能再用於派生新類。

教材學習中的問題和解決過程
  • 問題1:許可權修飾符有哪些,分別有什麼作用?
  • 問題1解決方案:


1: 什麼是許可權修飾符,他有什麼作用,為什麼需要他;

一個Java應用有很多類,但是有些類,並不希望被其他類使用。每個類中都有資料成員和方法成員,但是並不是每個資料和方法,都允許在其他類中調用。如何能做到存取控制呢?就需要使用存取權限修飾符。

1.許可權修飾符就是用於控制被修飾變數、方法、類的可見範圍.也就是其作用範圍;


2:java中許可權修飾符包括4種:

1.公用類型 public ;

2.public可以修飾類,成員變數,構造方法,方法成員。

3.被public修飾的成員,可以在任何一個類中被調用,不管同包或不同包,

4.是許可權最大的一個修飾符

1.私人類型 private;
2.可以修飾成員變數,構造方法,成員方法,不能修飾類(此處指外部類,不考慮內部類)。
3.被private修飾的成員,只能在定義它們的類中使用,在其他類中不能調用。
1.預設類型 default;
2.可用於修飾類,成員變數,構造方法,方法,都能夠使用預設許可權,即不寫任何關鍵字。
3.預設許可權即同包許可權,同包許可權的元素只能在定義它們的類中,以及同包的類中被調用。
1.保護類型 protect;
2.可以修飾資料成員,構造方法,方法成員,不能修飾類(此處指外部類,不考慮內部類)。
3.被protected修飾的成員,能在定義它們的類中,同包的類中被調用。
4.如果有不同包的類想調用它們,那麼這個類必須是定義它們的類的子類。

圖片:


3: 關於許可權修飾符還要注意幾個問題;

1.並不是每個修飾符都可以修飾類(指外部類),只有public和default可以。

2.所有修飾符都可以修飾資料成員,方法成員,構造方法。

3.為了代碼安全起見,修飾符不要盡量使用許可權大的,而是適用即可。比如,資料成員,如果沒有特殊需要,儘可能用private。加強封裝性;

4.修飾符修飾的是“被訪問”的許可權。

  • 問題2:this和super引用有啥不同:
  • 問題2解決方案:
this

this是自身的一個對象,代表對象本身,可以理解為:指向對象本身的一個指標。this的用法在java中大體可以分為3種:
1.普通的直接引用
這種就不用講了,this相當於是指向當前對象本身。
2.形參與成員名字重名,用this來區分.
3.引用建構函式this(參數):
調用本類中另一種形式的建構函式(應該為建構函式中的第一條語句)。
super

super可以理解為是指向自己超(父)類對象的一個指標,而這個超類指的是離自己最近的一個父類。super也有三種用法:
1.普通的直接引用
與this類似,super相當於是指向當前對象的父類,這樣就可以用super.xxx來引用父類的成員。
2.子類中的成員變數或方法與父類中的成員變數或方法同名
3.引用建構函式
super(參數):調用父類中的某一個建構函式(應該為建構函式中的第一條語句)。
super和this的異同:

super(參數):調用基類中的某一個建構函式(應該為建構函式中的第一條語句)
this(參數):調用本類中另一種形成的建構函式(應該為建構函式中的第一條語句)
super: 它引用當前對象的直接父類中的成員(用來訪問直接父類中被隱藏的父類中成員資料或函數,基類與衍生類別中有相同成員定義時如:super.變數名 super.成員函資料名(實參)
this:它代表當前對象名(在程式中易產生二義性之處,應使用this來指明當前對象;如果函數的形參與類中的成員資料同名,這時需用this來指明成員變數名)
調用super()必須寫在子類構造方法的第一行,否則編譯不通過。每個子類構造方法的第一條語句,都是隱含地調用super(),如果父類沒有這種形式的建構函式,那麼在編譯的時候就會報錯。
super()和this()類似,區別是,super()從子類中調用父類的構造方法,this()在同一類內調用其它方法。
super()和this()均需放在構造方法內第一行。
儘管可以用this調用一個構造器,但卻不能調用兩個。
this和super不能同時出現在一個建構函式裡面,因為this必然會調用其它的建構函式,其它的建構函式必然也會有super語句的存在,所以在同一個建構函式裡面有相同的語句,就失去了語句的意義,編譯器也不會通過。
this()和super()都指的是對象,所以,均不可以在static環境中使用。包括:static變數,static方法,static語句塊。
從本質上講,this是一個指向本對象的指標, 然而super是一個Java關鍵字。
  • 問題3:Java語言的設計者為啥明確決定不支援多繼承?
  • 問題3解決方案:


James Gosling在1995年2月發表了一篇名為”Java概覽”的Java白皮書,文章解釋了Java不支援多重繼承的原因。

Java去除了一些C++中很少用、而且被經常誤解而錯用的功能,如操作符的重載(operator overloading)(儘管Java仍舊保留方法的重載),多重繼承(multiple inheritance),以及廣泛的自動強迫同型(extensive automatic coercions)。

我想在這裡分享一下James Gosling對於Java的定義。
Java: 一種簡單的,物件導向的,分布式的,解釋型的(譯者註:Java既不是純解釋型也不是純編譯型的語言),健壯的,安全的,架構中立的,可移植的,高效能的,支援多線程的,動態語言。


看看定義的美妙之處吧。現代程式語言應該有這樣的特性。我們看到,定義第一個特性是什嗎?是簡單。


為了強化簡單這個特點,這就是我們去除多重繼承的原因。下面來看個例子,多重繼承的菱形繼承問題。

tupian


有兩個類B和C繼承自A。假設B和C都繼承了A的方法並且進行了覆蓋,編寫了自己的實現。假設D通過多重繼承繼承了B和C,那麼D應該繼承B和C的重載方法,那麼它應該繼承哪個的呢?是B的還是C的呢?


C++中經常會掉入這個陷阱,雖然它也提出了替代的方法來解決這個問題。我們在Java中就不會出現這個問題。就算兩個介面擁有同樣的方法,實現的類只會有一個方法,這個方法由實現的類編寫。動態載入類會讓多重繼承的實現變得困難。

代碼調試中的問題和解決過程
  • 問題1:在做pp9.1時,遇到到了下面這個問題
    圖片115054
  • 問題1解決方案:這是我對Coin類完全沒改造成的,在Coin類中,我們應該將face的修飾符改為protected。
  • 問題2:在做pp9.1時,我在測試類別中選擇建立一個大小為5的數組,但我定義時,只定義了三個,所以最後運行時,無法將sum值算出來。
    圖片
  • 問題2解決方案:前面一個問題改一下順序就可以,後面一個問題我又設了一個變數b,把計算過程分開才可以。
上周考試錯題總結
  • 第一題:In Java, arrays are
    A .primitive data types
    B .objects
    C .interfaces
    D .primitive data types if the type stored in the array is a primitive data type and objects if the type stored in the array is an object
    E .Strings

  • 分析:在書的第245頁,有說在Java中,數組是必須執行個體化的對象。
  • 第二題:The "off-by-one" error associated with arrays arises because
    A .the first array index is 0 and programmers may start at index 1, or may use a loop that goes one index too far
    B .the last array index is at length + 1 and loops may only iterate to length, missing one
    C .the last array element ends at length - 1 and loops may go one too far
    D .programmers write a loop that goes from 0 to length - 1 whereas the array actually goes from 1 to length
    E .none of the above, the "off-by-one" error has nothing to do with arrays
  • 分析:索引值必須大於等於0並且小於數組的元素個數。如果數組中有X個元素,則索引值是0~X-1.

  • 第三題:If an int array is passed as a parameter to a method, which of the following would adequately define the parameter list for the method header?
    A .(int[ ])
    B .(int a[ ])
    C .(int[ ] a)
    D .(int a)
    E .(a[ ])
  • 分析:參數被定義為變數最初被聲明為型別參數名稱。這裡,類型為int[],參數為a。

  • 第四題:Assume that BankAccount is a predefined class and that the declaration BankAccount[ ] firstEmpireBank; has already been performed. Then the following instruction reserves memory space for
    firstEmpireBank = new BankAccount[1000];
    A .a reference variable to the memory that stores all 1000 BankAccount entries
    B .1000 reference variables, each of which point to a single BankAccount entry
    C .a single BankAccount entry
    D .1000 BankAccount entries
    E .1000 reference variables and 1000 BankAccount entries
  • 分析:第一次銀行帳戶;為firstentity銀行保留記憶體空間,它本身是指向BankAccount[]對象的引用變數。第一次銀行賬戶=新銀行賬戶[1000];執行個體化BankAccount[]對象為1000個BankAccount對象。

  • 第五題:Given the following declarations, which of the following variables are arrays?
    int[ ] a, b;
    int c, d[ ];
    A .a
    B .a and b
    C .a and d
    uD .a, b and d
    E .a, b, c and d
  • 分析:第一個聲明聲明a和b都是int數組。第二個聲明聲明c和d是ints,但對於d,一個int數組。a b和d都是int數組。

  • 第六題If a and b are both int arrays, then a = b; will
    A .create an alias
    B .copy all elements of b into a
    C .copy the 0th element of b into the 0th element of a
    D .return true if each corresponding element of b is equal to each corresponding element of a (that is, a[0] is equal to b[0], a[1] is equal to b[1] and so forth) and return false otherwise
    E .return true if a and b are aliases and return false otherwise
  • 分析:這樣使得兩個數組是相同的,所以a和b所引用的數組是同一個,所以一個稱為另一個的別名。

  • 第七題:A Java main method uses the parameter (String[ ] variable) so that a user can run the program and supply "command-line" parameters. Since the parameter is a String array, however, the user does not have to supply any parameters.
    A .true
    B .false
  • 分析:在java命令之後,在命令列輸入的任何內容都將被接受為命令列參數。如果是由空格分隔的幾個單詞,那麼每個單詞都作為一個單獨的字串數組元素儲存。

  • 第八題:An array index cannot be a float, double, boolean or String.
    A .true
    B .false
  • 分析:數組索引必須是int類型,或者可以擴充為int類型的值(因此,char、byte和short也是允許的)。

  • 第九題:An array, when instantiated, is fixed in size, but an ArrayList can dynamically change in size when new elements are added to it.
    A .true
    B .false
  • 分析:數組的一個缺點是它的固定大小。一旦執行個體化,它的大小是固定的。ArrayList是一個使用數組的類,它會自動建立一個更大的數組,將舊數組複製到新數組中,這樣ArrayList就可以根據需要更大。雖然這可以解決拋出異常的問題,但它確實會導致效能較差,因為每次增加ArrayList大小時,必須從一個數組複製到另一個數組。

  • 第十題:Just as arrays can only have a fixed number of elements, set at the time the array is declared, a parameter list also can only have a fixed number of elements, set at the time the method is declared.
    A .true
    B .false
  • 分析:Java為可變長度參數列表提供了特殊的標記法。省略符號(…)用於指定可變長度參數列表。

  • 第十一題:So long as one is only accessing the elements of an ArrayList, its efficiency is about the same as that of an array. It‘s only when one begins to insert or remove elements towards the front portion of an ArrayList that its efficiency deteriorates.
    A .true
    B .false
  • 分析:對ArrayList的前部分進行插入或刪除時,就會發生大量的元素複製,從而降低其效率。

代碼託管結對及互評點評模板:
  • 部落格中值得學習的或問題:
    • xxx
    • ...
  • 基於評分標準,我給本部落格打分:XX分。得分情況如下:xxx
  • 代碼中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 基於評分標準,我給本部落格打分:XX分。得分情況如下:xxx

  • 參考樣本

點評過的同學部落格和代碼
  • 本周結對學習情況
    • 20172317
    • 結對照片
    • 結對學習內容
      • XXXX
      • XXXX
      • ...
其他(感悟、思考等,可選)

概念很多,嘚仔細看,有很多細節,和前面的章節聯絡緊密。

學習進度條
程式碼數(新增/累積) 部落格量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 95/95 1/1 18/18
第二周 515/620 1/2 22/40
第三周 290/910 1/3 20/60
第四周 1741/2651 1/4 30/84
第五周 579/3230 1/5 20/104
第六周 599/3829 1/6 18/122
第七周 732/4561 1/6 24/146

參考:軟體工程軟體的估計為什麼這麼難,軟體工程 估計方法

  • 計劃學習時間:22小時

  • 實際學習時間:24小時

  • 改進情況:稍有點

(有空多看看現代軟體工程 課件
軟體工程師能力自我評價表)

參考資料
  • 《第一行代碼Android》

  • 《Java程式設計與資料結構教程(第二版)》學習指導
  • 分析第一個Android應用程式結
  • 為什麼Java不支援多重繼承

20172327 2017-2018-2 《第一行代碼Android》第一章學習總結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.