20189200餘超 2018-2019-2 移動平臺應用開發實踐第六週做業

20189200餘超 2018-2019-2 移動平臺應用開發實踐第六週做業

Android簡介、活動、UI組件

1.Android系統架構
java

  • 這是Android系統架構圖,夠一目瞭然了吧,Android大體能夠分爲四層架構,五塊區域,Linux內核層(Linux Kernel)、系統運行層、應用框架層(Application Framework)、應用層(Applications)。

1.1,Linux內核層
  Android系統是基於Linux 2.6內核的,這一層爲Android設備的各類硬件提供了底層的驅動,如顯示驅動、音頻驅動、照相機驅動、藍牙驅動、WiFi驅動、電源管理等。android

1.2,系統運行層
這一層經過一些C/C++庫來爲Android系統提供了主要的特性支持,好比SQLite庫提供了數據庫的支持,OpenGL|ES庫提供了3D繪圖的支持,Webkit庫提供瀏覽器內核的支持等。同時,在這一層還有Android運行時庫,它提供了一些核心庫,能容許開發者使用Java來編寫Android應用。其中,關鍵是Dalvik虛擬機,它使得咱們每個Android應用都能運行在獨立的進程當中,而且擁有一個本身的Dalvik虛擬機實例,相比Java虛擬機(JVM),Dalvik是專門爲移動設備定製的,它對手機內存、CPU性能有限等狀況作了優化處理。數據庫

1.3,應用框架層
這一層主要提供了構建應用時可能用到的API,Android自帶的一些核心應用程序就是使用這些API完成的,開發者能夠經過使用這些API構建本身的應用程序。好比有活動管理器、View系統。內容提供器、通知管理器等。瀏覽器

1.4,應用層
全部安裝在手機上的應用程序都是屬於這一層的,好比系統自帶的聯繫人、短信等程序,或者咱們從Google Play上下載的程序,包括咱們本身開發的應用程序。微信

