萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 安卓開發 >> android 從資源中獲取數組

android 從資源中獲取數組

   8.1.1.概述
除了在Java代碼中定義數組,Android還提供了在資源中定義數組,然後在Java代碼中解析資源,從而獲取數組的方法。
實際開發中,推薦將數據存放在資源文件中,以實現程序的邏輯代碼與數據分離,便於項目的管理,盡量減少對Java代碼的修改。
8.1.2.在資源中定義數組
步驟1、在res/values文件夾下創建arrays.xml文件;
步驟2、在arrays.xml文件中創建一個數組,如下代碼所示:
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string-array name="citys">
<item>北京</item>
<item>天津</item>
<item>上海</item>
<item>重慶</item>
</string-array>
</resources>
說明:
Android規定存放數組的文件必須在res/values文件夾下創建,推薦存放資源數組的文件名為arrays.xml。
以上定義了一個含有四個直轄市名稱的字符串數組,數組名是citys,數組元素在<item>標簽中存放。
8.1.3.Resource類
8.1.3.1.概述
Android提供了Resource類,通過該類提供的方法可以很方便地獲取資源中的數據,如資源中定義的數組。
8.1.3.2.創建Resources對象
getResource();
作用:該方法是ContextWrapper類的靜態方法,用於創建Resources對象。
示例:以下代碼創建一個Resources對象:
Resources res=Resources.getResource();
說明:該方法必須在Context類及其子類中才能使用。
8.1.3.4.常用方法
getStringArray(int resId);
作用:獲取資源索引值為resId的字符串類型的數組。
示例:以下代碼將8.1.2.中創建的citys數組獲取並存放在數組citys中:
Resources res=getResources();
String[] citys=res.getStringArray(R.array.citys);
提示:Resources還提供了獲取int、boolean等類型的數組的方法,本章僅介紹本章代碼中用到的獲取字符串數組的方法。
8.2.ListView控件
8.2.1.概述
ListView是android應用程序中使用頻率最高的控件。該控件使用垂直列表的方式顯示多個選項,特別適合於手機這種屏幕相對較小的設備。
ListView控件的特點:每個列表項獨占一行,每行的布局都相同,數據和布局分離,
數據來自適配器,ListView只負責顯示,圖-1是ListView的一個應用:
圖-1
8.2.2.常用屬性
XML屬性
說明
choiceMode
設置ListView的選擇方式,有三個值:
(1)none:默認方式
(1) SingleChoice:單選
(2) multipleChoice:復選
divider
設置列表項的分隔條,分隔條可以是顏色值也可以是圖片
entries
指定一個字符串數組資源,用於顯示在ListView中
8.2.3.常用方法
1、Object getItemAtPosition(int position)
作用:獲得當前列表項
參數-position:當前列表項的索引值。
示例:
//獲取索引值是position的列表項,轉換為字符串
String text=(String)listView.getItemAtPosition(position);
2、void setChoiceMode(int choiceMode)
作用:設置列表的選擇方式
參數-choiceMode有以下三個可選值:

進程的優先級
12.1.1.概述
Android規定:進程的優先級分為以下五個級別,如圖-1所示:
圖-1
1、 前台進程 -Activte process
Active (前台) process是包含(與用戶交互的)控件的那種應用程序。這些是Android通過回收資源來極力保護的進程。Active process包括:
(1)處於“active”狀態的Activity,它們運行在前台來響應用戶的事件。
(2)Activity Service或者正在執行onReceive事件處理函數的Broadcast Receiver。
(3)正在執行onStart,onCreate,OnDestroy事件處理函數的Service。
2、 可見進程-Visible Process
可見但不活動的進程是那些擁有“可見”Activity的進程。“可見”Activity是那些在屏幕上可見,但不是在前台或不響應用戶事件的Activity。這種情況發生在當一個Activity被部分遮蓋的時候(被一個非全屏或者透明的Activity)。可見進程只在極端的情況下,才會被殺死來保證Active Process的運行。包括以下情況:
(1)可見的Activity,但處於暫停(onPause()) 狀態;
(2)被可見Activity綁定的Service
3、 服務進程 Service process 
進程中包含已經啟動的Service。Service以動態的方式持續運行但沒有可見的界面。因為Service不直接和用戶交互,它們擁有比visible Process較低的優先級。它們還是可以被認為是前台進程,不會被殺死,直到資源被active/visible Process需求。
4、 背景進程 Background process
進程中的Activity不可見和進程中沒有任何啟動的Service,這些進程都可以看作是後台進程。在系統中,擁有大量的後台進程,並且Android按照後看見先殺掉的原則來殺掉後台進程以獲取資源給前台進程。
5、 空進程-Empty process
為了改善整個系統的性能,Android經常在內存中保留那些已經走完生命周期的應用程序。Android維護這些緩存來改善應用程序重新啟動的時間。這些進程在資源需要的時候常常被殺掉。
當一個進程被殺掉,進程保留,變成空進程。
12.1.2.設置/取消Service為前台進程的方法
由上所述,Service排在進程的第三優先級,通常耗時的操作是放在線程中,那麼將這樣的線程放在Service中將會有較高的優先級,降低被Android系統殺掉的幾率。
若是將線程放在Activity中,當Activity被完全遮蓋,處於onStop狀態時,其進程的優先級別降為第四級。明顯不如放在處於第三級別的Service中更保險。
應用場景,如音樂播放器,通過在前台做其它操作時,音樂播放器在後台播放音樂,這種情況將播放音樂的線程放在Service中是適宜的。
Service類中有兩個方法,分別用來設置Service為前台進程和取消前台進程。被設置為前台進程的Service擁有最高的優先級別,被Android系統殺掉的幾率降至最低。
1、startForeground(int id,Notification noti);
作用:設置Service對象為前台進程。
說明:
第一個參數是通知的id值。

第二個參數是通知對象。
startForegroud方法的參數與通知管理器相同,使用上也類似,都是發送一個通知,並指定該通知對象的id值。
2、stopForeGround(int id);
作用:取消(指定id值所通知的Service對象)前台進程。
12.1.3.設置Service為前台進程的步驟
步驟1、在Service類的onStartCommand方法中(通常在該方法中)創建Intent對象,並指定與其綁定的Activity,示例代碼如下:
Intent foreIntent=new Intent(this, MainActivity.class);
步驟2、創建PendingIntetn對象
PendingIntent pintent=PendingIntent.getActivity(
this, 0, foreIntent, PendingIntent.FLAG_UPDATE_CURRENT);
說明:第四個參數指明在通知欄隨時刷新通知。
步驟3、創建通知對象,示例代碼如下:
Notification noti=new Notification(
R.drawable.icon,"notification",System.currentTimeMillis());
說明:
第一個參數是通知欄中顯示的本通知的圖標。
第二個參數是通知欄中顯示的本通知的標題。
第三個參數是本通知發出的時間。
步驟4、將此通知放到通知欄的(Ongoing)正在運行組中,示例代碼如下:
noti.flags=Notification.FLAG_ONGOING_EVENT;
步驟5、設置通知的點擊事件,示例代碼如下:
noti.setLatestEventInfo(this, "title","content", pintent);
步驟6、向指定的Activity發送通知,並設置當前的Service對象為前台進程,示例代碼如下:
startForeground(97789, noti);
12.1.4.示例
運行圖-1所示的窗口:
圖-2
1、單擊圖-1中的start foreground按鈕,將啟動一個Service對象,並設置改Service為前台進程,在該在日志窗口中出現圖-2中紅框內的第一行信息。
2、單擊圖-2中的stop foreground按鈕,將取消Service的當前進程,並在日志窗口中顯示圖-2中紅框內的第二行信息。
以下列出關鍵代碼:
步驟1、創建項目exer12_01,包名為com.tarena.exer12_01,項目入口:MainActivity類,該中關鍵代碼如下所示:
@Override
public void onClick(View v) {
//創建Intent對象,並設置目標組件為MyService
Intent intent=new Intent();
intent.setClass(this, MyService.class);
switch(v.getId()){
case R.id.btnStartFore:
//設置intent.action的值為Constant.ACTION_FORE
intent.setAction(Constant.ACTION_FORE);
startService(intent);//啟動服務
break;
case R.id.btnStopFore:
//設置intent.action的值為Constant.ACTION_STOP_FORE
intent.setAction(Constant.ACTION_STOP_FORE);
startService(intent);
break;
case R.id.btnStopService:
stopService(intent);//停止服務
break;
}
}
步驟2、在src/com.tarena.exer12_01包下創建MyService.java該類繼承自Service類。關鍵代碼如下所示:
@Override

copyright © 萬盛學電腦網 all rights reserved