日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Android開發(fā)之應(yīng)用程序基礎(chǔ)及組件(續(xù))

系統(tǒng) 2129 0

成功屬于耐得住寂寞的人,你離成功又近了一步了。

引言

上篇 Android開發(fā)之應(yīng)用程序基礎(chǔ)及組件 介紹了應(yīng)用程序的基礎(chǔ)知識(shí)及Android的四個(gè)組件,本篇將介紹如何激活組關(guān)閉組件等。本文的主題如下:

  • 1、激活組件:意圖(Intents)
    • 1.1、活動(dòng)(Activity)組件的激活
    • 1.2、服務(wù)(Service)組件的激活
    • 1.3、廣播接收者(Broadcast receiver)組件的激活
  • 2、關(guān)閉組件
  • 3、清單文件
  • 4、Intent過濾器

1、激活組件:意圖(Intents)

當(dāng)接收到 ContentResolver 發(fā)出的請(qǐng)求后,內(nèi)容提供者被激活。而其它三種組件——活動(dòng)、服務(wù)和廣播接收者,被一種叫做 意圖( intent )的異步消息 激活。意圖是一個(gè)保存著消息內(nèi)容的 Intent 對(duì)象。 對(duì)于活動(dòng)和服務(wù)來說 ,Intent對(duì)象指明了請(qǐng)求的操作名稱以及作為操作對(duì)象的數(shù)據(jù)的URI和其它一些信息。例如,它可以傳遞對(duì)活動(dòng)的一個(gè)請(qǐng)求,讓它為用戶顯示一張圖片,或者讓用戶編輯一些文本。 而對(duì)于廣播接收者而言 ,Intent對(duì)象指明了廣播的行為。例如當(dāng)照相按鈕被按下,它可以對(duì)所有感興趣的對(duì)象廣播。

對(duì)于每種組件來說,激活的方法是不同的。下面將分別介紹活動(dòng)、服務(wù)、廣播接收者組件的激活方法。

1.1、活動(dòng)(Activity)組件的激活

通過傳遞一個(gè)Intent對(duì)象至 Context.startActivity() Activity.startActivityForResult() 以載入(或指定新工作給)一個(gè)活動(dòng)。相應(yīng)的活動(dòng)可以看到初始的意圖,這個(gè)意圖通過 getIntent() 方法來查看激活活動(dòng)。Android調(diào)用活動(dòng)的 onNewIntent() 方法傳遞任何后續(xù)的意圖。

一個(gè)活動(dòng)經(jīng)常啟動(dòng)了下一個(gè)。如果它期望它所啟動(dòng)的那個(gè)活動(dòng)返回一個(gè)結(jié)果,它會(huì)調(diào)用 startActivityForResult() 而不是 startActivity() 。例如,如果它啟動(dòng)了一個(gè)活動(dòng)讓用戶挑選一張照片,它可能會(huì)返回被選中的照片。結(jié)果以一個(gè)Intent對(duì)象傳遞調(diào)用活動(dòng)的 onActivityResult() 方法。

1.2、服務(wù)(Service)組件的激活

通過傳遞一個(gè)Intent對(duì)象至 Context.startService() 以啟動(dòng)一個(gè)服務(wù)(或給予正在運(yùn)行的服務(wù)以一個(gè)新的指令)。Android調(diào)用服務(wù)的 onStart() 方法并將Intent對(duì)象傳遞給它。

與此類似,一個(gè)Intent可以傳遞給 Context.bindService() 以在調(diào)用的組件和目標(biāo)服務(wù)之間建立持續(xù)的連接。這個(gè)服務(wù)會(huì)在調(diào)用 onBind() 方法中接受這個(gè)Intent對(duì)象(如果服務(wù)尚未啟動(dòng), bindService() 會(huì)先啟動(dòng)它)。例如,一個(gè)活動(dòng)可以連接至前面講到的音樂播放服務(wù),并提供給用戶一個(gè)可操作的(用戶界面)以對(duì)播放進(jìn)行控制。這個(gè)活動(dòng)可以調(diào)用 bindService() 來建立連接,然后調(diào)用服務(wù)中定義的對(duì)象來控制播放。

1.3、廣播接收者(Broadcast receiver)組件的激活

應(yīng)用程序可以通過將Intent對(duì)象傳遞給

  • Context.sendBroadcast()
  • Context.sendOrderedBroadcast()
  • Context.sendStickyBroadcast()

及其它類似方法來產(chǎn)生一個(gè)廣播。Android會(huì)通過 onReceive() 方法將intent傳遞給所有對(duì)此廣播有興趣的廣播接收者。

2、關(guān)閉組件