2,Android已發佈的版本
Android 1.0(沒有開發代號)
Android 1.1 - Petit Four
Android 1.5 - Cupcake
Android 1.6 - Donut
Android 2.0/2.1 - Éclair
Android 2.2 - Froyo
Android 2.3 - Gingerbread
Android 3.0/3.1/3.2 - Honeycomb
Android 4.0 - Ice Cream Sandwich
Android 4.1/4.2/4.3 - Jelly Bean
Android 4.4 - KitKat
Android 5.0/5.1 - Lollipop(Android L)
Android 6.0 - Marshmallow(Android M)
Android 7.0 -Nougat(Android N)
Android 8.0 -Oreo(Android O)
Android 9.0 -Pie (Android P架構

** 3,Android應用特點**
Android主要有什麼特點呢,有如下幾個方面來體現:四大組件、豐富的系統控件、SQLite數據庫等持久化技術、地理位置定位、強大的多媒體、傳感器。
  3.1,四大組件
什麼是四大組件?分別是活動(Activity)、服務(Service)、廣播接收器(BroadCast Receiver)和內容提供器(Content Provider)。其中活動(Activity)就是Android應用程序中看得東西,也是用戶打開一個應用程序的門面,而且與用戶交互的界面,比較高調。服務(Service),則比較低調了,一直在後臺默默的付出,即便用戶退出了,服務仍然是能夠繼續運行的。廣播接收器(BroadCast Receiver),則容許你的應用接收來自各處的廣播消息,好比電話、短信等,能夠根據廣播名稱不一樣,作相應的操做處理,固然了, 除了能夠接受別人發來的廣播消息,自身也能夠向外發出廣播消息,自產自銷。內容提供器(Content Provider),則爲應用程序之間共享數據提供了可能,好比你想要讀取系統電話本中的聯繫人,就須要經過內容提供器來實現。
3.2,豐富的系統控件
Android系統爲開發者提供了豐富的系統控件,咱們能夠編寫漂亮的界面,也能夠經過擴展系統控件,自定義控件來知足自個人需求,常見控件有:TextView、Buttion、EditText、一些佈局控件等。
3.3,持久化技術
Android系統還自帶了SQLite數據庫,SQLite數據庫是一種輕量級、運算速度極快的嵌入式關係型數據庫。它不只支持標準的SQL語法,還能夠經過Android封裝好的API進行操做,讓存儲和讀取數據變得很是方便。
3.4,地理位置定位
移動設備和PC相比,地理位置定位是一大亮點,如今基本Android手機都內置了GPS,咱們能夠經過GPS,結合咱們的創意,打造一款基於LBS的產品,是否是很酷的事情啊,再說,目前火熱的LBS應用也不是空穴來風的,不過在天朝,由於可惡的GFW,只能用些本土化的地圖API,好比百度地圖、高德地圖。要是哪天能用上大谷歌的地圖,那纔是高大上啊。
3.5,強大的多媒體
Android系統提供了豐富的多媒體服務,好比音樂、視頻、錄音、拍照、鬧鈴等,這一切均可以在程序中經過代碼來進行控制,讓你的應用變得更加豐富多彩。
3.6,傳感器
Android手機中內置了多種傳感器,好比加速傳感器、方向傳感器,這是移動設備的一大特色,咱們能夠靈活地使用這些傳感器,能夠作出不少在PC上沒法實現的應用。好比「微信搖一搖"_你懂得,「搜歌搖一搖」等功能。
4,Android開發環境
 開發環境搭建所須要的軟件,配置等攻略,相信你們網上搜一搜,這類文章太多了。這裏只強調重要幾個工具:Android SDK、Eclipse、ADT。
  4.1,Android SDK
Android SDK谷歌提供的Android開發工具包,在開發Android程序時,咱們須要引用該工具包,裏面包含了開發Android應用程序的API。
4.2,Eclipse
開發Java應用程序的神器,最好用IDE工具之一,特色是開源、超強的插件功能、可支持多種語言開發。固然除此以外,谷歌也推出了Android Studio,專門針對Android程序定製的,但由於Android Studio纔剛推出不久,不太穩定,畢竟新工具問題仍是比較多的,Eclipse被應用已經很成熟了,網上各類關於Eclipse疑難雜症的解決方案不少,相比Android Studio就比較少了。
4.3,ADT
ADT全稱叫作"Android Development Tools",是谷歌提供的一個Eclipse插件,用於在Eclipse提供一個強大的、集成的Android開發環境。
4.4,Android Studio
Android Studio 是谷歌推出的一個Android集成開發工具,基於IntelliJ IDEA. 相似 Eclipse ADT,Android Studio 提供了集成的 Android 開發工具用於開發和調試。app

5,Android程序結構
5.1,src
毫無疑問,src目錄是放置咱們全部Java代碼的地方,它在這裏的含義和普通Java項目下的src目錄是徹底同樣的。框架

5.2,gen
這個目錄裏的內容都是自動生成的,主要有一個R.Java文件,你在項目中添加任何資源都會在其中生成一個相應的資源ID,這個文件永遠不要手動去修改它。ide

5.3,assets
這個目錄裏主要能夠存放一些隨程序打包的文件,在你的程序運行時能夠動態讀取到這些文件的內容。另外,若是你的程序中使用到了WebView加載本地網頁的功能,全部網頁相關的文件也都存放在這個目錄下。工具

5.4,bin
這個目錄頁不須要過多的關注,它主要包含了一些在編譯時自動產生的文件。固然,會包括一個編譯好的安裝包,後綴爲.apk的文件。

5.5,libs
若是你的項目中使用到了第三方的jar包,就須要把這些jar包放在libs目錄下,放在這個目錄下的jar包都會被自動添加到構建路徑裏去。

5.6,res
這個目錄下的內容就有點多了,簡單點說,就是你在項目中使用到的全部圖片、佈局、字符串等資源都要存放在這個目錄下,前面提到的R.Java中的內容也是根據這個目錄下的文件自動生成的。固然這個目錄下還有不少子目錄,圖片放在drawable目錄下,佈局放在layout目錄下,字符串放在values目錄下。

5.7,AndroidManifest.xml
這是你整個Android項目的配置文件,你在程序中定義的全部四大組件都須要在這個文件中註冊。另外還能夠在這個文件給應用程序添加權限聲明,也能夠從新指定你建立項目時指定的程序最低兼容版本和目標版本。

5.8,proguard-project.txt
在發佈你的程序時候,有些apk文件容易被人反編譯,因此此時這個文件就發揮做用了,用來混淆你的程序代碼,讓別人不那麼容易看到源代碼。

5.9,project.properties
指定了編譯程序時候所用的SDK版本

Android 四大組件之 " Activity "
1,什麼是活動(Activity)
 活動(Activity)是最容易吸引用戶的地方了,它是一種能夠包含用戶界面的組件,主要用於和用戶進行交互,一個應用程序能夠包含零個或者多個活動。這是我對活動的理解,那咱們再看看官方文檔是怎麼定義的:「An Activity is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map.」大概意思是說,Activity是一個可讓屏幕提供用戶交互動做的組件,好比打電話、照相、發送郵件和查看地圖等。簡單來講,咱們在應用程序中能看到的內容,絕大多數都是Activity組件提供的。

2,活動(Activity)用法
在一個應用程序中,有多個Activity組成,其中,有一個特殊的Activity,那就是「main」Activity,表明了應用程序啓動,看到的首個界面。每一個Activity啓動其餘的Activity能夠經過不一樣動做。接下來咱們來建立一個Activity。

2.1,建立一個Activity
爲了建立一個Activity,咱們必需要繼承Activity的子類,好比:public class MainActivity extends Activity。同時咱們也要重載兩個方法onCreate()、onPause(),代碼以下:

其中onCreate()方法在你的activity建立的時候就調用了,你能夠在這個方法中初始化一些常量、資源的鏈接,其中最重要的是setContentView()方法去加載活動界面的佈局。onPause()方法每每是當你活動交互暫停時,一些在界面上填過的交互數據能夠在這裏保存,以避免形成丟失,用戶體驗很差。
能夠看到每個應用程序,都必須有一個AndroidManifest.xml。

能夠看到,活動的註冊在 標籤中,這裏經過 標籤來對活動進行註冊的,首先咱們使用了android:name屬性來具體註冊哪個活動,在這裏咱們對咱們剛纔定義的MainActivity類進行註冊,因爲在最外層的 標籤中已經經過package屬性指定了包名是com.example.helloworld,所以在註冊活動時這一部分就能夠省略了,固然你能夠定義爲com.example.helloworld.MainActivity,不過直接使用.MainActivity也就足夠了,而後咱們使用了android:label指定活動中的標題欄的內容,標題欄是顯示在活動的最頂部的,須要注意的是,給主活動指定的label不只會成爲標題欄的內容,還會成爲啓動器(Launcher)中應用程序顯示的名稱。以後在 標籤的內容咱們加入了 標籤,並在這個標籤裏添加了 這兩句聲明。表示在手機上點擊應用圖標時,首先啓動的就是這個活動,若是你的應用程序中沒有聲明任何一個活動做爲主活動,這個程序仍然是能夠正常安裝的,只是你沒法在啓動中看到或者打開這個程序。這種沒有主活動的應用程序,基本都是用爲第三方服務居多,好比支付寶快捷支付服務。
基本上以上兩個步驟的結合,這個活動就能在應用程序中運行了。
3,活動(Activity)生命週期
  在說說Activity生命週期以前,咱們先來理解"Activity返回棧」的概念。在Android中,多個Activity定義在一個Task中,也就是說一個Task是一組Activity的集合,而後Activity又被安排在back stack,即返回棧,是按照後進先出的規則進出棧的。如圖:

當從手機中啓動一個應用程序圖標時,應用程序的Task隨之也變成前臺進程,若是首次啓用時,發現不存在Task實例,那麼系統會建立一個Task實例,而後把"main」Activity放入到stack中,默認是棧頂,這樣一個Task就管理了一組棧,棧裏管理多個Activity。當從Activity1中啓動Activity2時,Activity1被推到棧底,Activity2變成棧頂,同理,Activity3進棧的過程和Activity2是同樣的,若是咱們按back按鈕,則Activity3被彈出,系統會根據內存狀況進行銷售或者回收,Activity2則被推到棧頂,以此類推。當一直按back,返回到主頁面,則全部的activitys被所有彈出,則task不復存在。同時,task有兩種狀態:Foreground和Background,前景和背景。當處於Background時,全部的activitys是中止的,當處於Foreground時,表示當前用戶交互的應用程序。

好比兩個應用程序A和B,咱們剛開始啓動了A應用程序,此時Task A是Foreground,用於與用戶交互,當咱們點擊Home Button時,此時Task A變成Background,裏面全部的activitys都是中止的,此時若是咱們又啓動了B應用程序,Task B又會被實例化,Task B變成Foreground,不過Task A仍然是Background,一直等待着被恢復。因此是Android也是一個多任務的系統,不一樣任務是能夠被互相切換的。
好了關於Task和Stack就先了解這麼多,接下來說講Activity的生命週期。每一個活動在其生命週期中最多可能會有四種狀態
運行狀態
暫停狀態
中止狀態
銷燬狀態
  3.1,運行狀態
當一個活動位於返回棧的棧頂時,這時活動就處於運行狀態。系統最不肯意回收的就是處於運行狀態的活動,由於這會帶來很是差的用戶體驗。

3.2,暫停狀態
當一個活動再也不處於棧頂位置,但仍然可見時,這時活動就進入了暫停狀態。好比對話框的形式只會佔用屏幕中間的部分區域,你很快就會在後面看到這種活動,處於暫停狀態的活動仍然是徹底存活的,系統也不肯意去回收這種活動,只有在內存極低的狀況下,系統纔會去考慮回收這種活動。

3.3,中止狀態
當一個活動再也不處於棧頂位置,而且徹底不可見的時候,就進入了中止狀態。系統仍然會爲這種活動保存相應的狀態和成員變量,可是這並非徹底可靠的,當其餘地方須要內存時,處於中止狀態的活動有可能會被系統回收。

3.4,銷燬狀態
當一個活動從返回棧中移除後就變成了銷燬狀態。系統會傾向於回收處於這種狀態的活動,從而保證手機的內存充足。

3.5,七個方法
Activity類中定義了七個回調方法,覆蓋了活動生命週期的每個環節。有以下七個方法:

onCreate()
onStart()
onResume()
onPause()
onStop()
onDestroy()
onRestart()

onCreate():每一個活動中咱們都會重寫這個方法,它會在活動第一次被建立的時候調用,好比完成一些初始化操做,加載佈局、綁定事件等
onStart():這個方法在活動不可見變爲可見的時候調用
onResume():這個方法在活動準備好和用戶進行交互的時候調用,此時的活動必定位於返回棧的棧頂、而且處於運行狀態。
onPause():這個方法在系統準備去啓動或者恢復另外一個活動的時候調用。咱們一般會在這個方法中將一些消耗CPU的資源釋放掉,以及保存一些關鍵數據,但這個方法的執行速度必定要快,否則會影響到新的棧頂活動的使用。
onStop():這個方法在活動徹底不可見的時候調用。它和onPause()方法主要區別在於,若是啓動的新活動是一個對話框式的活動,那麼onPause()方法會獲得執行,而onStop()方法不會執行。
onDestroy():這個方法在活動被銷燬以前調用,以後活動的狀態將變爲銷燬狀態。
onRestart():這個方法在活動由中止狀態變爲運行狀態以前調用,也就是活動被從新啓動了。

除此以外,活動又能夠分爲三種生存期

完整生存期:活動在onCreate()和onDestroy()方法之間所經歷的
可見生存期:活動在onStart()和onStop()方法之間所經歷的
交互活動期:活動在onResume()和onPause()方法之間所經歷的
如圖:

UI組件
1.Toast組件的使用

<Button
        android:id="@+id/button20"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="Toast顯示文本"
        android:clickable="true"
        android:onClick="viewText"/>
public void viewText(View v){
        //getApplicationContext() 應用程序上下文,做用域爲整個程序  全局變量
        //this:當前對象(當前界面的上下文)
        //參數(上下文,要顯示的文本內容,顯示的時間(Toast.LENGTH_LONG、Toast.LENGTH_SHORT))
        Toast.makeText(getApplicationContext(),"今每天氣真好!晴空萬里",Toast.LENGTH_LONG).show();
    }

  1. Toast顯示圖片和圖文
<Button
        android:id="@+id/button21"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignEnd="@id/button20"
        android:layout_alignRight="@id/button20"
        android:layout_below="@id/button20"
        android:text="Toast顯示圖片"
        android:onClick="viewImage"/>
/*
    * Toast顯示文本
    * @prama v
    * */
    public void viewImage(View v){
        Toast t=new Toast(this);
        //用於顯示圖片的組件
        ImageView imageView=new ImageView(this);
        //爲圖片組件設置圖片(不能以數字命名)
        imageView.setImageResource(R.drawable.cat);
        t.setView(imageView);
        t.setDuration(Toast.LENGTH_LONG);
        //設置顯示的位置
        t.setGravity(Gravity.TOP,0,0);
        t.show();
    }

通知
通知(Notification)是Android中一個比較有特點的功能,因爲受到用戶的承認和喜好,IOS後來也加入了相似的功能。那麼本篇文章就對Android Notification的使用方法作一個詳細說明。Notification其實是一則消息,不過這個消息顯示在應用程序UI界面以外。也便是說,當你發出一條通知,它首先會在手機最上方的狀態欄顯示一個通知圖標,下拉狀態欄後能夠看到通知詳細內容。
建立一個最簡單的通知
建立一個通知,你須要首先建立Notification.Builder對象,語法以下:
Notification.Builder builder = new Notification.Builder(this)
其中,this是Context實例。
而後使用builder開始構建通知的外觀,有三個內容必需要進行設置的,缺一不可。

通知圖標:由builder.setSmallIcon()設置
通知標題:由builder.setContentTitle()設置
通知內容:由builder.setContentText()設置
下表列出了Notification.Builder類中的其餘一些經常使用方法:

接着就調用NotificationCompat.Builder.build()方法來建立出Notification實例。最後將建立出來的Notification實例傳遞給NotificationManager.notify()方法就能夠彈出一條通知。

下面代碼建立並顯示了一個最簡單的通知:

佈局文件,activity_main.xml :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:gravity="center"
              android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hello world"
        android:textSize="22sp"/>

MainActivity.java :

public void notification(View view)
{
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    Notification.Builder builder =
            new Notification.Builder(this)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                    .setContentTitle("通知標題")
                    .setContentText("通知內容")
                    .setAutoCancel(true);

    Intent intent = new Intent(this, NotificationActivity.class);
    PendingIntent pi = PendingIntent.getActivity(this, 0, //
            intent, PendingIntent.FLAG_UPDATE_CURRENT);
    builder.setContentIntent(pi);

    manager.notify(0, builder.build());
}

第13行,建立了一個Intent實例,這個Intent用於啓動NotificationActivity;第14行,使用PendingIntent.getActivity()方法建立一個PendingIntent實例,第一個參數是Context對象;第二個參數是requestCode,通常傳0就能夠;第三個參數是一個Intent對象;第四個參數是flag,這裏給PendingIntent.FLAG_UPDATE_CURRENT,固然還有別的flag,你們能夠查閱相關文檔。第16行,調用builder.setContentIntent(pi)方法將建立好的PendingIntent對象設置進去。下面是程序運行效果:

相關文章
相關標籤/搜索