應用程序和Activity

Android 應用程序的組成部分

Android應用程序由各個組件組成,並使用Manifest綁定到一塊兒,Manifest描述了每個組件和它們之間的交互方式,還用於指定權限,硬件,平臺以及應用程序的元數據等信息。php

應用程序的基本組成模塊html

  • Activity

應用程序的表示層,程序的每個UI都是經過Activity類來顯示的,Activity使用Fragment和視圖來佈局和顯示信息,以及響應用戶的操做。java

  • Service

應該用程序中不可見的工做者 ,Service運行時沒有UI,能夠更新數據源和Activity,觸發通知和廣播Intent,用來執行運行時間長的任務或者不須要交互的任務。android

  • Content Provider

可共享的持久數據儲存器 。Content Provider用來管理和持久化應用程序數據,一般會與SQL數據庫交互。Content Provider是應用之間共享數據的首選方法。能夠配置本身的Content Provider來容許其餘應用程序訪問。數據庫

  • Intent

應用程序間的消息傳遞框架。Android 中大量使用了Intent,包括啓動和中止Activity和Service,在系統範圍內或向目標Activity、Service或Broadcast Receiver廣播消息,以及請求對特定的一條數據執行操做。安全

  • Broadcast Receiver

Intent偵聽器,主要用於接受廣播,接受特定事件,以便執行相應的操做網絡

  • Widget

一般添加到設備主屏幕的可視化應用程序組件。Widget是Broadcast Receiver的特殊變體,可用於建立動態的交互式應用程序組件,用戶能夠把這些組件添加到主屏幕上。app

  • Notification

Notification容許向用戶發送信號,該組件是程序不可見或者不活動時吸引用戶注意的首選方法。框架

Manifest文件

每一個Android應用都有一個Manifest文件,Manifest定義應用程序及其組件和需求的結構和元數據。ide

它包含組成應用程序的每個Activity、Service、Content Provider和Broadcast Receiver的節點,並使用Intent Filter和權限來肯定組件之間的以及這些組件和其餘應用程序是如何交互的。Manifest文件由一個根manifest標籤構成,該標籤有一個項目包的package屬性,該屬性做爲改應用程序的惟一標識。

Manifest的各個屬性以下:

  • versionCode

做爲應用程序版本迭代的時候使用

  • versionName

展現給用戶的公共版本號

  • installLocation

指定是否容許將應用程序安裝到外部存儲器,可用參數preferExternal或auto,前者只要有可能就安裝在外部存儲器,後者由系統處理

  • uses-sdk

定義minSDKVersion和targetSDKVersion,minSDKVersion保證在這個SDK版本及其以上運行,targetSDKVersion用於指定開發和測試應用程序時使用的平臺,儘量設置該版本爲最新的SDK版本。

  • uses-feature

使用多個uses-feature來指定應用程序須要的每一個硬件功能,如

<uses-feature android:name="android.hardware.microphone" android:required="false"/>
複製代碼

還能夠用來指定OpenGL的最低版本,版本號爲32位,高16位爲主版本號,低16位爲次版本號,如

<uses-feature android:glEsVersion="0x00010001"/>
複製代碼
  • uses-permission

權限申請,Android爲了安全,在使用某些服務的時候須要權限,如撥打電話,讀取聯繫人等

  • application

一個Manifest只有一個application節點,application節點中包括了四大組件的子節點。

  • activity
<activity android:name=".MainActivity">
       <intent-filter>
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
       </intent-filter>
</activity>
複製代碼
  • service
<service android:name=".MyService"/>
複製代碼
  • provider
<provider android:authorities="com.fengwei.app.MyContentProvider" android:name=".MyContentProvider"/>
複製代碼
  • receiver
<receiver android:name=".MyReceiver">
   <intent-filter>
       <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
    </intent-filter>
</receiver>
複製代碼
  • uses-library

指定應用程序共享庫。

Android資源文件

在Android res文件目錄下包含drawable、values、layout文件等,逐個介紹

  • drawable

drawable文件夾下存放圖片資源,但Android碎片化嚴重,屏幕大小不一,分辨率各不相同,因此會有不一樣分辨率的drawable文件夾,如drawable-hdpi,drawable-xhdpi,drawable-xxhdpi等

  • strings
