Android基礎

来源:http://www.cnblogs.com/sun-haiyu/archive/2017/06/16/7027035.html
-Advertisement-
Play Games

Android基礎 Android系統架構 JVM和DVM的不同 區別 1. 基於的架構不同。jvm 基於棧架構,棧是位於記憶體上的一個空間,執行指令操作,需要向cpu定址; dvm 基於寄存器架構,寄存器是cpu的一個組成部分,執行指令操作無需定址直接執行。 2. 執行文件的格式不同,jvm執行的是 ...


Android基礎

Android系統架構

JNI java native interface

1. application:應用層, java
2. application framework: 應用框架層, java + JNI
3. libraries 和 dalvik:函數庫和虛擬機層, c/c++ 
4. linux kernel: linux 內核驅動層, c

JVM和DVM的不同

區別

  1. 基於的架構不同。jvm 基於棧架構,棧是位於記憶體上的一個空間,執行指令操作,需要向cpu定址; dvm 基於寄存器架構,寄存器是cpu的一個組成部分,執行指令操作無需定址直接執行。
  2. 執行文件的格式不同,jvm執行的是多個.class文件。 dvm執行的是一個.dex文件。

art 模式 (android runtime)

雖占用空間略大,但運行速度更快。

在Android 4.4以前,安卓手機系統的應用程式均在Dalvik Java的虛擬機上運行,這種運行模式是還要依靠一個編譯器來實現與應用程式的溝通。應程式每次運行時,都需要將程式內的代碼轉變為機器碼才能運行,這無形中多附加了一道手續,這就造成了耗電相對較快、占用記憶體大的問題。

art: 程式在安裝時需要預編譯讀取,將代碼轉換為機器碼。

  • 好處:程式運行時,無需時時轉換,運行速度快 ;
  • 缺點:安裝時間稍長,由於轉換機器碼,所以占用略高的存儲空間。

sdk目錄

add-ons:預留的一個附加目錄
build-tools:構建工具目錄
docs: 文檔目錄
extras:開發中額外提供的一些工具比如intelHAXM加速器及jar
platforms: 不同版本android的核心jar包
platforms-tools:平臺一些相關的工具
sources:源碼
system-images:系統鏡像文件
tools:開發中使用的一些工具,如9path,做圖片拉伸適配的。
emulator:模擬器

DDMS(Dalvik Debug Monitor Service)

file explorer: 列出當前設備所有目錄。

/data/app:安裝的第三方apk都在此目錄
/system/app: 系統預裝應用apk在此目錄  
/data/data:應用的私有目錄,系統每安裝一個新的應用程式,都會在此目錄創建該應用包名的文件,用來存放該應用的私有數據,當應用卸載時,該包名的文件夾也會被刪除。     
/sdcard :外部存儲目錄,一般會鏈接指向到另一個目錄,用來存放大數據。

Android工程目錄結構

applicationId和package

app下的build.gradle

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.example.hello"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
     <!-- 
    applicationId: 應用程式的包名,Android設備和應用商店上,applicationId是一個android程式的唯一標示
    versionCode:應用程式的版本號 
    versionName:版本(名)描述
    minSdkVersion: 應用最低能安裝的系統版本
    compileSdkVersion:編譯時候的版本,始終使用最新版本
    targetSdkVersion解釋起來複雜,Android 提供向前相容的主要依據,記住和compileSdkVersion版本號保持一致就好-->

app/src/main/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.hello">

    <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">
       <!--  應用程式的入口,進入app的第一個activity
            action : MAIN 主要的
            category : LAUNCHER 啟動 發射 -->
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

build.gradle下的applicationId v.s. AndroidManifest.xml下的package。

預設(最好)是兩者保持一致。

在Android Studio中是兩個獨立的東西,可以修改applicationId,與packageName不一致也可以的(不推薦)。

最簡單的MainActivity

oncreate :是Activity啟動時調用 , activity 相當於java web中的servlet(處理業務邏輯), layout 相當於java web中的jsp(負責顯示)

package com.example.helloworld;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

    //oncreate :是Activity啟動時調用 , activity 相當於java web中的servlet, layout 相當於java web中的jsp
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // savedInstanceState作用是在acticitypause狀態,被kill掉之前,保存此時的狀態。
        // 這樣當activity開始時候調用onCreat時候就能獲得狀態數據savedInstanceState
        super.onCreate(savedInstanceState);
        //將一個佈局文件作為activity的內容顯示
        setContentView(R.layout.activity_main);

    }
}

Android的打包過程

.java --(使用jdk)---> .class ---(使用dx.bat)--->.dex(res,assets,androidmanifest.xml)--(使用aapt)-->.apk--(使用jarsigner簽名)--> final apk

ADB指令

ADB (android debug bridge)

建立手機與電腦直接的連接 , adb運行的埠號是5037。

為方便使用,需要將環境變數的配置:\sdk\platform-tools配置到環境變數。

1. adb devices :列出當前電腦所連接的android設備
2. adb push pc_path  phone_path :將電腦端文件放到手機端
3. adb pull phone_paht pc_path :將手機端文件拉到電腦端
4. adb install [-r] apkpath ; 安裝一個電腦端的apk文件。-r可選:強制安裝
5. adb uninstall packagename; 卸載一個應用
//三個指令聯合使用來解決adb被占用,或斷開連接的情況
6. adb kill-server : 結束adb服務的鏈接
7. adb start-server :開啟adb服務的鏈接
8. netstat -oan 查看埠: 查看埠
9. adb shell:進入當前設備linux環境下
10.adb shell下 ls -l :查看當前設備的目錄結構
11.adb shell下 logcat :查看系統運行中的日誌信息

