天天看點

Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程

Android系統整體結構圖

Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程

先是從底層看起:(它是從Linux核心裡面抽取出來的一部分)

DisplayDriver(顯示驅動),CameraDriver(相機驅動),BluetoothDriver(藍牙驅動)

FlashMemoryDriver(閃存驅動),USBDriver(USB驅動),後面的鍵盤驅動,WIFI驅動,音頻驅動,電池驅動

然後是第二層:

libraies(類庫)

SurfaceManager(顯示管理器),MediaFramework(多媒體架構),SQLite(資料庫,小型資料庫),OpenGL|ES(3D圖庫引擎),SGL(2D圖庫引擎),FreeType(免費開發的文字顯示架構),SSL(一個安全協定),WebKit(浏覽器核心),libc(c語言核心庫)

Android RunTime(安卓運作時)

裡面有DalvikVirtualMachine(DVM),是從jvm裡面改進過來的

CoreLibraries(Java的核心庫)

然後是第三層(都是Java寫的)

對應:活動管理器,視窗管理器,内容提供者,視圖系統,通知管理,包管理,電話管理器,資料總管,定位管理器,XMPP及時通訊協定

然後是第四層

Home(桌面),Contacts(聯系人),Phone(電話),Browser(浏覽器)

差別DVM與JVM

首要差别

Dalvik: 基于寄存器,編譯和運作都會更快些

JVM: 基于棧, 編譯和運作都會慢些

位元組碼的差別

Dalvik: 執行.dex格式的位元組碼,是對.class檔案進行壓縮後産生的,檔案變小

JVM: 執行.class格式的位元組碼

運作環境的差別    

Dalvik : 一個應用啟動都運作一個單獨的虛拟機運作在一個單獨的程序中

JVM: 隻能運作一個執行個體, 也就是所有應用都運作在同一個JVM中

項目組成結構

Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程
Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程

自動生成的R.java類裡面的結構和對應資源的值

Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程
Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程

Activity和應用功能清單配置檔案

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

/**
 * 主界面Activity類,主界面就是點選應用圖示啟動的界面
 */
public class MainActivity extends AppCompatActivity
{
    /**
     * 重寫方法onCreate:在目前類(activity)對象建立的時候自動調用
     * 就是回調方法:不是我們自己調用的,是系統在一定條件下自動調用的,
     * 而且在Android中基本是以on開頭,這些方法我們不需要調用,一般是重寫
     */
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        //先調用父類做一些預設的初始化工作
        super.onCreate(savedInstanceState);
        //設定視窗要顯示的内容視圖(界面或者布局)
        //其中參數是一個int類型的數值,是要指定布局檔案在R所對應的變量
        //這樣就可以加載布局檔案,讓它顯示到視窗中
        setContentView(R.layout.activity_main);
    }
}      
<?xml version="1.0" encoding="utf-8"?>
<!--
    package屬性:指定目前應用唯一包名,這是應用的辨別,不同的應用不一樣
    versionName屬性:指定應用的版本号
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication" >

    <!--
        icon:應用的圖示
        label:應用的名稱
        theme:應用的主題
    -->
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <!--
            activity标簽:配置我們的Activity類
            name屬性:要寫全類名的,但是可以省略包名部分
            label屬性:界面的标題
        -->
        <activity android:name=".MainActivity" >
            <!--讓目前Activity成為主界面Activity-->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>      

res檔案夾

res檔案夾是資源檔案夾,裡面還分了很多檔案夾
  mipmap-xxxdpi:有一系列的這種檔案夾,這些是圖檔檔案夾,
      而為什麼有這麼多的檔案夾呢?而且每一個檔案夾裡面存放的圖檔都是一樣的
      那是因為手機有好有壞,分辨率不一樣,分辨率壞的手機顯示這一張圖檔剛剛好
      而分辨率好的手機再顯示這一張圖檔,那麼就會變得小了一點,是以這是為了适配不同分辨率的手機

  layout:界面的布局檔案,功能類似HTML
  values:常量檔案夾
      比如strings.xml裡面,就包含固定的字元串,在布局中引用的方式:@string/變量的名稱      

APK檔案

Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程

應用打包的過程

Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程

Android系統檔案目錄結構

Android系統就是類似Linux系統一樣,裡面的存儲結構沒有分什麼C槽D盤之類的

就隻有一個盤,裡面的

/ 代表系統的根目錄

/data/app/ 存放的是第三方的apk檔案

/system/app/ 這是系統中安裝好的應用檔案

/data/data/packagename/ 存放的是以應用對應的檔案,在應用安裝時自動生成,應用解除安裝的時候自動删除

/storage/sdcard/ 就是sd卡的檔案夾

Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程
Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程
Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程

SDK檔案目錄結構

/docs
  是文檔的目錄,點選index.html就能檢視API文檔
/platforms
  是每一個版本運作所需要的jar包
/platform-tools
  包含一些開發工具,比如adb.exe(真機模拟的連接配接程式),sqlite3.exe
/samples
  一些Google提供的樣例項目工程
/source
  包含系統的部分原碼
/tools
  包含一些開發工具,比如hierarachyviewer.bat      
Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程

/platforms

Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程
Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程
Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程

介紹三個工具

ADB

Android 調試橋(Android Debug Bridge)是多種用途的調試工具幫助你管理裝置或模拟器的狀态,就是類似之前你們一直使用的debug視窗

常用的指令