<string name="title_draw_histogram">直方圖</string>
複製代碼
  • styles
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style>
複製代碼
  • colors
<color name="colorPrimary">#3F51B5</color>
複製代碼
  • dimens
<dimen name="large">16sp</dimen>
複製代碼
  • layout

佈局文件,在XML文件中設計用戶界面佈局,使界面和業務邏輯分離出來。

Android支持屬性動畫、補間動畫、幀動畫。

  • 屬性動畫
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:duration="5000" android:interpolator="@android:anim/accelerate_interpolator" android:propertyName="scaleX" android:repeatCount="2" android:repeatMode="reverse" android:valueFrom="0" android:valueTo="360" android:valueType="floatType" />
複製代碼
  • 補間動畫
動畫類型 屬性值 有效值
Alpha fromAlpha/toAlpha 0~1
Scale fromXScale/toXScale fromYScale/toYScale pivotX/pivotY(0%~100%) 0~1
Translate fromX/toX fromY/toY 0~1
Rotate fromDegrees/toDegrees pivotX/pivotY(0%~100%) 0~360
  • 幀動畫

建立Drawable的序列,作一個來連續的動畫。

運行時配置更改

Android運行時能夠更改語言,位置,硬件,有時候默認行爲不是很方便,如屏幕旋轉不但願從新建立Activity

要讓Activity能夠監聽運行時配置更改,須要向它的manifest節點添加一個 android:configChanges 屬性,說明但願對哪些配置更改進行處理。

  • mcc和mnc 檢測到SIM,而且它們的國家和網絡發生了變化
  • locale用戶改變了設備的語言設置
  • keyboardHidden顯示或者隱藏了鍵盤或其餘輸入機制
  • keboard對鍵盤類型進行了更改
  • fontsize用戶更改了首選的字體大小
  • uiMode總體UI模式發生了變化,黑白切換
  • orientation屏幕發生了旋轉
  • screenLayout屏幕布局發生了變化
  • screenSize可用屏幕尺寸改變
  • smallersScreenSize物理屏幕尺寸改變

在特定狀況下,多個事件可能同時觸發。

Activity 應用程序生命週期

每一個Android應用程序都是經過本身的進程運行的,每個進程都運行在獨立的Dalvik實例中。每個應用程序的內存和進程管理都是由運行時處理的。進程被終止的順序由應用程序的優先級決定的,一個應用程序的優先級等同於它的優先級最高的組件的優先級。 當兩個應用程序有相同的優先級時,在較低優先級狀態運行時間最長的進程將會首先被終止。進程的優先級也受到進程間依賴關係的影響。應用進程分爲活動進程、可見進程、啓動Srevice進程,後臺進程、空進程。

  • Active 進程

正在前臺運行的進程,這些進程數量很是少。Active進程包括:

  1. 處於活動狀態的Activity

  2. 正在執行OnReceive事件處理程序的BroadCast Receiver

  3. 正在執行onStart、onCreate、onDestroy事件處理程序的Service

  4. 正在運行,且已被標記爲前臺運行的Service

  • 可見進程

可見可是非活動進程,能夠被用戶看到,可是不在前臺運行,如被dialog擋住的Actvity,這類進程數量也不多,不會輕易被終止。

  • 啓動Service進程

已經啓動的Service進程,它們的優先級低於可見Activity和前臺Service,在活動或者可見的進程須要資源時,會終止它們。當系統殺死一個Service後,會在資源可用時重啓該Service,除非告訴系統不這麼作(設置onStartCommand的返回值)

  • 後臺進程

不可見,而且沒有任何運行Service或者Activity的進程,一般有不少這種進程,當前臺資源不夠時會優先終止它們。

  • 空進程

Android會把生存週期結束後的應用程序保存在內存中。目的是爲了減小應用程序被再次啓動時的啓動時間。這些進程會被按期終止

Actvity的建立

一個Activity一個屏幕,Activity類呈現了一個封裝了窗口顯示處理功能的空白屏幕,須要UI控件進行填充,要把UI分給一個Activity須要在Actvity的onCreate方法中調用setContentView。

@Override
protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
}
複製代碼