簡單的例子--撥號

  1. 佈局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="16dp" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="請輸入手機號"
        />

    <EditText
        android:id="@+id/tel_number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal" />

    <Button
        android:id="@+id/call"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="撥打" />
</LinearLayout>
  1. 主界面
package com.example.hello;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private EditText editText;
    private Intent callIntent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 獲取佈局裡面的控制項
        editText = (EditText) findViewById(R.id.tel_number);
        Button callButton = (Button) findViewById(R.id.call);

        callButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 用戶可能輸入了空格或者製表符,除去
                String telnumber = editText.getText().toString().trim();
                // ACTION_CALL和ACTION_DIAL的區別在於,前者直接撥打出去,後者彈出撥號界面和號碼,需要用戶手動撥打
                callIntent = new Intent(Intent.ACTION_CALL);
              // "tel:"指定了協議
                callIntent.setData(Uri.parse("tel:" + telnumber));
              // 動態申請運行時許可權,傳入的1是一個唯一碼,沒申請到許可權時不能執行後續動作,所以放在else分支里
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
                } else {
                    startActivity(callIntent);
                }
            }
        });
    }
    // requestCode對應上面的唯一碼,這個方法根據用戶允許或者拒絕來處理
    // PackageManager.PERMISSION_GRANTED表示用戶點擊了允許
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0]==PackageManager.PERMISSION_GRANTED) {
                  // 用戶允許後立即撥打電話
                    startActivity(callIntent);
                } else {
                    Toast.makeText(MainActivity.this, "你拒絕了許可權!", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
        }
    }
}

記得使用permission.CALL_PHONE時候需要在AndroidManifest.xml裡面註冊。

<uses-permission android:name="android.permission.CALL_PHONE" />

常用的重寫按鈕點擊事件的方法

  1. 上面用的匿名內部類的方法,當按鈕多的時候,每一個按鈕就會new出一個類開闢了一片空間。

  2. 讓當前Activity實現implements View.OnClickListener,對於有多個按鈕時很方便。

   public class MainActivity extends AppCompatActivity implements View.OnClickListener {

       private EditText editText;
       private Intent callIntent;

       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);

           editText = (EditText) findViewById(R.id.tel_number);
           Button callButton = (Button) findViewById(R.id.call);
        // 當前類就是一個listener
           callButton.setOnClickListener(this);
       }
    // 將撥打電話功能封裝
       private void callPhone() {
           String telnumber = editText.getText().toString().trim();
           callIntent = new Intent(Intent.ACTION_CALL);
           callIntent.setData(Uri.parse("tel:" + telnumber));
           if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
               ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
           } else {
               startActivity(callIntent);
           }
       }
    // 可能有多個按鈕,通過getId方法來判斷,id就是佈局文件里定義的
       @Override
       public void onClick(View v) {
           switch (v.getId()) {
               case R.id.call:
                   callPhone();
                   break;
               default:
           }
       }

       @Override
       public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
           switch (requestCode) {
               case 1:
                   if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                       startActivity(callIntent);
                   } else {
                       Toast.makeText(MainActivity.this, "你拒絕了許可權!", Toast.LENGTH_SHORT).show();
                   }
                   break;
               default:
                   break;
           }
       }
   }

by @sunhaiyu

2017.4.7


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

-Advertisement-
Play Games
更多相關文章
  • 創建動畫 協議代理 屬性 設置動畫組件Item的動力屬性 UIDynamicItemBehavior 為動畫組件添加具體行為 吸引行為 UISnapBehavior 重力行為 UIGravityBehavior 碰撞行為 UICollisionBehavior 作用力行為 UIPushBehavio ...
  • 前幾天要用到PopupWindow,一時竟想不起來怎麼用,趕緊上網查了查,自己寫了個demo,併在此記錄一下PopupWindow的用法。 使用場景 PopupWindow,顧名思義,就是彈窗,在很多場景下都可以見到它。例如ActionBar/Toolbar的選項彈窗,一組選項的容器,或者列表等集合 ...
  • 蘋果手機有個痛點,就是不支持文件管理。對於那些需要在移動端處理文檔或者說整理文件的朋友來說,沒有文件管理這個功能絕對讓人抓狂,好在作為良心企業的Readdle,為我們開發了Documents,並且免費。目前的版本是Documents 6,可以在App Store免費下載。 這個文件管理器支持的文檔格 ...
  • 要理解View的測量,首先要瞭解MeasureSpec,系統在測量view的寬高時,要先確定MeasureSpec。 MeasureSpec(32為int值)由兩部分組成: SpecMode(高2位):測量模式。 SpecSize(低30位):某種測量模式下的規格大小。 SpecMode有3類: U ...
  • View事件的分發機制由三個方法共同完成,這三個方法是: public boolean dispatchTouchEvent(MotionEvent ev); public boolean onInterceptTouchEvent(MotionEvent ev); public boolean o ...
  • 定時器在我們每個人做的iOS項目裡面必不可少,如登錄頁面倒計時、支付期限倒計時等等,一般來說使用NSTimer創建定時器: + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)a ...
  • 第三方音視頻直播調研總結 調研對象:網易雲、阿裡雲、騰訊雲、金山雲、七牛雲(相關參考:http://www.chinaz.com/news/2016/1108/608584.shtml) 詳細介紹: 一、網易雲(http://netease.im/live) 架構: 功能: 1、全平臺 SDK 支持 ...
  • 下載更新apk,基本上每個app都需要的功能,以前都是自己寫,近期想藉助第三方的一個庫來做,功能齊全,感覺不錯,記錄使用過程,雖然官方也有使用教程,不過畢竟粗略,網上也能搜到,不過基本都是複製的 首先下載庫,地址改成我們自己的,檢查地址就讓它了,這個根據自己的業務調整,也能自定義 接下來是參數介紹 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...