內(nèi)容提供者僅在響應(yīng) ContentResolver 提出請(qǐng)求的時(shí)候激活。而一個(gè)廣播接收者僅在響應(yīng)廣播信息的時(shí)候激活。所以,沒有必要去顯式的關(guān)閉這些組件。

而活動(dòng)則不同,它提供了用戶界面。與用戶進(jìn)行會(huì)話,所以只要會(huì)話依然持續(xù),哪怕對(duì)話進(jìn)程空閑,它都會(huì)一直保持激活狀態(tài)。與此相似,服務(wù)也會(huì)在很長(zhǎng)一段時(shí)間內(nèi)保持運(yùn)行。所以Android提供方法有序地關(guān)閉活動(dòng)和服務(wù)。

  • 可以通過調(diào)用它的 finish() 方法來關(guān)閉一個(gè)活動(dòng)。一個(gè)活動(dòng)也可以通過調(diào)用 finishActivity() 方法來關(guān)閉另外一個(gè)活動(dòng)(它用startActivityForResult() 啟動(dòng)的)。
  • 服務(wù)可以通過調(diào)用它的 stopSelf() 方法來停止,或者調(diào)用 Context.stopService()

當(dāng)組件不再被使用的時(shí)候或者Android必須要為更多活躍的組件回收內(nèi)存時(shí),組件也可能會(huì)被系統(tǒng)關(guān)閉。

3、清單(manifest)文件

當(dāng)Android啟動(dòng)一個(gè)應(yīng)用程序組件之前,它必須知道那個(gè)組件是存在的。所以,應(yīng)用程序會(huì)在一個(gè)清單(manifest)文件中聲明它的組件,這個(gè)文件會(huì)被打包到Android包中。這個(gè).apk文件還將包括應(yīng)用程序的代碼、文件以及其它資源。

這個(gè)清單文件是XML結(jié)構(gòu)的文件,且所有的Android應(yīng)用程序都把它叫做 AndroidManifest.xml 。為聲明一個(gè)應(yīng)用程序組件,它還會(huì)做很多額外工作,比如指明應(yīng)用程序所需鏈接到的庫的名稱(除了默認(rèn)的Android庫之外)以及聲明應(yīng)用程序期望獲得的各種權(quán)限。

但清單文件的主要功能仍然是向Android聲明應(yīng)用程序的組件。舉例說明,一個(gè)活動(dòng)可以如下聲明:

      
      
      
        AndroidManifest.xml
      
      
        
          <?
        
        xml version="1.0" encoding="utf-8"
        
          ?>
        
        
          <
        
        
          manifest
        
         . . . 
        
          >
        
        
          <
        
        
          application
        
         . . . 
        
          >
        
        
          <
        
        
          activity
        
        
          android
        
        :
        
          name
        
        =
        
          "com.example.project.FreneticActivity"
        
        
          android
        
        :
        
          icon
        
        =
        
          "@drawable/small_pic.png"
        
        
          android
        
        :
        
          label
        
        =
        
          "@string/freneticLabel"
        
        
                    . . .  
        
          >
        
        
          </
        
        
          activity
        
        
          >
        
        
          . . . 
     
        
          </
        
        
          application
        
        
          >
        
        
          </
        
        
          manifest
        
        
          >
        
      
      

<activity> 元素的 name 屬性指定了實(shí)現(xiàn)了這個(gè)活動(dòng)的 Activity 類的子類, icon label 屬性指向了包含展示給用戶的此活動(dòng)的圖標(biāo)和標(biāo)簽的資源文件。

其它組件也以類似的方法聲明—— <service> 元素用于聲明服務(wù), <receiver> 元素用于聲明廣播接收者,而 <provider> 元素用于聲明內(nèi)容提供者。清單文件中未進(jìn)行聲明的活動(dòng)、服務(wù)以及內(nèi)容提供者將不為系統(tǒng)所見,從而也就不會(huì)被運(yùn)行。然而,廣播接收者既可以在清單文件中聲明,也可以在代碼中動(dòng)態(tài)的創(chuàng)建(作為 BroadcastReceiver 對(duì)象)且調(diào)用 Context.registerReceiver() 方式注冊(cè)到系統(tǒng)。

4、Intent過濾器