建立好了Actvity須要在Manifest註冊:

<activity android:name=".MainActivity">
    <intent-filter>
         <action android:name="android.intent.action.MAIN"/>
         <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>
複製代碼

Activity的生命週期

  • Activity棧

每個Activity的狀態由它在Activity棧中所處的位置決定,Activity棧是當前全部正在運行的Activity的集合。一個新的Activity啓動時,它就變爲Activity類,並移動到棧頂。若是用戶點擊了Back按鈕,會回到上一個Activity,上一個Activity就會回到棧頂,變爲活動狀態。

[圖片上傳失敗...(image-fc5494-1513087424368)]

  • Activity的狀態

隨着Activity的建立和銷燬,會在棧中進進出出,Activity會有四種狀態:

  1. 活動狀態

當Activity位於棧頂時,它是可見的,具備焦點的前臺Activity,這時與用戶進行交互,優先級很高

  1. 暫停狀態

Activity可見,可是沒有得到焦點,不能和用戶交互,但一個Activity徹底不可見時,就處於中止狀態

  1. 中止狀態

Activity不可見,但其餘地方須要內存時,它會成爲被終止的首選對象,在中止狀態,保存數據和當前UI的狀態以及中止一些沒必要要的操做是很重要的。

  1. 非活動狀態

Activity被終止以後,在啓動以前就處於非活動狀態,已經移出棧中。

  • Activity狀態改變的監聽

Activity的事件處理程序以下,當Activity在完整的,可見的和活動的生存期之間轉化時,它們會被觸發。

public class Main2Activity extends AppCompatActivity {

    //在完整生存期開始時調用
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //初始化一個Activity並填充UI
    }


    //在onCreate方法完成後調用,用於恢復UI狀態
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        //從savedInstanceState恢復UI狀態
        //這個Bundle也被傳遞給OnCreate
        //自Activity上次可見後,只有當系統終止了該Activity時,纔會被調用
        //在隨後的Activity進程的可見生存期以前調用
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        //加載改變,知道Activity在此進程中已經可見
    }

    //在可見生存期開始時調用
    @Override
    protected void onStart() {
        super.onStart();
        //Activity可見,UI change
    }

    //在Activity 狀態生存期開始時調用
    @Override
    protected void onResume() {
        super.onResume();
        //恢復Activity須要,可是當它處於不活動狀態時被掛起,暫停UI更新,線程或者進程
        //Activity狀態生命週期結束時調用,用來保存UI狀態的改變
    }

    //把UI狀態改變保存到outState
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        //若是進程被運行時終止並被重啓,那麼這個Bundle將被傳遞給onCreate和onRestoreInstanceState
    }

    //在Activity狀態生存期結束時調用
    @Override
    protected void onPause() {
        super.onPause();
        //掛起不須要更新的UI更新,線程或者CPU密集的進程
        //當Activity不是前臺的活動狀態的Activity時
    }

    //在可見生存期結束時調用
    @Override
    protected void onStop() {
        super.onStop();
        //掛起不須要的UI更新,線程或處理事件
        //當Activity不可見時,保存全部的編輯或者狀態改變
    }

    //在完整生存期結束時調用
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //清理全部的資源,結束線程,關閉數據庫鏈接等
    }
}
複製代碼
  • Activity生存期

在一個Activity從建立到銷燬的完整的生存期,它會經歷活動生存期和可見生存期的一次或者屢次重複。

  1. 完整生命期

使用onCreate初始化Activity:填充用戶界面,得到Fragment的引用,分配對類變量的引用,將數據綁定到控件,啓動service和定時器等。使用onDestory來清理onCreate建立的資源,關閉全部外部鏈接。

  1. 可見生存期

onStart和onStop之間的時間叫作可見生存期。Activity可見,可是沒有焦點,不能交互。 onStop方法中暫停或者中止動畫、線程、傳感器監聽器、GPS查找。定時器、Service或者更新UI的線程。

  1. 活動生存期

onResume和onPause之間的時間叫作活動生存期。Activity在前臺,接受用戶交互信息。通常在onPause中保存狀態,中止Broadcast Receiver,onResume中從新註冊Broadcast Receiver。

相關文章
相關標籤/搜索