adb shell  //就是進入你的目前運作的Android系統的根目錄,使用ls可以檢視目前系統的目錄檔案
ctrl+c    //退出shell,就是退出系統根目錄
cls      //清屏
adb install –r apkPath           -push this package file to the device install,就是安裝一個apk檔案,就是幫手機安裝一個應用,-r意思是如果這個應用已經存在就先删除      
Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程

DDMS

全稱是Dalvik Debug Monitor Service

Android 開發環境中的Dalvik虛拟機調試監控服務

Eclipse中提供的Android應用開發的調試工具

它有四個重要的視窗

Logcat :      
Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程
Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程
Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程
Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程

工具類Log

工具類Log提供了五種的輸出的方法,分别是:

v() //對應Verbose級别,顯示全部的資訊

d() //對應debug級别,顯示調試資訊

i() //info級别,顯示一般資訊

w() //warming級别,顯示警告資訊

e() //Error,顯示錯誤資訊

測試

package com.example.hello;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity
{

  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.i("jane", "執行了Log.i()");
    Log.e("jane", "執行了Log.e()");
  }
}      

發現LogCat視窗列印的資訊超級多,是以使用過濾器進行過濾找到我們想要的資訊

這裡我們根據包名來過濾,因為一個應用對應一個包名,是以這裡肯定是我們寫的這個程式輸出的資訊

Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程
Android入門:系統整體結構,項目組成結構,Activity和應用功能清單配置檔案,res,APK,打包的過程

下載下傳功能的模拟

<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"
    tools:context="${relativePackage}.${activityClass}" >

    <Button
        android:id="@+id/MainButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="35dp"
        android:text="下載下傳" />

</RelativeLayout>      
package com.example.hello;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
/*
Toast: 用來顯示短時間提示文本的類
  static Toast makeText(...) : 建立一個toast對象
  show(): 顯示小提示

R: 應用的資源類
  R.drawable: 包含所有圖檔資源辨別的内部類
  R.layout: 包含所有布局資源辨別的内部類
  R.id: 包含所有視圖id辨別的内部類
  R.string: 包含所有字元串辨別的内部類

 */
public class MainActivity extends Activity
{
  //一般會将要操作的元件放在類的變量裡面
  private Button button;
  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    //加載布局檔案,并在記憶體中生成對應的視圖對象
    setContentView(R.layout.activity_main);
    Log.i("jane", "ִ執行了Log.i()");
    Log.e("jane", "ִ執行了Log.e()");
    //根據id在記憶體中查找對應的視圖對象
    button = (Button) findViewById(R.id.MainButton);
    //給這個button設定監聽
    button.setOnClickListener(new View.OnClickListener()
    {
      //這是匿名内部類,下面是點選button的回調方法
      @Override
      public void onClick(View v)
      {
        /*
         * 下面的回調方法主要的操作是:
         * 1.顯示文本小提示
         * 2.将button的内容更新為下載下傳中...
         * 首先是Toast需要的參數問題,需要一個Context類
         * 經過檢視發現Context接口的實作類有Activity,那麼我們現在的類就是,
         * 是以就将本類傳進去,但是這裡是匿名内部類,想得到外部類的目前對象,就使用類名.this獲得
         * 第三個參數是duration,
         *      * @param duration How long to display the message.  Either {@link #LENGTH_SHORT} or
                 *      {@link #LENGTH_LONG}
                 * 通過注釋可以發現是顯示的時間,隻有兩個取值
         */
        Toast toast = Toast.makeText(MainActivity.this, "開始下載下傳...", Toast.LENGTH_LONG);
        toast.show();
        button.setText("下載下傳中...");
      }
    });
  }
}      

手機機關相關的概念

手機的尺寸: 螢幕對角線的長度,機關為英寸(2.54cm)

手機的分辨率: 螢幕能顯示的像素的數量, 一般用在長方向上數量*寬方向上數量來表達

手機的像素密度: pixels per inch,也稱PPi,即每英寸螢幕能顯示的像素數,

像素密度越大,顯示畫面細節就越豐富。

計算:像素密度={1+√ [(長度像素數-1) ^ 2 +(寬度像素數-1)^2]}/螢幕尺寸

DPI: Dots Per Inch(每英寸所列印的點數或線數)的縮寫,

用來表示列印機列印分辨率, 但有時也會用dpi來代指ppi

手機的密度: Density, 以160ppi為基準, 即像素密度為160時Density為1

ldpi 120ppi 0.75

mdpi 160dpi 1.0

hdpi 240dpi 1.5

xhdpi 320dpi 2.0

px: pixels(像素)

1px就的長度就對應螢幕一個像素點的大小,但是這個機關在不同的手機一個像素點的大小不一樣

比如手機的大小都一樣的情況下,如果好的手機在橫的方向能放下的像素點有800個

不好的手機橫方向能放下的像素點400個,那麼一個像素點在壞的手機的大小是好手機兩倍

dp/dip: device-independent pixels(裝置無關像素)

換算的方法有三種:

1dp = (dpi / 160) px

1dp = density px 160–>1px 120–>0.75 320–>2px

1px = 1/density dp

sp:scaled pixels(可縮放像素)

與dp類似,但是可以根據使用者的字型大小首選項進行縮放

注意: Android在運作時會自動将dp/dip/sp為機關的尺寸轉換為像素機關的值

dp與px的比較?

以px為機關的長度, 在差手機上會變大, 在好手機上變小

以dp為機關則不會變化