Android學習總結(未完待續)

Android入門學習總結
   近些日子在做Android相關知識學習,現在做一下日常總結。

1.Android工程解析

   開發化境以及軟件安裝在這裏不在贅述。本人用的軟件是Android Studio。
   首先來了解一下安卓項目的建立過程和安卓項目具體結構。在Android Studio下選擇File->New->New Project,出現項目創建畫面,根據自己的需求,修改項目的名稱、項目域名和文件保存位置,點擊下一步。新建一個Android項目:

在這裏插入圖片描述
 
   新建立一個安卓項目時,Android Studio會提供一些初始模板供用戶選擇,選擇合適自己的初始模板,如下圖所示:
 
在這裏插入圖片描述
點擊Next,最後選擇Finish完成項目創建。

1.1 項目結構

   下面讓我們來看一下安卓項目的具體構成,一個完整的安卓項目由以下目錄結構組成。
 
在這裏插入圖片描述
 

  • .gradle和.idea都是Android Studio自動生成的一些文件,無需關心。
  • app文件夾主要存放我們的項目代碼、資源等等文件
  • grandle文件夾主要包含了grandle wrapper(通過讀取配置文件中gradle的版本,爲每個項目自動的下載和配置gradle)的配置文件。
  • .gitignore用來將制定的目錄或者文件排除在版本控制之外。
  • build.grandle,用來進行項目配置。
  • grandle.properties 是項目全局的gradle構建腳本,影響項目中所有grandle的編譯腳本。
  • gradlw和gradlew.bat用來在命令界面執行grandle命令,gradlew是在linux或者Mac系統下使用,gradlew.bat是在windows系統下使用的。
  • ****.iml文件是自動生成的一個文件,用來標識這是一個intellliJ IDEA項目。
  • local.properties用來制定Android SDK路徑,通常都是自動生成的。

1.2 app文件結構

   下面我們展開來介紹一下1.1中提到的app文件的詳細結構。

 在這裏插入圖片描述
 

  • build:主要包含了一些編譯時自動生成的文件,無需關心。
  • libs:項目中使用的第三方jar包存放在該目錄下。
  • src:主要代碼目錄。androidTest用來編寫Android Test測試用的。main文件下的java文件存放主要代碼,android activity以及一些java類等主要代碼都存放在這裏。res:存放各種資源文件的地方,drawable存放圖片資源,layout存放佈局xml文件,各個mipmap文件存放不同dpi的圖片以適應不同的機型,values存放字符串。
  • AndroidMainfest.xml是整個安卓項目的配置文件,可以說是一個安卓項目的簡單說明書,安卓項目的四大組件的註冊都要在這個文件裏進行,應用程序的權限聲明也在這個文件下進行。

2.初識Activity

2.1Activity簡介與Activity生命週期

什麼是Activity?
    根據官方文檔的解釋,Activity是一種應用程序組件,它在屏幕上顯示一塊區域供用戶進行交互操作,例如打電話,照相發郵件等等。每個活動都提供用戶了一塊或大或小的窗口去繪製界面。一個app可以擁有多個Activity。android 系統通過Task(棧)來儲存Activity,遵從後進先出原則。
    Activity可以說是一個App基本組成部分。那麼一個Activity的生命週期是怎樣的呢?Activity類中一共定義了7個回調方法,覆蓋了Activity生命活動週期的每一個環節,下圖爲Activity的生命週期圖。
 
 
在這裏插入圖片描述

 

  1. onCreate()。每個活動在創建初期都會自動調用onCreate(),這裏進行一些活動的初始化,比如佈局加載、綁定事件等等。
  2. onStart()。當要將活動顯示給用戶時,將調用onStart(),將Activity從不可見狀態變爲可見狀態。
  3. onResume()。當Activity需要與用戶進行交互時,調用onResume(),此Activity將位於棧頂,處於運行狀態。
  4. onPause()。當另一個Activity要啓動或者恢復,會把當前Activity覆蓋的時候,當前Activity會調用onPause(),將一些關鍵數據保存起來,這個方法中通常也會將一些消耗CPU的資源釋放掉。
  5. onStop()。當Activity完全不可見的時候,調用onStop()。onPause()和onStop()的區別在於,如果一個Activity是在當前Acitivity下以對話框的形式啓動時,只會調用onPause(),而不會調用onStop()。
  6. onDestory()。onStop()後,通過調用 onDestory()將Activity銷燬,之後Activity會處於銷燬狀態,可以通過finish()關閉Activity。
  7. onRestart()。當一個Activity處於停止狀態(調用過onStop()之後),想要重新獲得焦點時,調用onRestart,然後調用onResume()

2.2Activity的使用

