第一篇:有用的安卓總結
一、文字的滾動顯示:
android:layout_height=“wrap_content” android:ellipsize=“marquee” android:focusable=“true” android:focusableInTouchMode=“true” android:marqueeRepeatLimit=“marquee_forever” android:singleLine=“true” android:textColor=“#ff0000” android:text=“教育局虧合同預計給他6語含有距被告人他還預計個體業戶 愚友好條約” /> 二、用意圖撥打電話 1:Intent intent = new Intent(“android.activity.intent.action”,Uri.parse(“tel:” + 數字.toString))); 2:添加權限 三、ListView 第一步: 定義BaseAdapter類,實現getCount()和getView方法,定義構造函數 private LayoutInflater inflater; public SecAdapter(Context context){ inflater = LayoutInflater.from(context);} 如: @Override public int getCount(){ // TODO Auto-generated method stub return 10;} @Override public View getView(int arg0, View arg1, ViewGroup arg2) { arg1 = inflater.inflate(R.layout.adapter_sec, null); return arg1;} 其中R.layout.adapter_sec是每一個Item的布局樣式 第二步: Activity中引用ListView布局,作為總體布局。定義并調用方法: private void initData(){ secAdapter = new SecAdapter(this); } private void initView(){ listView =(ListView)findViewById(R.id.listView1); listView.setAdapter(secAdapter); } ……………………………………………………….四、簡單傳值 Intent.putExtra(“key”,value); 獲取: XXX s = Intent.getXXXExtra(“key”); 五:Activity之間切換的動畫效果 Intent intent = new Intent(MainActivity.this, Second.class); startActivity(intent); /* Activity的切換效果,也可以使用Android.R.anim.系統文件名 */ overridePendingTransition(R.anim.entert, R.anim.exit); [教程] 系統精簡總結(集大成者,呵呵) 集大成者, 系統, 精簡 本帖最后由 colinma 于 2010-10-26 10:35 編輯 緊接我之前那篇(關于刷不刷機和刷機包的選擇),刷機后系統精簡的問題。首先,我本著這樣一個原則,該精簡的,我們用最殘忍的方式將他閹割;有用并且好用的一些系統自帶程序,能不刪掉的盡量留著,這個我會給大家一個參考(說明:刪除的時候有對應后綴為.odex的同名文件一并刪除) 1.首先,我們要對一些東西毫不猶豫的下黑手。總結了一下論壇各位大俠的帖子,加上我自己切身的體驗,這些需要嚴格取締的程序如下(system/app/下的): ChinaUnicomCustomize.apk聯通的定制程序包(罪魁禍首) HWAppMarket.apk智慧云(干脆咱們的安卓市場也改名叫安卓云吧,比這好用數十倍) HWTheme_Entertainment.apk 手機主題 娛樂 HWTheme_Social.apk手機主題 社交 HWTheme_Work.apk手機主題 工作 (以上三個臭皮匠連0.1個諸葛亮都頂不上) 91pandareade.apk91電子圖書 BaiduTiebar.apk百度貼吧 DocumentToGo.apkDataviz的office文件包,未注冊 Kingsoft_U8110.apk金山詞霸 LuckyMedia_U8110.apk手機樂媒 Readme.apk使用技巧 Renren_Android.apk人人網 SinaWeibo_U8110.apk新浪微博 SinaWidget_U8110.apk新浪新聞 SNSAccount.apk開心網 SNSService.apk開心網服務 SogouInput_U8110.apk搜狗輸入法 Tonghuashun_U8110.apk同花順 UCWEB_U8110.apkUC瀏覽器 UpdataOnline.apk在線升級 VisualizationWallpapers.apk音樂動態背景壁紙 YouTube.apkYouTube在線視頻 (以上都可以在官網或者論壇里找到最新版的下載安裝,當然其中一些根本沒必要再裝,看個人興趣) 2.下來是一些可刪可不刪的程序,但建議刪除,AccountAndSyncSettings.apk google同步(反正我沒打算和他同步,怕一不留神又給大家帶來“xx門”) Browser.apk瀏覽器(UC肯定比這好用) Email.apk郵件(尚郵比自帶的好用) Music.apk音樂播放器(天天動聽等替代) SoundRecorder.apk錄音軟件(論壇里比這好的錄音軟件很多,功能更強)Camera.apk照相機(Camera360比這效果好,但好像不能錄像,要用其他軟件) Maps.apk電子地圖(用大俠brut的修改版,支持離線地圖的)Vending.apk電子市場 MarketUpdater.apk市場更新 gtalkservice.apk跟下面的有一腿 Talk.apkgtalk TalkProvider.apk跟上面的有一腿,也好像跟電子市場有婚外戀 GoogleXXXXXXX.apk基于google的一些服務 說實話,google是個讓人又愛又狠的東西。首先,如果對google的任何服務都沒興趣,那建議全部刪除以google開頭的程序,還有電子市場和地圖;其次,如果對任何google的單項服務感興趣,那么有兩個程序必須留下:GoogleApps.apk和GoogleCheckin.apk,這都通過我一一驗證的。(對電子市場情有獨鐘,除了留下上面的兩個以及Vending.apk和MarketUpdater.apk外,還要留下 gtalkservices.apk和TalkProvider.apk) 3.還是一些可刪可不刪的,但建議保留 Calculator.apk計算器 *Calendar.apk日歷 *CalendarProvider.apk日歷支持 *EmotionClockWidget.apk心情時鐘 FMradio.apk收音機 *Gallery.apk圖片瀏覽器 LocalCityWeatherClock.apk我的天氣時鐘 MyBookmarks.apk我的書簽 *MyCalendar.ap我的日歷 MyEvent.apk我的日程 *MyMemo.apk我的便簽 MyVideo.apk我的視頻 *NotePad.apk記事本 *PhotoAblumWidget.apk我的相冊 WeatherClock.apk天氣時鐘 以上程序,論壇好多網友建議刪除用第三方軟件取代,但我這段時間試下來,感覺系統自帶的這些程序對小u來說那就是郎才配女貌,鮮花配牛糞——很實用兼容也很好的,其他第三方的反倒沒這些好好用,尤其是帶星號的那幾個,論壇里我真沒找到有比原配的同類軟件更好用,更實用的。還有一些目前好像沒啥用,但以后可能會用上,比如語音支持的那個。 4.至于其他未提到的程序,無罪釋放,各位切記要對他們手下留情。當然如果你殘忍的無可救藥你也可以牛刀小試,但記著告訴一下大家感受哦。 注:1..港版的參考以上,有的就刪掉,除此之外港版還有一些特有程序也可以就地正法,包括所有的輸入法,citylink開頭的,road開頭的,還有與 google街景相關的(街景,語音搜索什么的),這個大家都可以點一下安裝然后看一下具體是什么,因為名稱我也忘記了。 2..港版里的launcher2是android的原生桌面,個人覺得并不好用,運行程序多了會卡,再者主菜單里程序字體顯示不是很好,不如華為的桌面,所以建議大家不要嘗試了,直接刪掉算了。 以上可能有不全的地方,僅供各位機友參考,希望熱心的機友能補充和完善 Android學習心得 -----093380117 計算機應用(1) 張峰 1.關于Activity 1.在一個Activity中使用多個View 如果把Activity看作MVC中的Control?它負責管理UI和接受事件(包括用戶的輸入),雖然說一個Activity通常對應一個屏幕,但事實上,我們是可以只用一個Activity管理多個不同的View來實現簡單的邏輯。首先,我們增加一個新的資源描述layout/second.xml。 除了一個“Hello中國”以外,增加一個按鈕可以返回前一個界面。然后,在代碼中我們要為helloTwo增加兩個方法,setViewOneCommand和setViewTwoCommand,分別處理一下在不同界面時,從資源里加載組件并為組件綁定一個事件處理器最后,我們需要在onCreate的時候,也就是啟動后的main界面上設置一下按鈕事件處理器。2.還是回到正道上,多個Activity之間的跳轉 Android中提供一個叫Intent的類來實現屏幕之間的跳轉,按文檔的說法,似乎他們也建議采用這種方法,Intent的用法比較復雜,現在我先看看它最簡單的用法。 這里的跳轉功能用Intent來操作,它的最簡單用法就是用函數setClass()設置跳轉前后兩個Activity類的實例,然后調用Activity自己的startActivity(intent)即可。最后一句finish()表示將當前Activity關掉(如果不關掉會如何?你可以自己試一下看效果,事實上有時我們是不需要關掉當前Activity的)。 然后,我們同樣弄一個Activity類HelloThreeB,代碼與前面的差不多,只是將setClass的兩個參數反一下,這樣就可以簡單地實現在兩個Activity界面中來回切換的功能了。 2.關于 Intent的使用 Intent分為兩大類,顯性的(Explicit)和隱性的(Implicit)。一般來說,intent要定位事件的目的地,無外乎需要以下幾個信息: 1.種類(category),比如我們常見的 LAUNCHER_CATEGORY 就是表示這是一類應用程序。 2.類型(type),在前面的例子中沒用過,表示數據的類型,這是隱性Intent定位目標的重要依據。 3.組件(component),前面的例子中用的是setClass,不過也可以用setComponent來設置intent跳轉的前后兩個類實例。4.附加數據(extras),在ContentURI之外還可以附加一些信息,它是Bundle類型的對象。 其實,如果是在一個應用內部,這種隱性的intent實在有點別扭,個人覺得,這種松藕合的實現方法,只適用于那些較大的系統或者多個不同的應用之間的調用,可手機上又有什么“較大”的系統呢?無非是可以與不同來源的多個應用之間方便地互操作而已,那么會是什么樣的場景呢?比如,給QQ好友發送gmail郵件,用GoogleMap查找QQ好友所在的位置?看上去挺不錯的。 關于這個ContentProvider,其實還有話說,它主要是的那些看似數據庫操作的方法我們都沒真正去實現呢。不過今天就到這里了,等下回再去研究吧。 3.關于ListActivity 準備一個List對象并借助Adapter就可以構造出一個列表。重載onListItemClick方法可以響應選擇事件,利用第一個參數可以訪問到這個ListView實例以得到選中的條目信息。這里有一點要說明的,就是如果更簡單的話,其實連那個setContentView都可以不要了,Android也會自動幫我們構造出一個全屏的列表。但是本例中我們需要一個TextView來顯示選中的條目,所以我們需要一個layout.mainb描述一下這個列表窗口。 這里需要注意的是那個ListView的ID,是系統自定義的android:list,不是我們隨便取的,否則系統會說找不到它想要的listview了。然后,在這個listview之外,我們又增加了一個TextView,用來顯示選中的條目。 再來說說這里用到的ArrayAdapter,它的構造函數中第二個參數是一個資源ID,ArrayAdapter的API文檔中說是要求用一個包含TextView的layout文件,平臺用它來顯示每個選擇條目的樣式,這里的取值是R.layout.list_row,所以,我們還有一個list_row.xml文件來描述這個布局,相當簡單。 從ArrayAdapter上溯到BaseAdapter,發現還有幾個同源的Adapter也應該可以使用,象SimpleAdapter和CursorAdapter,還是做個例子來實驗一下吧。 然后,在HelloTwoB中的onCreate函數中,修改代碼,有幾個不同:items的元素是HashMap實例,這是一點變化,然后構造函數除了要求items以外,還要求提供一個string[]來說明用hash表中的哪個字段顯示在列表中,而后是一個資源ID的數組。 因為單純的CursorAdapter是抽象類,所以我用的是它的子類SimpleCursorAdapter,很好理解,先用ContentResolver查詢通訊簿得到一個游標,然后告訴SimpleCursorAdapter要用其中的People.NAME作為顯示項來構造出一個adapter即可。4.關于Dialog 注意到android.app包下除了Dialog(可用于制作復雜的對話框)以外,還包括了幾個系統定義好的對話框類,如DatePickerDialog、TimePickerDialog及AlertDialog。 其中AlertDialog我上回用過一次,基本上就那樣子了,今天看看另外兩個對話框的使用吧。 很簡單的,無非是需要一個OnDateSetListener接口的實現而已,在它里面的dateSet方法中就可以得到選擇的日期了。而TimePickerDialog與DatePickerDialog使用如出一轍。 看看另一個ProgressDialog的用法吧,這個類與AlertDialog一樣包含了多個static的方法,所以使用起來是非常方便的。比如說,如果我們需要用它來表示一個長時間的操作。 5.關于Service和Notification 大略地看了一下android.app下的Service類,覺得它與Activity非常相似,只是要注意幾個地方: 1.生命周期,Service的從onCreate()->onStart(int,Bundle)->onDestroy()顯得更為簡單。但是它的onStart是帶參數的,第一個ID可用來標識這個service,第二個參數顯示是用來傳遞數據的了。比較Activity,傳遞數據的Bundle是在onCreate就帶進入的。 2.Service的啟動由Context.startService開始,其實Activity或者Service都是Context的派生類。結束于Context.stopService()或者它自己的stopSelf()。 3.Service還有一個與Activity不一樣的是它可以由另一個Context去綁定一個已存在的Service。就是這個方法Context.bindService(),被綁定的Service要求是已經onCreate了但可以沒有onStart。在Service類中有個抽象方法getBinder()可以得到這個IBinder對象。關于這方面的細節,以后再看,這里只做個記錄罷。 4.與Service有關的還有一個安全的問題,可以在AndroidManifest.xml中用 6.GridView與ImageView 簡單一點吧,就瞧瞧那個Grid的效果,Android提供了一個GridView,不過從APIDemo中看來,它似乎與PC上的GRID差別還是挺大的,更像那個IconView的感覺。不知道Android中如何實現表格界面?雖然在移動終端上,表格一般不會有誰使用,大家似乎更傾向于使用ListView,而Android對于ListView則有更簡單的實現ListActivity。 很簡單,只要重載幾個方法就可以了,關鍵是那個getView方法,它負責構建出每個單元格中的對象實例。這里我們構造的是一個ImageView實例。 然后就是同樣的將這個Adapter賦給GridView即可,大家可以看看效果,注意在做這個例子前,先放幾個小圖片到res/drawable目錄下,buildproject一下就可以得到那個R.drawable.a了(這里的a是圖像文件名,如a.png)。 在getView方法中我們使用了ImageView類,這又是一個widget。除了上面用到的幾個方法以外,還有以下幾個方法值得注意: 與圖像來源有關的方法,我們只用了資源文件的方式。 還是習慣性跑題了,其實,我是想通過我對這個類的無數次Debugger跟進,說說它的多線程異步處理的解決策略的。他的基本策略如下: 1.當你實例化一個AsyncQueryHandler類時(包括其子類...),它會單件構造一個線程(后面會詳述...),這個線程里面會構建一個消息循環。 2.獲得該消息循環的指針,用它做參數實例化另一個Handler類,該類為內部類。至此,就有了兩個線程,各自有一個Handler來處理消息。3.當調用onXXX的時候,在XXX函數內部會將請求封裝成一個內部的參數類,將其作為消息的參數,將此消息發送至另一個線程。4.在該線程的Handler中,接受該消息,并分析傳入的參數,用初始化時傳入的ContentResolver進行XXX操作,并返回Cursor或其他返回值。 5.構造一個消息,將上述返回值以及其他相關內容綁定在該消息上,發送回主線程。 6.主線程默認的AsyncQueryHandler類的handleMessage方法(可自定義,但由于都是內部類,基本沒有意義...)會分析該消息,并轉發給對應的onXXXComplete方法。 7.用戶重寫的onXXXComplete方法開始工作。 這就是它偷偷摸摸做過的事情,基本還是很好理解的。我唯一好奇的是它的線程管理方式,我猜測他是用的單件模式。第一個AsyncQueryHandler的實例化會導致創建一個線程,從此該線程成為不死老處男,所有的ContentResolver相關的工作,都由該線程統一完成。個人覺得這種解決方式很贊。本來這個線程的生命周期就很難估量,并且,當你有一個ContentProvider的請求的時候,判斷你會做更多的類似操作并不過分。就算錯了,花費的也只是一個不死的線程(與進程同生死共存亡...),換來的卻是簡單的生命周期管理和無數次線程生死開銷的節約。同時另外一個很重要的問題,他并會涉及到單件中數據同步的問題,每個類都有各自的Handler類,彼此互不干擾,分發可以分別進行。當多個數據請求的時候,在同一個ContentResolver上進行的可能微乎其微,這就避免了堵塞。總而言之,這套解決辦法和Android的整體設計算是天作之合了。 所以建議,如果你有什么非ContentProvider操作,卻需要異步多線程執行的話,模擬一套,是個不錯的策略,當然,具體情況具體分析,生搬硬套是學不好馬列主義的。 7.顯示控件使用 Android的界面顯示同樣也是基于控件的。通常是用View(包括ViewGroup)控件配上XML的樣式來做的。具體細節不想說了,可以參考 Samples里的ApiDemos/View,和View的Doc,以及Implementing a UI這篇Doc。其他還有很多,感覺算是SDK講述的最多的內容。 從控件的使用上,和網頁的設計類似,盡量用parent_width之類的抽象長度,用Theme來做風格,抽取所有的字串等信息做本地化設計。相關內容參看Implementing a UI就好。 一類比較重要的是數據綁定控件。如果做過ASP.Net會從中看到很多類似的地方。一個支持數據綁定的控件,比如ListView。可以通過一個 ListAdapter綁定到一個數據源上。ListAdapter是一個抽象類,主要的實現類包括SimpleAdapter和 SimpleCursorAdapter。前者是綁定一個靜態的Array,后者是綁定一個動態的Cursor。Cursor前面說過,是一個指向數據源的隨機迭代器,將View綁定到Cursor通常要設置這樣幾個參數。一個是每一行的樣式,稱作Row Layout,其實就是一個普通的Layout的XML文件。還有就是一個列和現實控件的對應關系。那個控件顯示哪個列的值,這是需要配置的。為了定制一個良好的數據顯示控件,最簡單你可以定制很PP的Row Layout,復雜一點就是可以重載綁定控件View,或者是適配器ListAdapter。如果是一個數據顯示密集的應用,且你對UI有些追求,這個工作估計是必不可少的。 一個主要用于顯示數據內容的Activity,可以選擇派生自ListActivity。它提供了一個具有ListView 的Layout,還有simple_list_item_1, simple_list_item_2, two_line_list_item等默認的Row Layout,還有一些比較不錯的API,和可供響應選擇Item的事件。可以滿足你比較基礎的需求。如果你覺得只有一個ListView的界面太突兀,你可以為這個ListActivity指定一個Layout,需要注意的是,你需要提供一個id為@android:id/list的ListView控件,避免Activity在內部偷偷尋找該控件的時候失敗。 除了這些要求,做好UI還有注意易用性和效率。快捷鍵是一個比較不錯的選擇,在 Activity中調用setDefaultkeyMode(SHORTCUT_DEFAULT_KEYS),可以開啟快捷鍵模式,然后你可以將菜單綁定到指定快捷鍵上就OK了。個人覺得Tip也是一個比較重要的東西,但目前觀察看來,這個東西只能夠自己提供了。界面的動態性有時候是不可避免的,比如說菜單就是一個需要經常根據光標位置提供不同的選項。這個東西Android很人道的考慮到了,你可以參看NodeList這個Sample。它采取的應該是一個靜態模擬動態的方式,這樣有助于提高速度。你也可以利用ViewInflate,動態從一個XML創建一個控件。成本據Doc說很大,不到萬不得已不要使用。 8.Intent消息傳遞 在前面寫Android的ContentProvider時候,可以看到那是基于觀察者模式的一個消息傳遞方法。每一個Cursor、ContentResolver做為一個小的注冊中心,相關觀察者可以在這個中心注冊,更新消息由注冊中心分發給各個觀察者。而在MFC或Winform中,都會形成一個消息網,讓消息在網中流動,被各節點使用、吃掉或者在出口死掉。 相比之下,我個人覺得基于Intent的Android核心消息傳遞機制是有所不同的。它應該會有一個全局性的注冊中心,這個注冊中心是隱性的,整個Android系統中就那么一個。所有的消息接收者,都被隱形的注冊到這個中心。包括Activity,Service和IntentReceiver。其實說隱形注冊是不確切的,所有注冊都還是我們手動告訴注冊中心的,只是與傳統的方式不一樣,我們通常不是通過代碼,而是通過配置文件來做。在應用的Manifest中,我們會為一些Activity或Service添加上Intent-filter,或在配置文件中添加 當程序有一個消息希望發出去的時候,它需要將消息封裝成一個Intent,并發送。這時候,應該是有一個統一的中心(恩,有可能Android底層實現的時候不是,但簡單這樣看是沒問題的...)接受到這個消息,并對它進行解析、判定消息類型(這個步驟降低了耦合...),然后檢查注冊了相匹配的filter或receiver,并創建或喚醒接收者,將消息分發給它。這樣做有很多好處。雖然這種傳遞有的時候不如點對點的傳遞快(這有些需要速度的地方,我們看到Android會通過直接通信來做),但有時候又因為它只經過一跳(姑且這么叫吧...),比復雜的流動又要更快。更重要的是,它耦合性低,在手機平臺這種程序組件多變的條件下使用十分適合。并且它可以很容易實現消息的精確或模糊匹配,彈性很大。(我個人曾想在開發一個C++二次平臺的時候引入這樣的機制,但在C++中,建立一套完整的數據marshal機制不容易,相比之下,用java來做會簡單很多...) 恩,廢話說了很多,具體講講Android中Intent的使用。當你有一個消息需要傳遞,如果你明確知道你需要哪個Activity或者其他Class來響應的話,你可以指定這個類來接受該消息,這被稱為顯性發送。你需要將Intent的class屬性設置成目標。這種情況很常見,比如startActivity的時候,會清楚當前Activity完了應該是哪個Activity,那就明確的發送這個消息。 但是,有的時候你并不確定你的消息是需要具體哪個類來執行,而只是知道接收者該符合哪些條件。比如你只需要有一個接收者能顯示用戶所選的數據,而不想制定某個具體的方法,這時候你就需要用到隱形發送(傳統上,我們可能會考慮用多態,但顯然這種方式更為靈活...)。在Android中,你可以為Intent指定一個action,表示你這個指令需要處理的事情。系統為我們定義了很多Action類型,這些類型使系統與我們通信的語言(比如在Activity里面加一個Main的filter,該activity就會做成該應用的入口點),當然你也可以用于你自己的應用之間的通信(同樣當然,也可以自定義...)。強烈建議,在自己程序接收或發出一個系統action的時候,要名副其實。比如你響應一個view動作,做的確實edit的勾當,你發送一個pick消息,其實你想讓別人做edit的事,這樣都會造成混亂。當然只有Action有時候是不夠的,在Android中我們還可以指定catalog信息和type/data信息,比如所有的顯示數據的Activity,可能都會響應View action。但很多與我們需要顯示的數據類型不一樣,可以加一個type信息,明確的指出我們需要顯示的數據類型,甚至還可以加上一個catalog信息,指明只有你只有按的是“中鍵”并發出這樣的消息才響應。從上面可以看出,Android的Intent可以添加上class, action, data/type, catalog等消息,注冊中心會根據這些信息幫你找到符合的接收者。其中class是點對點的指示,一旦指明,其他信息都被忽略。Intent中還可以添加key/value的數據,發送方和接收方需要保持統一的key信息和value類型信息,這種數據的marshal在java里做,是不費什么力氣的。 Android的Intent發送,可以分成單播和廣播兩種。廣播的接收者是所有注冊了的符合條件的IntentReceiver。在單播的情況下,即使有很多符合條件的接收者,也只要有一個出來處理這個消息就好(恩,個人看法,沒找到確切條款或抉擇的算法,本來想實驗一下,沒來得及...),這樣的情況很容易理解,當你需要修改某個數據的時候,你肯定不會希望有十個編輯器輪流讓你來處理。當廣播不是這樣,一個receiver沒有辦法阻止其他receiver進行對廣播事件的處理。這種情況也很容易理解,比如時鐘改變了,鬧鐘、備忘錄等很多程序都需要分別進行處理。在自己的程序的使用中,應該分清楚區別,合理的使用。 9.ContentProvider數據模型 數據庫操作 從我目前掌握的知識來看,SQLite比較輕量(沒有存儲過程之類的繁雜手段),用起來也比較簡單。實例化一個SQLiteDatabase類對象,通過它的APIs可以搞定大部分的操作。從sample中看,Android中對db的使用有一種比較簡單的模式,即派生一個 ContentProviderDatabaseHelper類來進行SQLiteDatabase對象實例的獲取工作。基本上,ContentProviderDatabaseHelper類扮演了一個singleton的角色,提供單一的實例化入口點,并屏蔽了數據庫創建、打開升級等細節。在ContentProvider中只需要調用ContentProviderDatabaseHelper的openDatabase方法獲取SQLiteDatabase的實例就好,而不需要進行數據庫狀態的判斷。URI 像進行數據庫操作需要用SQL一樣,對ContentProivder進行增刪改查等操作都是通過一種特定模式的URI來進行的(ig:content: //provider/item/id),URI的能力與URL類似,具體細節可以查看SDK。建立自己的ContentProvider,只需要派生 ContentProivder類并實現insert, delete, update等抽象函數即可。在這些接口中比較特殊的是getType(uri)。根據傳入的uri,該方法按照MIME格式返回一個字符串(==!沒聽過的詭異格式...)唯一標識該uri的類型。所謂uri的類型,就是描述這個uri所進行的操作的種類,比如content://xx/a與 content://xx/a/1不是一個類型(前者是多值操作,后者是單值),但content://xx/a/1和content://xx/a/2 就會是一個類型(只是id號不同而已)。 在ContentProvider通常都會實例化一個ContentURIPraser來輔助解析和操作傳入的URI。你需要事先(在static域內)為該ContentURIPraser建立一個uri的語法樹,之后就可以簡單調用 ContentURIPraser類的相關方法進行uri類型判斷(match方法),獲取加載在uri中的參數等操作。但我看來,這只是在使用上簡化了相關操作(不然就需要自己做人肉解析了...),但并沒有改變類型判定的模式。你依然需要用switch...case...對uri的類型進行判斷,并進行相關后續的操作。從模式來看,這樣無疑是具有強烈的壞味道,類似的switch...case...代碼要出現N此,每次一個 ContentProvider做uri類型的增減都會需要遍歷修改每一個switch...case...,當然,如果你使用模式(策略模式...)進行改造對手機程序來說無疑是崩潰似的(類型膨脹,效率降低...),所以,只能是忍一忍了(恩,還好不會擴散到別的類中,維護性上不會有殺人性的麻煩...)。增刪改查 ContentProvider 和所有數據源一樣,向外提供增刪改查操作接口,這些都是基于uri的指令。進行insert操作的時候,你需要傳入一個uri和 ContentValues。uri的作用基本就限于指明增減條目的類型(從數據庫層面來看就是table名),ContentValues是一個 key/value表的封裝,提供方便的API進行插入數據類型和數據值的設置和獲取。在數據庫層面上來看,這應該是column name與value的對應。但為了屏蔽ContentProvider用戶涉及到具體數據庫的細節,在Android的示例中,用了一個小小的模式。它為每一個表建一個基于BaseColumn類的派生類(其實完全可以不派生自BaseColumn,特別當你的表不基于默認的自動id做主鍵的時候),這個類通常包括一個描述該表的ContentURI對象和形如 public static final TITLE = “title”這樣的column到類數據的對應。從改變上角度來看,你可以修改column的名字而不需要更改用戶上層代碼,增加了靈活性。insert方法如果成功會返回一個uri,該uri會在原有的uri基礎上增加有一個row id。對于為什么使用row id而不是key id我想破了腦袋。到最后,我發現我傻了,因為ContentProvider不一定需要使用數據庫,使用數據庫對應的表也可以沒有主鍵,只有row id,才能在任何底層介質下做索引標識。 但,基于row id在刪除和修改操作是會造成一定的混亂。刪除和修改操作類似。刪除操作需要傳入一個uri,一個where字串,一組where的參數(做條件判定...),而修改操作會多一個ContentValues做更新值。著兩個操作的uri都支持在末尾添加一個row id。于是混亂就出現了。當在where參數中指明了key id,而在uri中提供了row id,并且row id和key id所指函數不一致的時候,你聽誰的?示例代碼中的做法是完全無視row id(無語...),如此野蠻的方式我估計也只能在示例中出現,在實際中該如何用,恩,我也不知道。幸運的是,我看了下上層對 ContentProvider的刪除操作,其實都不會直接進行,而是通過調用Cursor的delete方法進行,在這前提下,我想Cursor會處理好這些東西吧。 最后一個操作是查詢操作,可以想見,查詢的參數是最多的,包括uri和一組條件參數。條件參數類型和標準的sql類似,包括 sort, projection 之類的。從這些參數到sql語句的生成,可以尋求QueryBuilder類的幫助,它提供了一組操作接口,簡化了參數到sql的生成工作,哪怕你不懂 sql都完全沒有問題(這話說的我自己都覺得有點懸...)。查詢返回一個Cursor。Cursor是一個支持隨機讀寫的指針,不僅如此,它還提供了方便的刪除和修改的API,是上層對ContentProvider進行操作一個重要對象,需要仔細掌握(Cursor還可以綁定到view上,直接送顯,并與用戶進行交互,真是程序越往上,封裝越好,工作越機械沒有復雜性了...)。數據模型 在與界面打交道的Cursor、ContentResolver等數據操作層中,大量采用觀察者模式建立數據層與顯示層的聯系。一個顯示層的視圖,可以做成某一種觀察者注冊到Cursor或ContentResolver等數據中間層中,在實現底層ContentProvider中,我們需要特別注意在對數據進行修改操作(包括增刪改...)后,調用相應類型的notify函數,幫助表層對象進行刷新(還有一種刷新方式是從一個view發起的)。可以看到 Android的整體數據顯示框架有點像MVC的方式。Cursor、ContentResolver相當于控制層,數據層和顯示層的交互通過控制層來掌管,而且控制層很穩定不需要特別定制,通常工作只在定制數據層和顯示層空間,還是比較方便和清晰的。 10.學習感想 通過這學期對安卓的學習,大概了解了以上一些知識,對安卓有了初步的了解,這幾個月給我的東西我想用有形的和無形的兩部分概敘,形的當然就是技術水平的長進,雖然其中肯定有很多的不足,相信慢慢會體會到。 原裝軟件: AccountAndSyncSettings.apk.........賬戶與同步設置 AIMail_Android_V332a.apk.........手機郵箱 ApplicationsProvider.apk...........應用程序支持服務 BaiduSeach-v1.0.3.32_643e.apk.....百度快搜 Balance_ball_V128.apk.....平衡滾球 Bluetooth.apk...............藍牙 Bowling_V116.apk.....保齡球對戰 Browser.apk..........瀏覽器 Calculator.apk..............計算器 Calendar.apk................日程表 CalendarProvider.apk........日程表存儲 Camera.apk...........相機 CertInstaller.apk...........證書安裝 CIT.apk..............用戶接口測試 ClockSet.apk................時鐘 Contacts.apk................聯系人 ContactsProvider.apk........聯系人存儲 Conversion.apk..............轉換工具 DeviceInfo.apk..............設備信息 Dictionary.apk..............詞典 DocViewer_STD...............Polaris 文檔閱讀器 DownloadProvider.apk........下載管理器 DrmProvider.apk.............受DRM 保護的內容的存儲 DrmService.apk..............DRM 保護服務 Email.apk............電子郵件 FileManager.apk.............文件管理器 FilePicker.apk..............選擇文件 FMRadio.apk..........收音機 Gallery.apk..........7庫 GlobalSearch.apk............快速搜索框 GoogleSearch.apk............谷歌搜索 GPSUI.apk............GPS 界面,用途未知 HTMLViewer.apk..............HTML 查看器 kaixin_1.0.2.apk---開心網 LatinIME.apk................Android 鍵盤 Launcher.apk................主屏幕 LeMei.apk............樂媒 Lunar.apk............農歷 MediaProvider.apk...........媒體存儲 Mms.apk..............信息 Mob.apk..............手機營業廳 Motorboat_V110.apk------------------------急速摩托艇 Music.apk............音樂 NotePad.apk..........記本 PackageInstaller.apk........打包安裝程序 Palmebool_5_1_03.apk-----------------------愛讀掌閱 PekAllIME.apk...............京聯云輸入法 Phone.apk............撥號器 PhoneLocationProvider.apk..........本地撥號器存儲 PicoTts.apk..........語音程序 PinyinIME.apk...............谷歌拼音輸入法 ProfileSetting.apk..........情景模式 QQ_K-Touch_W606.apk---------------------手機QQ QQBrowser_W606.apk-----------------------QQ 瀏覽器 QQLord2009_W606.apk---------------------QQ 斗地主 renren_android_1.5.apk----------------------人人網 ServiceGuide.apk-----------------------------服務指南 Settings.apk................設置 SettingsProvider.apk........設置存儲 SetupWizard.apk.............設置向導程序 SogouInput_oem_w606.apk------------------搜狗輸入法 SoundRecorder.apk...........錄音機 Stk.apk..............USIM 卡應用 Straightflush_SC_VER_7_20_06.apk-------------------同花順 SuperUser.apk...............授權管理 TelephonyProvider.apk..............撥號器存儲 Tetris_V117.apk對戰俄羅斯方塊 TtsServices.apk.............GoogleTTS 語音庫服務 UHotline.apk................聯通熱線 UserDictionaryProvider.apk.........用戶字典 VoiceRecorder.apk...........錄音機 V.p.n.Services.apk..........虛擬專用網服務 Weather.apk-天氣預報 WeatherWidget----------------------------天氣預報桌面小工具 Weibo2.0.4.apk---------------------------新浪微博 Wo.apk...............沃3G WordMemo.apk................背單詞 WoStore_v16_v101.apk--------------------------沃商店 其他: 1、.android_secure 是官方app2sd 的產物,刪了之后裝到sd 卡中的軟件就無法使用了 2、.Bluetooth 顧名思義,用藍牙之后就會有這個。 3、.mobo 顧名思義,Moboplayer 的緩存文件。 4、.QQ 顧名思義,QQ 的緩存文件。 5、.quickoffice 顧名思義,quickoffice 的緩存文件。 6、.switchpro 顧名思義,switchprowidget(多鍵開關)的緩存文件。 7、.ucdlres 顧名思義,UC 迅雷的緩存文件。 8、albumart 音樂專輯封面的緩存文件夾。 9、albums 相冊縮略圖的緩存文件夾。 10、Android 比較重要的文件夾,面是一些程序數據,比如google map 的地圖緩存。 11、backups 一些備份文件,比如聯系人導出到SD 卡時會導入到此文件夾 12、baidu 顧名思義,掌上百度、百度輸入法之類程序的緩存文件夾。 13、bugtogo 系統出現問題的時候會形成一些報告文件,存放于此文件夾。" 14、cmp 個人初步判斷是音樂的緩存文件夾。 15、data 同樣是緩存數據的文件夾,與Android 性質類似。 16、DCIM 相機的緩存文件夾,里面是你照的照片。 17、documents Documents To Go 的相關文件夾。 18、etouch 易行的緩存文件夾。 19、extracted androzip 等解壓縮軟件默認的解壓目錄。20、gameloft 顧名思義,gameloft 游戲數據包存放的文件夾。 21、handcent 顧名思義handcent(超級短信)數據文件夾。* 22、handyCurrency 貨幣匯率相關的文件夾,裝了handycalc(科學計算器)之后才會有。 23、ireader 顧名思義,ireader 的緩存文件夾。 24、KingReader 顧名思義,開卷有益的緩存文件夾。 25、LazyList Applanet(黑市場)的緩存目錄,也許和其他序也有關,暫時不太清楚。 26、LOST.DIR 卡上丟失或出錯的文件會跑這里,此目錄無用,刪了會自動生成。 27、moji 顧名思義,墨跡天氣的緩存目錄。 28、MusicFolders poweramp 產生的緩存文件夾。 29、openfeint 顧名思義,openfeint 的緩存文件夾。30、Picstore 圖片瀏覽軟件建立的一個目錄。 31、Playlists 播放列表的緩存文件夾。 32、renren 顧名思義,人人網客戶端的緩存文件夾。 33、screenshot 貌似是截屏圖片保存的目錄,34、ShootMe 顧名思義,shootme 截屏后圖片文件保存的目錄。 35、SmartpixGames Smartpix Games 出品游戲的緩存文件夾,比如Jewellust。 36、sogou 顧名思義,搜狗拼音的緩存文件夾。 37、SpeedSoftware RE 文件管理器的緩存文件夾。 38、SystemAppBackup SystemApp remove(深度卸載)備份系統文件后,備份文件保存的目 錄。 39、TalkingFriends talking tom(會說話的tom 貓)錄制的視頻文件所保存的目錄。40、Tencent 顧名思義,騰訊軟件的緩存目錄,比如QQ。(與上面的.QQ 文件夾并不相同) 41、TitaniumBackup 顧名思義,鈦備份備份程序鎖保存的目錄。' 42、TunnyBrowser 感覺是海豚瀏覽器的緩存目錄,但不知道為什么叫這個名字,金槍魚瀏 覽器.....43、UCDLFiles UC 迅雷下載文件的保存目錄。 44、UCDownloads UC 瀏覽器下載文件的保存目錄。 45、VIE Vignette(暈影相機)的緩存目錄。 46、科學上網 顧名思義,科學上網 數據的緩存目錄。 47、yd_historys 有道詞典搜索歷史的緩存目錄。 48、yd_speech 有道詞典單詞發音的緩存目錄。 49、youmicache 刪掉后還會自動生成,悠米廣告的緩存目錄,廣告程序內嵌在其他程序中。補: 50、Glu Glu 系列游戲的資料包存放地。如3D 獵鹿人等。 51、DunDef 地牢守護者的數據包。 52、KuwoMusic 顧名思義,酷我音樂相關文件夾。 53、MxBrowser 遨游的緩存目錄。 54、Camera360 顧名思義,camera360 的緩存目錄。 55、TTPod 顧名思義,天天動聽的緩存目錄。 56、apadqq-images QQ for pad 的緩存目錄。 57、My documents 自己手機啟用各種程序任務記錄文檔 定期清除 時間長了會積累 很多 占用SD 卡內存。6 w& J2 g2 H9 H5 y, y 58、.nomedia 手機中隱藏的音頻 圖片文件夾 可以自設在相關文件夾中。 59、media(媒體文檔)使用電話通話錄音軟件 或在線瀏覽視頻等媒體 產生的音頻文件60、帶有navi 的是導航軟體,一般是地圖包 61、.BlueFTP_thumbnails 藍牙助手的緩存 62、.FileExpert 是文件大師的緩存)63、.quickoffice 是quickoffice 的緩存文件。64、.zdclock 正點鬧鐘的緩存與記憶 65、365riliDownload 顧名思義就是365 日歷的緩存,下載的插件也在里面 66、appmonster2 備份精靈的緩存 67、bcr 名片全能王緩存 68、Camera360 這不用解釋了,大家都知道 69、CamScanner 掃描全能王的緩存 70、GOLauncherEX 這大家應該也知道,就是GO 桌面的緩存 71、GOSMS GO 短信 72、Goweather GO 天氣 73、MTXX 美圖秀秀,制作后的圖片緩存 74、ndcommplatform,PandaSpace 這兩者都是91 助手生成的緩存 75、notegallery 文本全能王的緩存 76、Photaf 3D 全景拍照的緩存 77、photowonder 魔圖精靈生成的緩存 78、soundhound 獵曲奇兵的緩存 79、WhatsApp 這...中文是什么,呵呵,大家都知道吧WhatsApp 的緩存 80、Youdao 有道詞典是這文件夾名稱,yd_historys,yd_speech 共五個集成在一起 ricwang36(81、SystemAppBackup SystemApp remove(深度卸載)備份系統文件后,備份檔桉保存的 目錄 82、SpeedSoftware RE 管理器產生的 83、rosie_scroll 坦白說,我一直不知道這個是什么,刪了沒事,但是還會自動生成,應 該是手機自帶哪個軟體生成緩存 84、alarms Alarms 鬧鐘鈴聲 85、Music MP3 音樂,部分手機才會有 86、notifications 訊息鈴聲,部分手機才會有 87、ringtones 來電鈴聲,部分手機才會有 88、.bookmark_thumb1 是手機瀏覽器可視化我的最愛圖片的存放資料夾。 89、.footprints 用于記錄手機照片的真實地理位置 90、albumthumbs 照片小圖的緩存,為了加快小圖的顯示速度 如何學習安卓 想學編程開發,那要先會一門編程語言,現在可以試著去學學C語言,雖然這個安卓沾不上邊,但是,C語言的編程思想還是很重要的,學完了C語言之后,他的語法基本上和所有的編程語言都很相像,能影響你的思維,幫助你理解其他的編程語言的。之后呢,在好好看看《數據結構》,這很重要。然后再去學學Java語言,因為Android的應用的開發語言用的是Java,所以一定要好好學習。 最后了解下數據庫,我們在學習數據庫之前都先學了《數據庫原理》《離散數學》《關系代數》,有了這些基礎之后再去學數據庫,數據庫也有很多可以選擇的,推薦mysql。 加油!第二篇:安卓系統精簡總結
第三篇:安卓學習心得
第四篇:安卓目錄總結
第五篇:如何學習安卓