Intent對(duì)象可以顯式地指定目標(biāo)組件。如果進(jìn)行了這種指定,Android會(huì)找到這個(gè)組件(依據(jù)清單文件中的聲明)并激活它。但如果Intent沒有進(jìn)行顯式的指定,Android就必須為它找到對(duì)于intent來說最合適的組件。 這個(gè)過程是通過比較Intent對(duì)象和所有可能對(duì)象的intent過濾器完成的 。組件的intent過濾器會(huì)告知Android它所能處理的intent類型。如同其它關(guān)于組件的必要信息一樣,它們?cè)谇鍐挝募羞M(jìn)行聲明的。這里是上面示例的一個(gè)擴(kuò)展,其中加入了針對(duì)活動(dòng)的兩個(gè)intent過濾器聲明:

          
          
          
            AndroidManifest.xml
          
          
            
              <?
            
            xml version="1.0" encoding="utf-8"
            
              ?>
            
            
              <
            
            
              manifest
            
             . . . 
            
              >
            
            
              <
            
            
              application
            
             . . . 
            
              >
            
            
              <
            
            
              activity
            
            
              android
            
            :
            
              name
            
            =
            
              "com.example.project.FreneticActivity"
            
            
              android
            
            :
            
              icon
            
            =
            
              "@drawable/small_pic.png"
            
            
              android
            
            :
            
              label
            
            =
            
              "@string/freneticLabel"
            
            
                    . . .  
            
              >
            
            
              <
            
            
              intent
            
            -
            
              filter
            
             . . . 
            
              >
            
            
              <
            
            
              action
            
            
              android
            
            :
            
              name
            
            =
            
              "android.intent.action.MAIN"
            
            
              />
            
            
              <
            
            
              category
            
            
              android
            
            :
            
              name
            
            =
            
              "android.intent.category.LAUNCHER"
            
            
              />
            
            
              </
            
            
              intent
            
            -filter
            
              >
            
            
              <
            
            
              intent
            
            -
            
              filter
            
             . . . 
            
              >
            
            
              <
            
            
              action
            
            
              android
            
            :
            
              name
            
            =
            
              "com.example.project.BOUNCE"
            
            
              />
            
            
              <
            
            
              data
            
            
              android
            
            :
            
              mimeType
            
            =
            
              "image/jpeg"
            
            
              />
            
            
              <
            
            
              category
            
            
              android
            
            :
            
              name
            
            =
            
              "android.intent.category.DEFAULT"
            
            
              />
            
            
              </
            
            
              intent
            
            -filter
            
              >
            
            
              </
            
            
              activity
            
            
              >
            
            
          . . . 
     
            
              </
            
            
              application
            
            
              >
            
            
              </
            
            
              manifest
            
            
              >
            
          
          

示例中的第一個(gè)過濾器——action:“android.intent.action.MAIN”和category:“android.intent.category.LAUNCHER”的組合,是常見的。它標(biāo)記這個(gè)活動(dòng)顯示在應(yīng)用程序啟動(dòng)器中,用戶在設(shè)備上看到的可啟動(dòng)的應(yīng)用程序列表。換句話說,這個(gè)活動(dòng)是應(yīng)用程序的入口,是用戶選擇運(yùn)行這個(gè)應(yīng)用程序后所見到的第一個(gè)活動(dòng)。第二個(gè)過濾器聲明了這個(gè)活動(dòng)針對(duì)特定類型的數(shù)據(jù)。

一個(gè)組件可以擁有任意數(shù)量的intent過濾器,每個(gè)聲明一系列不同的能力。如果它沒有包含任何過濾器,它將只能被顯式聲明了目標(biāo)組件名稱的意圖激活。

對(duì)于廣播接收者,它在代碼中創(chuàng)建并注冊(cè)intent過濾器,直接作為IntentFilter的對(duì)象實(shí)例化。其它過濾器則在清單文件中設(shè)置。

?

如果您現(xiàn)在對(duì)這些概念還沒有完全理解,沒關(guān)系這里我僅是讓大家有個(gè)印象,知道這些概念或術(shù)語的存在,知道他們大概是做什么的。后面我還將陸續(xù)更詳細(xì)地到這些東西并結(jié)合一些實(shí)例,到時(shí)候您就會(huì)清楚地知道這些東西。

?

?

Android開發(fā)之應(yīng)用程序基礎(chǔ)及組件(續(xù))


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 正阳县| 合川市| 沅江市| 资溪县| 龙井市| 昭平县| 通许县| 浮山县| 体育| 临夏市| 鹿邑县| 定襄县| 福泉市| 宁阳县| 仪征市| 晋州市| 鹿邑县| 靖边县| 栾城县| 克什克腾旗| 永昌县| 嘉禾县| 平果县| 咸阳市| 连江县| 北流市| 麻城市| 荥阳市| 清镇市| 吉隆县| 彩票| 辽中县| 灵石县| 富蕴县| 中宁县| 健康| 新龙县| 沙洋县| 潞城市| 建始县| 河津市|