上面主要介紹了Activity的概念,和生命週期,那麼具體創建一個新的Activity時,應該如何操作呢?
 
在這裏插入圖片描述
 
① 自定義Activity類,繼承Activity類。

public class MyActivity extends Activity()

在新版本中,默認創建一個新活動會繼承AppCompatActivity類,AppCompatActivity只是比Activity多了一些新功能,其他方面並無太大區別。

② 創建Activity對應的layout佈局文件,在自定義Activity中,重寫onCreate(),引用佈局。

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);             //通過 setContentView 調用layout佈局文件

③ 在AndroidMainfest.xml的 <application>下中註冊活動

<activity 
			android:name="MyActivity"
			android:icon="圖標"
			android:theme="需要應用的主題">
</activity>
			

這裏只是列舉了幾個主要參數,其他參數配置自行百度。

④ 啓動Activity。
在AndroidMainfest.xml註冊的主活動會在App運行時,自動調用,其他活動調用時,需要通過startActivity(Intent)啓動。

Intent intent = new Intent(MainActivity.this, FirstActivity.class)            //Intent(Context, Class)
startActivity(intent)

new一個Intent(Context, Class)需要兩個參數,第一個參數是Context,中文可以理解爲上下文,即新啓動的Activity所依賴的當前Activity。第二個參數Class是需要啓動的新Activity所定義的類。

⑤ 關閉Activity。
調用finish()直接關閉活動。

2.3 Activity實例

   下面,通過一個關於Activity生命週期的實例,來加深對Activity的理解,順便初步練習一下如何編寫Android項目。

2.3.1 項目建立

   選擇File->New->New project建立一個新的Android項目,模板選擇Empty Activity。AndroidStudio會幫我們自動生成項目框架,以及MainActivity.java和對應的activity_main.xml佈局文件。
 

在這裏插入圖片描述
   部分機器可能在建立完項目之後,會出現以上報錯,原因是利用grandle同步更新項目時,證書錯誤無法下載所需要的包,在grandle文件下的build.gradle的repositories 裏添加阿里雲鏡像即可,如果添加完之後,仍然報錯,請跳轉我的上一篇文章,傳送門。Sync成功以後,我們的主活動就創建完成了,下面我們繼續創建項目所需要的兩個子活動,一個普通活動NormalActivity,一個對話框活動DialogActivity。在項目結構的java文件夾下右鍵->New->Activity->Empty Activity,Activity Name改爲NormalActivity,佈局文件自動生成爲activity_normal。DialogActivity創建方式相同。

2.3.2 修改java和layout文件

   首先打開res->layout下的activity_normal.xml,將內容修改爲以下代碼:

<LinearLayout 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:orientation="vertical"
    tools:context=".NormalActivity"
    >
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:textSize="30dp"
        android:textStyle="bold"
        android:text="This is a normal activity"/>
</LinearLayout>

 
   LinearLayout表示線性佈局,Android一共有六大布局,分別是 LinearLayout(線性佈局),RelativeLayout(相對佈局),TableLayout(表格佈局) FrameLayout(幀佈局),AbsoluteLayout(絕對佈局),GridLayout(網格佈局),這裏不展開詳細介紹。

   佈局文件中,TextView 用來定義顯示一個文本框,match_parent的意思是與父類相匹配,gravity="center"對齊方式爲劇中,textSize和textStyle則是分別設置字體大小和格式,最終在text屬性裏設置要顯示的文字。同樣,將activity_dialog.xml文件中內容修改爲:
 

<LinearLayout 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:orientation="vertical"
    tools:context=".DialogActivity"
    >
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:textSize="32dp"
        android:textColor="#8aaacd"
        android:textStyle="bold"
        android:text="This is a dialog activity"/>
</LinearLayout>

 
   佈局定義完,讓我們來看一下NormalActivity和DialogActivity文件。NormalActivity.java和DialogActivity.java文件主要用來聲明Activity,通過重寫onCreate調用setContentView(),引用外部定義的佈局。以NormalActivity.java爲例:

package com.learnactivity.tong.learnactivity;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class NormalActivity extends AppCompatActivity {

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

   可以看到,AndroidStudio已經自動幫我們生成好了,並不需要再做過多的改動。
Activity和佈局都寫好以後,就需要在AndroidMainfest.xml中進行註冊了,如果不在AndroidMainfest.xml中聲明,Activity將無法正常運行。

AndroidMainfest.xml:

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

    <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 android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <activity android:name=".NormalActivity">
        </activity>

        <activity android:name=".DialogActivity"
                  android:theme="@style/Theme.AppCompat.DayNight.Dialog">
        </activity>
    </application>
    
</manifest>

 
   將需要註冊的Activity添加到application下,對於DialogActivity,多了一行theme屬性的配置,意思爲將其格式聲明爲一個對話框樣式。這樣就算是註冊完畢了。下面回到我們的主Activity,首先定義佈局,打開activity_main.xml,修改爲以下內容:

activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context=".MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/normal_button"
        android:text="Start——NormalActivity"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/dialog_button"
        android:text="Start——DialogActivity"/>

</LinearLayout>

 
   通過Button標籤,聲明兩個按鈕,利用android:id爲其註冊id名,方便java文件調用。通過Design界面,我們已經可以預覽到主界面的樣子(預覽出錯的,是因爲沒有通過grandle進行Sync,重新Sync即可)。想要修改界面樣式,只需要在activity_main.xml文件中修改相關配置即可。
 

在這裏插入圖片描述
 

2.3.3 編寫MainActivity

   最後一步,編寫我們的主Activity。打開MainActivity,初始代碼AndroidStudio只幫我們重寫了一個onCreate(),後面的代碼需要根據待實現的功能進行添加。我們這個實例的目的是爲了進一步理解Activity的生命週期,所以在每個重寫的Activity類的回調方法中,添加Log打印的代碼,方便我們從Logcat中更直觀的去觀察Activity的生命週期。onCreate()中一般進行一些初始化操作,事件的綁定等等,所以要添加的代碼較多。通過Button實例化兩個按鈕normal_bt、dialog_bt,將normal_button和dialog_button綁定到對象上,然後給按鈕註冊一個OnClickListener監聽器用來監聽按鈕按下後的動作,在setOnClickListener下重寫onClick(),當點擊按鈕後,調用我們前面寫的Activity,調用方法爲之前介紹過的startActivity(intent)。
除了onCreate()之外,onStart()、onResume()、onPause()、onStop()、onDestory()、onRestart()這六個方法中,只添加一行Log打印代碼即可。

MainActivity.java:

package com.learnactivity.tong.learnactivity;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG,"onCreate is called");
        setContentView(R.layout.activity_main);

        Button normal_bt = (Button)findViewById(R.id.normal_button);
        normal_bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent normal_intent =new Intent(MainActivity.this,NormalActivity.class);
                startActivity(normal_intent);
                Log.i("new intent","normal activity is called");
            }
        });

        Button dialog_bt = (Button)findViewById(R.id.dialog_button);
        dialog_bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent dialog_intent = new Intent(MainActivity.this,DialogActivity.class);
                startActivity(dialog_intent);
                Log.i("new intent","dialog activity is called");
            }
        });
    }
    
    @Override
    protected void onStart(){
        super.onStart();
        Log.i(TAG,"onStart is called");

    }

    @Override
    protected void onResume(){
        super.onResume();
        Log.i(TAG,"onResume is called");
    }

    @Override
    protected void onPause(){
        super.onPause();
        Log.i(TAG,"onPause is called");
    }

    @Override
    protected  void onStop(){
        super.onStop();
        Log.i(TAG,"onStop is called");
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        Log.i(TAG,"onDestroy is called");

    }

    @Override
    protected void onRestart(){
        super.onRestart();
        Log.i(TAG,"onRestart is called");
    }
}

2.3.4 運行測試

   以上內容完成以後,make project,編譯通過,點擊菜單欄下的小三角按鈕進行設備測試(如下圖所示),之前沒有建立過虛擬設備的,可以點擊左下角的Create New Virtual Device新建一個虛擬設備進行模擬操作。
 

在這裏插入圖片描述
 
   運行成功,程序默認啓動主界面,從log中可以看到,Activity從創建到完整顯示到屏幕前,按順序調用了onCreate()、onStart()、onResume()。
 

在這裏插入圖片描述
 
   按下Start-NormalActivity按鈕,出現以下畫面,從Log中可以看到,前一個活動失去焦點,並且完全顯示不見,分別調用了onPause()、onStop()。
 

在這裏插入圖片描述
 
   按下返回鍵,觀察Log,主界面重新獲得焦點,顯示給用戶,這個過程按順序調用了onRestart()、onStart()、onResume()。
 

在這裏插入圖片描述

 
   點下第二按鈕,Start—DialogActivity,可以看到DialogActivity獲得焦點,對話框顯示到當前屏幕,前一個Activity失去焦點,但是並沒有完全不可見,這時,觀察Log,發現只調用了onPause(), 說明只有當前一個Activity完全不可見的時候,纔會調用onStop(),這就是onPause()和onStop()的區別。

在這裏插入圖片描述
 
   最後,點下返回鍵到退出程序,Activity被銷燬徹底不可見,觀察Log,按順序分別調用了onPause()、onStop()、onDestory()。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章