Ⅰ android 原生atts.xml在哪個文件下面
Android開發之XML文件的解析的三種方法
/*
* Android開發之XML文件的解析的三種方法
*
* Created on: 2012-7-24
* Author: blueeagle
* Email:[email protected]
*/
本文主要講解Android開發中如何對XML文件的解析,由於XML文件具有與平台無關,廣泛應用於數據通信中,因此解析XML文件就顯得很有意義。Android對XML文件解析的方法主要有3種。 通常有三種方式:DOM、SAX和PULL,下面就分別針對這三種方式來進行討論。
假設我們在開發天氣預報應用程序的時候,使用google給我們提供的API,以及天氣預報數據,例如我們要獲得北京當前的天氣預報數據,即可在瀏覽器中輸入如下地址:http://www.google.com/ig/api?&weather=beijing。 則可以看到一個XML文件展現在我們面前,對於此XML文件Google給我們的說明是:
「This XML file does not appear to have any style informationassociated with it. The document tree is shown below」.即此XML文件沒有任何樣式信息,只有文檔結構樹的顯示。
文件內容如下所示:
[html] view plain
<xml_api_reply version="1">
<weather mole_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0">
<forecast_information>
<city data="Beijing, Beijing"/>
<postal_code data="beijing"/>
<latitude_e6 data=""/>
<longitude_e6 data=""/>
<forecast_date data="2012-07-24"/>
<current_date_time data="2012-07-24 15:30:00 +0000"/>
<unit_system data="SI"/>
</forecast_information>
<current_conditions>
<condition data="多雲"/>
<temp_f data="77"/>
<temp_c data="25"/>
<humidity data="濕度: 78%"/>
<icon data="/ig/images/weather/cn_cloudy.gif"/>
<wind_condition data="風向: 東北、風速:2 米/秒"/>
</current_conditions>
<forecast_conditions>
<day_of_week data="周二"/>
<low data="22"/>
<high data="30"/>
<icon data="/ig/images/weather/cn_cloudy.gif"/>
<condition data="多雲"/>
</forecast_conditions>
<forecast_conditions>
<day_of_week data="周三"/>
<low data="24"/>
<high data="30"/>
<icon data="/ig/images/weather/chance_of_rain.gif"/>
<condition data="可能有雨"/>
</forecast_conditions>
<forecast_conditions>
<day_of_week data="周四"/>
<low data="25"/>
<high data="29"/>
<icon data="/ig/images/weather/thunderstorm.gif"/>
<condition data="雷陣雨"/>
</forecast_conditions>
<forecast_conditions>
<day_of_week data="周五"/>
<low data="24"/>
<high data="31"/>
<icon data="/ig/images/weather/chance_of_storm.gif"/>
<condition data="可能有暴風雨"/>
</forecast_conditions>
</weather>
</xml_api_reply>
附上出處鏈接:http://blog.csdn.net/shidahong/article/details/7799741
Ⅱ android的String.xml文件中使用%s表示什麼意思,怎麼使用
今天更新新版android SDK,發現對xml配置文件中各個控制項屬性設置更加嚴謹了,以前在strings.xml里配置的帶有 %s,%f 等變數格式的符號要求更加成%1$s,%1$f這樣的符號來代替,其中%1表示第一個位置的變數, $s表示為字元串類。
Ⅲ android 怎麼把倆個xml文件整合到一起
private ViewGroup group;
private ViewGroup main;
main = (ViewGroup) inflater.inflate(R.layout.main, null);//這里的R。latout.main就是當前布局
group = (ViewGroup) main.findViewById(R.id.viewGroup);
group.addView(imageViews[i]);//這樣就把一個imageview(你可添加一個任意復雜的View,這個View實例化的時候指向你所謂的其他布局文件)加入當前布局中的某個ViewGroup里了,你布局時可定義一個LinearLayout id 設為(R.id.viewGroup),oratation設為垂直,放到下面就是了。
Ⅳ android裡面怎麼解析xml
Android解析xml文件總共有三種方法,分別是:
SAX解析XML文件:SAX是一個解析速度快並且佔用內存少的xml解析器,非常適合用於Android等移動設備。SAX解析XML文件採用的是事件驅動,也就是說,它並不需要解析完整個文檔,在按內容順序解析文檔的過程中,SAX會判斷當前讀到的字元是否合法XML語法中的某部分,如果符合就會觸發事件。所謂事件,其實就是一些回調(callback)方法,這些方法(事件)定義在ContentHandler介面。如下代碼:
java">publicstaticList<Person>readXML(InputStreaminStream){
try{
//創建解析器
SAXParserFactoryspf=SAXParserFactory.newInstance();
SAXParsersaxParser=spf.newSAXParser();
//設置解析器的相關特性,true表示開啟命名空間特性
saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
XMLContentHandlerhandler=newXMLContentHandler();
saxParser.parse(inStream,handler);
inStream.close();
returnhandler.getPersons();
}catch(Exceptione){
e.printStackTrace();
}
returnnull;
}
//SAX類:DefaultHandler,它實現了ContentHandler介面。在實現的時候,只需要繼承該類,重載相應的方法即可。
{
privateList<Person>persons=null;
privatePersoncurrentPerson;
privateStringtagName=null;//當前解析的元素標簽
publicList<Person>getPersons(){
returnpersons;
}
//接收文檔開始的通知。當遇到文檔的開頭的時候,調用這個方法,可以在其中做一些預處理的工作。
@Override
publicvoidstartDocument()throwsSAXException{
persons=newArrayList<Person>();
}
//接收元素開始的通知。當讀到一個開始標簽的時候,會觸發這個方法。其中namespaceURI表示元素的命名空間;
//localName表示元素的本地名稱(不帶前綴);qName表示元素的限定名(帶前綴);atts表示元素的屬性集合
@Override
publicvoidstartElement(StringnamespaceURI,StringlocalName,StringqName,Attributesatts)throwsSAXException{
if(localName.equals("person")){
currentPerson=newPerson();
currentPerson.setId(Integer.parseInt(atts.getValue("id")));
}
this.tagName=localName;
}
//接收字元數據的通知。該方法用來處理在XML文件中讀到的內容,第一個參數用於存放文件的內容,
//後面兩個參數是讀到的字元串在這個數組中的起始位置和長度,使用newString(ch,start,length)就可以獲取內容。
@Override
publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{
if(tagName!=null){
Stringdata=newString(ch,start,length);
if(tagName.equals("name")){
this.currentPerson.setName(data);
}elseif(tagName.equals("age")){
this.currentPerson.setAge(Short.parseShort(data));
}
}
}
//接收文檔的結尾的通知。在遇到結束標簽的時候,調用這個方法。其中,uri表示元素的命名空間;
//localName表示元素的本地名稱(不帶前綴);name表示元素的限定名(帶前綴)
@Override
publicvoidendElement(Stringuri,StringlocalName,Stringname)throwsSAXException{
if(localName.equals("person")){
persons.add(currentPerson);
currentPerson=null;
}
this.tagName=null;
}
}
DOM解析XML文件: DOM解析XML文件時,會將XML文件的所有內容讀取到內存中,然後允許您使用DOM API遍歷XML樹、檢索所需的數據。使用DOM操作XML的代碼看起來比較直觀,並且,在某些方面比基於SAX的實現更加簡單。但是,因為DOM需要將XML文件的所有內容讀取到內存中,所以內存的消耗比較大,特別對於運行Android的移動設備來說,因為設備的資源比較寶貴,所以建議還是採用SAX來解析XML文件,當然,如果XML文件的內容比較小採用DOM是可行的。
Pull解析器解析XML文件: Pull解析器的運行方式與 SAX 解析器相似。它提供了類似的事件,如:開始元素和結束元素事件,使用parser.next()可以進入下一個元素並觸發相應事件。事件將作為數值代碼被發送,因此可以使用一個switch對感興趣的事件進行處理。當元素開始解析時,調用parser.nextText()方法可以獲取下一個Text類型元素的值
Ⅳ android.xml哪個命令是獲取root許可權
Android的應用程序入口肯定是java程序。應用程序的啟動者是由系統臨時根據Androidmanifest.xml中定義的許可權而創建的臨時用戶。而不像linux那樣是使用登陸者的身份啟動,從而使得進程具有登陸者的所有許可權。這也是Android的安全機制之一。
新的許可權機制也帶來新的問題,Android給應用程序的許可權是按功能來分,java雖然可以訪問文件系統。但由於應用程序本身是臨時用戶啟動,這個臨時用戶許可權十分有限。因此誕生了<越獄/root機器>這樣的產物。
其實root機器不是真正能讓你的應用程序具有root許可權。它原理就跟linux下的像sudo這樣的命令。在系統的bin目錄下放個su程序並屬主是root並有suid許可權。則通過su執行的命令都具有Android root許可權。
Su的源代碼網上也有,有興趣的同學去google下。
當然使用臨時用戶許可權想把su拷貝的/system/bin目錄並改屬性並不是一件容易的事情。這里用到2個工具跟2個命令。工具就是busybox。不熟悉的同學可以去網上google下。這個太有名了我就不多說了。
把busybox拷貝到你有許可權訪問的目錄然後給他賦予4755許可權,你就可以用它做很多事了。
當然busybox只能不能提升許可權,真正提升許可權的是ratc這個程序,這個程序中一鍵root包裡面可以找到,作用是rooting在adb的shell。
網上介紹Ratc的文章不多,它是rage against the cage 的縮寫。是真正的提升許可權的破解程序。雖然我沒看過源代碼,但估計是利用adb源代碼部分內容來實現的,原理估計跟模擬器使用adb shell登陸可以獲得root shell差不多。(因為它運行需要adb連接才會成功)。
使用busybox前先運行ratc,這樣運行busybox的UID將是0,也就是root。
首先把system目錄改成可讀性的:busybox mount -o remount,rw /system,當然你還不能改下面的文件,因為system下文件的所有者都不是你,但你可以偷梁換柱把system下的目錄給換掉。
使用命令Busybox mount -t tmpfs none /system/xbin,呵呵這下xbin目錄你隨便寫了。
將su跟busybox弄過去cp /data/data/xxx/su /system/xbin。然後賦許可權chmod 4755 /system/xbin/su。然後使目錄生效busybox --install -s /system/xbin,別忘善後busybox mount -o remount,ro /system去掉system可寫。
這樣只是臨時的,只能用su跟busybox能執行一些原來系統沒有許可權執行的命令而已。當系統重啟後/system/xbin又變為原來的文件。真正要改系統的話需要自己寫內核代碼(相當於windows的驅動程序)。內核文件擁有所有許可權。使用busybox命令insmod /data/data/xxx/xxx.ko裝載內核文件,你想幹嘛就可以幹嘛了。
當然我們不是搞破解的沒必要去改別人的機器,我們只是想讓自己應用程序具有root許可權而已。所以臨時的su就可以了。我們用c++寫一個可執行文件。使用socket可以跟java的程序通訊。然後將需要使用root許可權才能執行的代碼放在c++程序里,然後java程序中創建新的su進程,將c++程序帶全路徑作為參數1。啟動後就可以通過socket調用c++函數去執行你想乾的事了。
最後程序執行完了別忘了善後busybox umount /system/xbin。
最後說說要注意的事情,如果機器已經擁有Android root許可權的話就不需要做這些事情了,但root過的機器都有裝有個許可權管理的程序。會彈出對話框。但這個程序管理能力有限,如果不想讓他彈出的話。也許可以通過改su文件名來解決。有興趣的同學不妨試試。
Ⅵ Android在xml為什麼使用不了ClearEditText 求指導
效果圖如上,接下來我們看代碼:
首先新建一個java文件繼承EditText,小編新建的是ClearEditText.java
packagecom.text.view;
importandroid.content.Context;
importandroid.graphics.drawable.Drawable;
importandroid.text.Editable;
importandroid.text.TextWatcher;
importandroid.util.AttributeSet;
importandroid.view.MotionEvent;
importandroid.view.View;
importandroid.view.View.OnFocusChangeListener;
importandroid.view.animation.Animation;
importandroid.view.animation.CycleInterpolator;
importandroid.view.animation.TranslateAnimation;
importandroid.widget.EditText;
OnFocusChangeListener,TextWatcher{
/**
*刪除按鈕的引用
*/
privateDrawablemClearDrawable;
/**
*控制項是否有焦點
*/
privatebooleanhasFoucs;
publicClearEditText(Contextcontext){
this(context,null);
}
publicClearEditText(Contextcontext,AttributeSetattrs){
//這里構造方法也很重要,不加這個很多屬性不能再XML裡面定義
this(context,attrs,android.R.attr.editTextStyle);
}
publicClearEditText(Contextcontext,AttributeSetattrs,intdefStyle){
super(context,attrs,defStyle);
init();
}
privatevoidinit(){
//獲取EditText的DrawableRight,假如沒有設置我們就使用默認的圖片
mClearDrawable=getCompoundDrawables()[2];
if(mClearDrawable==null){
//thrownewNullPointerException("");
mClearDrawable=getResources().getDrawable(R.drawable.delete_selector);
}
mClearDrawable.setBounds(0,0,mClearDrawable.getIntrinsicWidth(),mClearDrawable.getIntrinsicHeight());
//默認設置隱藏圖標
setClearIconVisible(false);
//設置焦點改變的監聽
setOnFocusChangeListener(this);
//設置輸入框裡面內容發生改變的監聽
addTextChangedListener(this);
}
/**
*因為我們不能直接給EditText設置點擊事件,所以我們用記住我們按下的位置來模擬點擊事件
*當我們按下的位置在EditText的寬度-圖標到控制項右邊的間距-圖標的寬度和
*EditText的寬度-圖標到控制項右邊的間距之間我們就算點擊了圖標,豎直方向就沒有考慮
*/
@Override
publicbooleanonTouchEvent(MotionEventevent){
if(event.getAction()==MotionEvent.ACTION_UP){
if(getCompoundDrawables()[2]!=null){
booleantouchable=event.getX()>(getWidth()-getTotalPaddingRight())
&&(event.getX()<((getWidth()-getPaddingRight())));
if(touchable){
this.setText("");
}
}
}
returnsuper.onTouchEvent(event);
}
/**
*當ClearEditText焦點發生變化的時候,判斷裡面字元串長度設置清除圖標的顯示與隱藏
*/
@Override
publicvoidonFocusChange(Viewv,booleanhasFocus){
this.hasFoucs=hasFocus;
if(hasFocus){
setClearIconVisible(getText().length()>0);
}else{
setClearIconVisible(false);
}
}
/**
*設置清除圖標的顯示與隱藏,調用setCompoundDrawables為EditText繪制上去
*@paramvisible
*/
(booleanvisible){
Drawableright=visible?mClearDrawable:null;
setCompoundDrawables(getCompoundDrawables()[0],
getCompoundDrawables()[1],right,getCompoundDrawables()[3]);
}
/**
*當輸入框裡面內容發生變化的時候回調的方法
*/
@Override
publicvoidonTextChanged(CharSequences,intstart,intcount,
intafter){
if(hasFoucs){
setClearIconVisible(s.length()>0);
}
}
@Override
publicvoidbeforeTextChanged(CharSequences,intstart,intcount,
intafter){
}
@Override
publicvoidafterTextChanged(Editables){
}
/**
*設置晃動動畫
*/
publicvoidsetShakeAnimation(){
this.setAnimation(shakeAnimation(5));
}
/**
*晃動動畫
*@paramcounts1秒鍾晃動多少下
*@return
*/
(intcounts){
AnimationtranslateAnimation=newTranslateAnimation(0,10,0,0);
translateAnimation.setInterpolator(newCycleInterpolator(counts));
translateAnimation.setDuration(1000);
returntranslateAnimation;
}
}
在XML文件中使用:詳細代碼
Ⅶ android中怎麼解析復雜的xml文件
本文主要講解Android開發中如何對XML文件的解析,由於XML文件具有與平台無關,廣泛應用於數據通信中,因此解析XML文件就顯得很有意義。Android對XML文件解析的方法主要有3種。 通常有三種方式:DOM、SAX和PULL,下面就分別針對這三種方式來進行討論。
文件內容如下所示:
那麼就是要對此XML文件做解析。下面我們就分別用DOM,SAX和PULL三種方式,分別對此XML文件做解析。
DOM方式
DOM方式解析xml是先把xml文檔都讀到內存中,然後再用DOM API來訪問樹形結構,並獲取數據。由DOM解析的方式可以知道,如果XML文件很大的時候,處理效率就會變得比較低,這也是DOM方式的一個缺點。
現在我們來解析上文中提到的有關天氣預報信息相關的xml文件。什麼是解析呢?說的通俗一點,就是將這個帶標簽的XML文件識別出來,並抽取一些相關的,對我們有用的信息來給我們使用。那在這個文件里,時間,天氣,溫度,以及圖標對我們來說是需要得到的。我們要對其做解析。
解析的具體思路是:
1. 將XML文件載入進來。
2. 獲取文檔的根節點
3. 獲取文檔根節點中所有子節點的列表
4. 獲取子節點列表中需要讀取的節點信息
根據這4個步驟,我們進行開發:
首先就是如何載入XML文件,假設此文件來源於網路。
SAX方式
SAX是Simple API for XML的縮寫。是一個包也可以看成是一些介面。
相比於DOM而言SAX是一種速度更快,更有效,佔用內存更少的解析XML文件的方法。它是逐行掃描,可以做到邊掃描邊解析,因此SAX可以在解析文檔的任意時刻停止解析。非常適用於Android等移動設備。
SAX是基於事件驅動的。所謂事件驅動就是說,它不用解析完整個文檔,在按內容順序解析文檔過程中,SAX會判斷當前讀到的字元是否符合XML文件語法中的某部分。如果符合某部分,則會觸發事件。所謂觸發事件,就是調用一些回調方法。當然android的事件機制是基於回調方法的,在用SAX解析xml文檔時候,在讀取到文檔開始和結束標簽時候就會回調一個事件,在讀取到其他節點與內容時候也會回調一個事件。在SAX介面中,事件源是org.xml.sax包中的XMLReader,它通過parser()方法來解析XML文檔,並產生事件。事件處理器是org.xml.sax包中ContentHander、DTDHander、ErrorHandler,以及EntityResolver這4個介面。
這四個介面的詳細說明如下:
事件處理器名稱
事件處理器處理的事件
XMLReader注冊方法
ContentHander
XML文檔的開始與結束,
XML文檔標簽的開始與結束,接收字元數據,跳過實體,接收元素內容中可忽略的空白等。
setContentHandler(ContentHandler h)
DTDHander
處理DTD解析時產生的相應事件
setDTDHandler(DTDHandler h)
ErrorHandler
處理XML文檔時產生的錯誤
setErrorHandler(ErrorHandler h)
EntityResolver
處理外部實體
setEntityResolver(EntityResolver e)
我們用來做內容解析的回調方法一般都定義在ContentHandler介面中。
ContentHandler介面常用的方法:
startDocument()
當遇到文檔的開頭的時候,調用這個方法,可以在其中做一些預處理的工作。
endDocument()
當文檔結束的時候,調用這個方法,可以在其中做一些善後的工作。
startElement(String namespaceURI, String localName,String qName, Attributes atts)
當讀到開始標簽的時候,會調用這個方法。namespaceURI就是命名空間,localName是不帶命名空間前綴的標簽名,qName是帶命名空間前綴的標簽名。通過atts可以得到所有的屬性名和相應的值。
endElement(String uri, String localName, String name)
在遇到結束標簽的時候,調用這個方法。
characters(char[] ch, int start, int length)
這個方法用來處理在XML文件中讀到的內容。例如:<high data="30"/>主要目的是獲取high標簽中的值。
第一個參數用於存放文件的內容,後面兩個參數是讀到的字元串在這個數組中的起始位置和長度,使用new String(ch,start,length)就可以獲取內容。
注意:
SAX的一個重要特點就是它的流式處理,當遇到一個標簽的時候,它並不會紀錄下之前所碰到的標簽,即在startElement()方法中,所有能夠知道的信息,就是標簽的名字和屬性,至於標簽的嵌套結構,上層標簽的名字,是否有子元屬等等其它與結構相關的信息,都是不知道的,都需要你的程序來完成。這使得SAX在編程處理上沒有DOM方便。
現在我們截取一段XML文件來做解析,其調用方法是這樣的:
<?xml version="1.0"?> ----------> startDocument()
<weather> ----------> startElement
<forecast_information> ----------> startElement
<city> ----------> startElement
beijing ----------> characters
</city> ----------> endElement
</forecast_information > ----------> endElement
</weather > ----------> endElement
文檔結束 ----------> endDocument()
SAX的解析步驟:
首先需要注意的是:
SAX還為其制定了一個Helper類:DefaultHandler它實現了ContentHandler這個介面,但是其所有的方法體都為空,在實現的時候,你只需要繼承這個類,然後重載相應的方法即可。
使用SAX解析XML文件一般有以下五個步驟:
1、創建一個SAXParserFactory對象;
2、調用SAXParserFactory中的newSAXParser方法創建一個SAXParser對象;
3、然後在調用SAXParser中的getXMLReader方法獲取一個XMLReader對象;
4、實例化一個DefaultHandler對象
5、連接事件源對象XMLReader到事件處理類DefaultHandler中
6、調用XMLReader的parse方法從輸入源中獲取到的xml數據
7、通過DefaultHandler返回我們需要的數據集合。
我們仍然來解析上述那個天氣預報的XML文件。
編寫代碼如下:
[java] view plain
mySAX.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
try{
String url = "http://www.google.com/ig/api?&weather=beijing";
DefaultHttpClient client = new DefaultHttpClient();
HttpUriRequest req = new HttpGet(url);
HttpResponse resp = client.execute(req);
HttpEntity ent = resp.getEntity();
InputStream stream = ent.getContent(); //將文件導入流,因此用InputStream
SAXParserFactory saxFactory = SAXParserFactory.newInstance(); //獲取一個對象
SAXParser saxParser = saxFactory.newSAXParser();//利用獲取到的對象創建一個解析器
XMLContentHandler handler = new XMLContentHandler();//設置defaultHandler
saxParser.parse(stream, handler);//進行解析
stream.close();//關閉流
/*XMLReader xmlReader = saxFactory.newSAXParser().getXMLReader(); //獲取一個XMLReader
xmlReader.setContentHandler(handler);
xmlReader.parse(new InputSource(stream));
stream.close();*/
}catch(Exception e){
e.printStackTrace();
}
}
});
}
public class XMLContentHandler extends DefaultHandler {
private static final String TAG = "XMLContentHandler";
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
Log.i(TAG, "解析內容:"+new String(ch,start,length));
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
Log.i(TAG, "文檔解析完畢。");
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
Log.i(TAG, localName+"解析完畢");
}
@Override
public void startDocument() throws SAXException {
Log.i(TAG, "開始解析... ...");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
Log.i(TAG, "解析元素:"+localName);
if(localName.equals("high")){
Log.i(TAG, "解析元素:"+localName);
i++;
if(i==2){
highestTmp.setText(String.valueOf((Integer.parseInt(attributes.getValue(0))-32)*5/9));
}
}
}
}
上面的那段注釋:
[java] view plain
/*XMLReader xmlReader =saxFactory.newSAXParser().getXMLReader(); //獲取一個XMLReader
xmlReader.setContentHandler(handler);
xmlReader.parse(newInputSource(stream));
stream.close();*/
是用XMLReader來做解析的另外一種方法。效果是一樣的。這里可以傳流,也可以傳一個字元串,如下所示:是傳字元串。
[java] view plain
xmlReader.parse(new InputSource(new StringReader(xmlStr)));
PULL方式
除了可以使用 SAX和DOM解析XML文件,也可以使用Android內置的Pull解析器解析XML文件。 Pull解析器的運行方式與 SAX 解析器相似。它也是事件觸發的。Pull解析方式讓應用程序完全控制文檔該怎麼樣被解析。比如開始和結束元素事件,使用parser.next()可以進入下一個元素並觸發相應事件。通過Parser.getEventType()方法來取得事件的代碼值,解析是在開始時就完成了大部分處理。事件將作為數值代碼被發送,因此可以使用一個switch對感興趣的事件進行處理。
Pull解析是一個遍歷文檔的過程,每次調用next(),nextTag(), nextToken()和nextText()都會向前推進文檔,並使Parser停留在某些事件上面,但是不能倒退。然後把文檔設置給Parser。
Android中對Pull方法提供了支持的API,主要是
org.xmlpull.v1.XmlPullParser;
org.xmlpull.v1.XmlPullParserFactory;
二個類,其中主要使用的是XmlPullParser,XmlPullParserFactory是一個工廠,用於構建XmlPullParser對象。
應用程序通過調用XmlPullParser.next()等方法來產生Event,然後再處理Event。
我們仍然拿上述天氣預報的XML文件的一部分來做例子。
例如:需要解析的XML文件是:
[java] view plain
<forecast_conditions>
<day_of_week data="周三"/>
<low data="22"/>
<high data="29"/>
<icon data="/ig/images/weather/chance_of_rain.gif"/>
<condition data="可能有雨"/>
</forecast_conditions>
這部分XML文件中day_of_week,low,high等是TAG,data是ATTRIBUTEA。當然,如果有<></>夾在開始和結束符號之間的部分,則為TXET。
要想解析文檔先要構建一個XmlPullParser對象。
[java] view plain
final XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
final XmlPullParser parser = factory.newPullParser();
parser.setInput(new StringReader("xmlStr");
這里的xmlStr就是上邊的XML文件。
此時,文檔剛被初始化,所以它應該位於文檔的開始,事件為START_DOCUMENT,可以通過XmlPullParser.getEventType()來獲取。然後調用next()會產生
START_TAG,這個事件告訴應用程序一個標簽已經開始了,調用getName()會返回" day_of_week ";若有TEXT,則再next()會產生TEXT事件,調用getText()會返回TEXT,由於此處沒有,所以再next(),會產生END_TAG,這個告訴你一個標簽已經處理完了,再next()直到最後處理完TAG,會產生END_DOCUMENT,它告訴你整個文檔已經處理完成了。除了next()外,nextToken()也可以使用,只不過它會返回更加詳細的事件,比如COMMENT, CDSECT, DOCDECL, ENTITY等等非常詳細的信息。如果程序得到比較底層的信息,可以用nextToken()來驅動並處理詳細的事件。需要注意一點的是TEXT事件是有可能返回空白的White Spaces比如換行符或空格等。
nextTag()--會忽略White Spaces,如果可以確定下一個是START_TAG或END_TAG,就可以調用nextTag()直接跳過去。通常它有二個用處:當START_TAG時,如果能確定這個TAG含有子TAG,那麼就可以調用nextTag()產生子標簽的START_TAG事件;當END_TAG時,如果確定不是文檔結尾,就可以調用nextTag()產生下一個標簽的START_TAG。在這二種情況下如果用next()會有TEXT事件,但返回的是換行符或空白符。
nextText()--只能在START_TAG時調用。當下一個元素是TEXT時,TEXT的內容會返回;當下一個元素是END_TAG時,也就是說這個標簽的內容為空,那麼空字串返回;這個方法返回後,Parser會停在END_TAG上。
小結一下,如果在一個XML文檔中我們只需要前面一部分數據,但是使用SAX方式或DOM方式會對整個文檔進行解析,盡管XML文檔中後面的大部分數據我們其實都不需要解析,因此這樣實際上就浪費了處理資源。使用PULL方式正合適。
當點擊三種方式的任何一個按鈕時,均能夠得到相同的結果
Ⅷ Android是如何使用AndroidManifest.xml的
一、關於AndroidManifest.xml
AndroidManifest.xml 是每個android程序中必須的文件。它位於整個項目的根目錄,描述了package中暴露的組件(activities, services, 等等),他們各自的實現類,各種能被處理的數據和啟動位置。 除了能聲明程序中的Activities, ContentProviders, Services, 和Intent Receivers,還能指定permissions和instrumentation(安全控制和測試)
二、AndroidManifest.xml結構
<?xmlversion="1.0"encoding="utf-8"?>
<manifest>
<application>
<activity>
<intent-filter>
<action/>
<category/>
</intent-filter>
</activity>
<activity-alias>
<intent-filter></intent-filter>
<meta-data/>
</activity-alias>
<service>
<intent-filter></intent-filter>
<meta-data/>
</service>
<receiver>
<intent-filter></intent-filter>
<meta-data/>
</receiver>
<provider>
<grant-uri-permission/>
<meta-data/>
</provider>
<uses-library/>
</application>
<uses-permission/>
<permission/>
<permission-tree/>
<permission-group/>
<instrumentation/>
<uses-sdk/>
<uses-configuration/>
<uses-feature/>
<supports-screens/>
</manifest>
三、各個節點的詳細介紹
上面就是整個am(androidManifest).xml的結構,下面以外向內開始闡述~~
1、第一層(<Manifest>):(屬性)
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.woody.test"
android:sharedUserId="string"
android:sharedUserLabel="string resource"
android:versionCode="integer"
android:versionName="string"
android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
</manifest>
A、xmlns:android
定義android命名空間,一般為http://schemas.android.com/apk/res/android,這樣使得Android中各種標准屬性能在文件中使用,提供了大部分元素中的數據。
B、package
指定本應用內java主程序包的包名,它也是一個應用進程的默認名稱
C、sharedUserId
表明數據許可權,因為默認情況下,Android給每個APK分配一個唯一的UserID,所以是默認禁止不同APK訪問共享數據的。若要共享數據,第一可以採用Share Preference方法,第二種就可以採用sharedUserId了,將不同APK的sharedUserId都設為一樣,則這些APK之間就可以互相共享數據了。詳見:http://wallage.blog.163.com/blog/static/17389624201011010539408/
D、sharedUserLabel
一個共享的用戶名,它只有在設置了sharedUserId屬性的前提下才會有意義
E、versionCode
是給設備程序識別版本(升級)用的必須是一個interger值代表app更新過多少次,比如第一版一般為1,之後若要更新版本就設置為2,3等等。。。
F、versionName
這個名稱是給用戶看的,你可以將你的APP版本號設置為1.1版,後續更新版本設置為1.2、2.0版本等等。。。
G、installLocation
安裝參數,是Android2.2中的一個新特性,installLocation有三個值可以選擇:internalOnly、auto、preferExternal
選擇preferExternal,系統會優先考慮將APK安裝到SD卡上(當然最終用戶可以選擇為內部ROM存儲上,如果SD存儲已滿,也會安裝到內部存儲上)
選擇auto,系統將會根據存儲空間自己去適應
選擇internalOnly是指必須安裝到內部才能運行
(註:需要進行後台類監控的APP最好安裝在內部,而一些較大的游戲APP最好安裝在SD卡上。現默認為安裝在內部,如果把APP安裝在SD卡上,首先得設置你的level為8,並且要配置android:installLocation這個參數的屬性為preferExternal)
2、第二層(<Application>):屬性
一個AndroidManifest.xml中必須含有一個Application標簽,這個標簽聲明了每一個應用程序的組件及其屬性(如icon,label,permission等)
<application android:allowClearUserData=["true" | "false"]
android:allowTaskReparenting=["true" | "false"]
android:backupAgent="string"
android:debuggable=["true" | "false"]
android:description="string resource"
android:enabled=["true" | "false"]
android:hasCode=["true" | "false"]
android:icon="drawable resource"
android:killAfterRestore=["true" | "false"]
android:label="string resource"
android:manageSpaceActivity="string"
android:name="string"
android:permission="string"
android:persistent=["true" | "false"]
android:process="string"
android:restoreAnyVersion=["true" | "false"]
android:taskAffinity="string"
android:theme="resource or theme" >
</application>
A、android:allowClearUserData('true' or 'false')
用戶是否能選擇自行清除數據,默認為true,程序管理器包含一個選擇允許用戶清除數據。當為true時,用戶可自己清理用戶數據,反之亦然
B、android:allowTaskReparenting('true' or 'false')
是否允許activity更換從屬的任務,比如從簡訊息任務切換到瀏覽器任務
C、android:backupAgent
這也是Android2.2中的一個新特性,設置該APP的備份,屬性值應該是一個完整的類名,如com.project.TestCase,此屬性並沒有默認值,並且類名必須得指定(就是個備份工具,將數據備份到雲端的操作)
D、android:debuggable
這個從字面上就可以看出是什麼作用的,當設置為true時,表明該APP在手機上可以被調試。默認為false,在false的情況下調試該APP,就會報以下錯誤:
Device XXX requires that applications explicitely declare themselves as debuggable in their manifest.
Application XXX does not have the attribute 'debuggable' set to TRUE in its manifest and cannot be debugged.
E、android:description/android:label
此兩個屬性都是為許可提供的,均為字元串資源,當用戶去看許可列表(android:label)或者某個許可的詳細信息(android:description)時,這些字元串資源就可以顯示給用戶。label應當盡量簡短,之需要告知用戶該許可是在保護什麼功能就行。而description可以用於具體描述獲取該許可的程序可以做哪些事情,實際上讓用戶可以知道如果他們同意程序獲取該許可權的話,該程序可以做什麼。我們通常用兩句話來描述許可,第一句描述該許可,第二句警告用戶如果批准該許可權會可能有什麼不好的事情發生
F、android:enabled
Android系統是否能夠實例化該應用程序的組件,如果為true,每個組件的enabled屬性決定那個組件是否可以被 enabled。如果為false,它覆蓋組件指定的值;所有組件都是disabled。
G、android:hasCode('true' or 'false')
表示此APP是否包含任何的代碼,默認為true,若為false,則系統在運行組件時,不會去嘗試載入任何的APP代碼
一個應用程序自身不會含有任何的代碼,除非內置組件類,比如Activity類,此類使用了AliasActivity類,當然這是個罕見的現象
(在Android2.3可以用標准C來開發應用程序,可在androidManifest.xml中將此屬性設置為false,因為這個APP本身已經不含有任何的JAVA代碼了)
H、android:icon
這個很簡單,就是聲明整個APP的圖標,圖片一般都放在drawable文件夾下
I、android:killAfterRestore
J、android:manageSpaceActivity
K、android:name
為應用程序所實現的Application子類的全名。當應用程序進程開始時,該類在所有應用程序組件之前被實例化。
若該類(比方androidMain類)是在聲明的package下,則可以直接聲明android:name="androidMain",但此類是在package下面的子包的話,就必須聲明為全路徑或android:name="package名稱.子包名成.androidMain"
L、android:permission
設置許可名,這個屬性若在<application>上定義的話,是一個給應用程序的所有組件設置許可的便捷方式,當然它是被各組件設置的許可名所覆蓋的
M、android:presistent
該應用程序是否應該在任何時候都保持運行狀態,默認為false。因為應用程序通常不應該設置本標識,持續模式僅僅應該設置給某些系統應用程序才是有意義的。
N、android:process
應用程序運行的進程名,它的默認值為<manifest>元素里設置的包名,當然每個組件都可以通過設置該屬性來覆蓋默認值。如果你想兩個應用程序共用一個進程的話,你可以設置他們的android:process相同,但前提條件是他們共享一個用戶ID及被賦予了相同證書的時候
O、android:restoreAnyVersion
同樣也是android2.2的一個新特性,用來表明應用是否准備嘗試恢復所有的備份,甚至該備份是比當前設備上更要新的版本,默認是false
P、android:taskAffinity
擁有相同的affinity的Activity理論上屬於相同的Task,應用程序默認的affinity的名字是<manifest>元素中設定的package名
Q、android:theme
是一個資源的風格,它定義了一個默認的主題風格給所有的activity,當然也可以在自己的theme裡面去設置它,有點類似style。
不過現在在android stuido 上面 版本控制已經使用Gradle了。
Ⅸ android中manifest.xml這個文件在哪
AndroidManifest.xml是每個android程序中必須的文件。它位於整個項目的根目錄,描述了package中暴露的組件(activities,services,等等),他們各自的實現類,各種能被處理的數據和啟動位置。除了能聲明程序中的Activities,ContentProviders,Services,和IntentReceivers,還能指定permissions和instrumentation(安全控制和測試)。AndroidManifest能夠包含的標簽:1.。2.。3.。4.。5.。6.。Service的正確注冊方式:啟動service應該要調用startService而不是startActivity。