第一篇:Android數據共享之ContentProvider總結
Content Provider 由上一節內容,我們了解到Adroid的數據都是私有的,那么對于像通訊錄之類,多個APP(撥號、通話、短消息…)都需要共享使用,該怎么實現呢?
答案就是ContentProvider。
概述:
ContentProvider是Android平臺中,在不同應用程序之間實現數據共享的一種機制。一個應用程序如果需要讓別的程序可以操作自己的數據,即可采用這種機制。并且此種方式忽略了底層的數據存儲實現,ContentProvider提供了一種統一的通過Uri實現數據操作的方式。
Android為常用的數據類型(圖片,音視頻,通訊錄)提供了大量的ContentProvider,它們被定義在android.provider包下面。
操作模型:
ContentProvider類:
定義在android.content包下面,主要數據存取類,提供了常用的數據操作接口 ? delete(): 刪除數據集
? insert():添加數據集
? qurey():查詢數據集
? update():更新數據集
? onCreate():初始化底層數據集和建立數據連接等工作
? getType():返回指定URI的MIME數據類型,ContentResolver類:
ContentProvider是實際操作數據庫的方法,客戶端通過ContentResolver實現,ContentResolver和ContentProvider提供了對應的方法,諸如insert(), delete(), query()和update()之類的方法。我們間接的通過ContentResolver的方法來操作ContentProvider。
Uri介紹
ContentProvider 通過URI對象共享數據;Uri代表了要操作的數據,Uri主要包含了兩部分信息:
1》需要操作的ContentProvider
2》對ContentProvider中的什么數據進行操作
Uri是一個通用資源標志符,將其分為A,B,C,D 4個部分:
A:無法改變的標準前綴,包括;“content://”、“tel://”等。當前綴是“content://”時,說明通過一個Content Provider控制這些數據;
B:URI的標識,它通過authorities屬性聲明,用于定義了是哪個ContentProvider提供這些數據。對于第三方應用程序,為了保證URI標識的唯一性,它必須是一個完整的、小寫的類名。例如:
“content:// com.test.contentproviderdemo ”;
C:路徑,可以近似的理解為需要操作的數據庫中表的名字,如:“content:// com.test.contentproviderdemo/people”中的people
D:如果URI中包含表示需要獲取的記錄的ID,則就返回該id對應的數據,如果沒有ID,就表示返回全部;
將字符串轉成Uri,Uri uri = Uri.parse(“content:// com.test.contentproviderdemo/people ”)
跟Uri相關的兩個操作類:
A、public class UriMatcher //匹配
//注冊匹配Uri路徑
//常量UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼
UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);//添加需要匹配uri,如果匹配就會返回匹配碼
//如果match()方法匹配content:// com.test.contentproviderdemo/people路徑,返回匹配碼為1 sMatcher.addURI(“com.test.contentproviderdemo”, “people”, 1);
//如果match()方法匹配content://com.test.contentproviderdemo/people/2路徑,返回匹配碼為2 sMatcher.addURI(“com.test.contentproviderdemo”, “people /#”, 2);//#號為通配符
switch(sMatcher.match(Uri.parse(“content:// com.test.contentproviderdemo/people/10”))){
case 1
break;case 2
break;default://不匹配
break;}
B、public class ContentUris //獲取ID
withAppendedId(uri, id)用于為路徑加上ID部分:
Uri uri = Uri.parse(“content:// com.test.contentproviderdemo/people ”)Uri resultUri = ContentUris.withAppendedId(uri, 10);parseId(uri)方法 用于從路徑中獲取ID部分:
Uri uri = Uri.parse(“content:// com.test.contentproviderdemo/people /10”)long personid = ContentUris.parseId(uri);//獲取的結果為:10
主要步驟:
1.創建保存數據的文件或者數據庫。
2.在當前應用程序中定義一個ContentProvider,重載相關操作接口。如: public class PeopleProvider extends ContentProvider{ public boolean onCreate()public Uri insert(Uri uri, ContentValues values)public int delete(Uri uri, String selection, String[] selectionArgs)public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)} public String getType(Uri uri)3.在當前應用程序的AndroidManifest.xml中注冊此ContentProvider
android:authorities = “com.test.contentproviderdemo”/> 4.其他應用程序通過ContentResolver和Uri來獲取此ContentProvider的數據。
ContentResolver resolver = getContentResolver();5.通過注冊registerContentObserver監聽ContentProvider的數據變化;
ContentProvider完整實例:
ContentResolverDemo.zipContentProviderDemo.zip
ContentProviderDemo是一個無界面的示例,僅提供一個ContentProvider組件,供其他應用程序進行數據交換底層使用SQLite數據庫,支持數據的添加、刪除、更新和查詢等基本操作
ContentResolverDemo是使用ContentProvider的示例,自身不具有任何數據存儲功能,僅是通過URI訪問ContentProviderDemo示例提供的ContentProvider。<完>
第二篇:Android 淺談數據共享
由麥可網整理,轉載請注明出處
Android 淺談數據共享
對于應用程序之間的數據共享,Android提供了比較靈活的方式,相關的開發經驗下面是Android123平時使用的方法。
1.簡單配置文件:
SharedPreferences方式存儲的配置文件,我們在各個應用間可以通過 getSharedPreferences(“eoeandroid”, Context.MODE_PRIVATE);這樣的方式存儲,最后是共享模式,這里使用了私有,而通過全局讀、全局寫可以讓其他的應用訪問,通過createPackageContext方法,但是在Android 1.5 以后,共享訪問需要相同UID和簽名才可以訪問。
2.SQLite數據庫文件
對于一些較為復雜的配置或數據,在Android平臺上我們一般使用SQLite數據庫存儲,對于共享我們可以提供ContentProvider接口來實現,我們雖然可以獲取當前應用的數據庫保存位置,通過Context的getDatabasePath(String name)這個方法,由于應用的PackageName比較長可能會發生變動,Android提供了類似Intent的方式來匹配一些Uri,比如說電話撥號為 tel:// 而對于網址可以使用 http:// 對于定做坐標使用geo://,而我們的數據庫可以通過UriMatcher類的addURI添加一些Uri,通過隱式Intent方式實現自己的處理方式,具體的大家可以查看短信應用的開源代碼 Mms.git 了解。
3.對于運行中的高性能數據共享
在Android中共享內存方法可以使用linux底層的mmap方式,對于跨進程訪問,使用IPC,當然Android還提供了AIDL遠程服務來實現數據綁定訪問處理,所以說對于Android Service的開發,一定要記住通過Bind方式來開發,比較典型的有音樂播放器,Music.gif
第三篇:Android之activity總結
Android之Activity總結
一、什么是Activity
Activity 是用戶接口程序,原則上它會提供給用戶一個交互式的接口功能。它是 android 應用程序的基本功能單元。Activity 本身是沒有界面的。所以activity類創建了一個窗口,開發人員可以通過setContentView(View)接口把UI放到activity創建的窗口上,當activity指向全屏窗口時,也可以用其他方式實現:作為漂浮窗口(通過windowIsFloating的主題集合),或者嵌入到其他的activity(使用ActivityGroup)。activity是單獨的,用于處理用戶操作。幾乎所有的activity都要和用戶打交道
二、Activity生命周期(生命周期方法)
由圖可知,這些方法調用的順序:
1.Activity正常啟動:onCreate-> onStart-> onResume;
2.Activity被殺掉:onPause-> onStop-> onDestroy,此為一個完整的生命周期。3.中斷處理:onPause-> onStop,恢復時onRestart-> onStart-> onResume;
4.如果當前Activity是半透明狀態或者對話框狀態:那么中斷就是onPause ,恢復的時候onResume。
那么對于”Other app need memory”,就是我們手機在運行一個應用程序的時候,有可能打進來電話發進來短信,或者沒有電了,這時候程序都會被中斷,優先去服務電話的基本功能,另外系統也不允許你占用太多資源,至少要保證一些功能(比如電話),所以資源不足的時候也就有可能被kill掉。
方法在系統中的作用及我們應該做什么:
onCreate(創建):在這里創建界面,做一些數據的初始化工作;
onStart(可視狀態): 到這一步變成“用戶可見不可交互”的狀態;
onResume(可交互狀態):變成和用戶可交互的,(在Activity棧系統通過棧的方式管理這些Activity,即當前Activity在棧的最上端,運行完彈出棧,則回到上一個Activity);
onPause(暫停狀態):到這一步是可見但不可交互的,系統會停止動畫等消耗CPU的事情。從上文的描述已經知道,應該在這里保存你的一些數據,因為這個時候你的程序的優先級降
低,有可能被系統收回。在這里保存的數據,應該在onResume里讀出來。
OnStop(停止狀態):變得不可見,被下一個activity覆蓋了。
onDestroy(殺死):這是Activity被kill前最后一個被調用方法了,可能是其他類調用finish方法或者是系統為了節省空間將它暫時性的干掉。
onPause,onstop,onDestroy,三種狀態下 activity都有可能被系統殺掉。
Activity棧:Activity以棧的形式進行管理,后進先出的原則
三、Activity之間的通信
在 Android 中,不同的 Activity 實例可能運行在一個進程中,也可能運行在不同的進程中。因此我們需要一種特別的機制幫助我們在 Activity 之間傳遞消息。
Android 中通過 Intent 對象來表示一條消息,一個 Intent 對象不僅包含有這個消息的目的地,還可以包含消息的內容,這好比一封 Email,其中不僅應該包含收件地址,還可以包含具體的內容。
Intent是一種運行時綁定(runtime binding)機制
Intent負責對操作的動作、動作涉及數據、附加數據進行描述,Android則根據此Intent的描述,負責找到對應的組件,將 Intent傳遞給調用的組件,并完成組件的調用。因此,Intent在這里起著一個媒體中介的作用,專門提供組件互相調用的相關信息,實現調用者與被調用者之間的解耦。
在應用中,我們可以以兩種形式來使用Intent:
直接Intent(應用程序內部):指定了component(組建)屬性的Intent。通過指定具體的組件類,通知應用啟動對應的組件。
間接Intent(應用程序之間):沒有指定comonent屬性的Intent。這些Intent需要包含足夠的信息,這樣系統才能根據這些信息,在在所有的可用組件中,確定滿足此Intent的組件。
對于直接Intent,Android不需要去做解析,因為目標組件已經很明確。
Android需要解析的是那些間接Intent,通過解析,將 Intent映射給可以處理此Intent的Activity、IntentReceiver或Service。Intent解析機制主要是通過查找已注冊在AndroidManifest.xml(清單)中的所有IntentFilter(意圖過濾器)及其中定義的Intent,最終找到匹配的Intent。
橫屏時:onConfigurationChanged(配置改變))
橫屏以及出現鍵盤鍵盤時生命周期部重新開始的方法: KeyboardHidHidden/orientation/screenSize 橫屏顯示:landscape 豎屏顯示:portrait
四大組建:activity:活動、service:服務、content provider:內容提供商、broadcast receiver:廣播收音機
Activity的所有面試題
什么是Activity? 請描述一下Activity 生命周期?
兩個Activity之間跳轉時必然會執行的是哪幾個方法?
你后臺的Activity被系統 回收怎么辦?如果后臺的Activity由于某原因被系統回收可了,如何在被系統回收之前保存當前狀態?
如何退出Activity?如何安全退出已調用多個Activity的Application? 兩個Activity之間怎么傳遞數據?
第四篇:關于android手機的文件共享
關于android系統的設備的文件共享
個人寫作水平不怎么好,請各位不要笑話!寫這個沒有什么其他意圖,只是想和大家分享個人的一些想法!
如今這年代手機、平板電腦進入了每個人的生活,時不時的會拿出來玩玩。有時候,幾個人在一起的時候,可能會問到“你手機里有什么好東西,分享分享一下”,在這個時候,大家最可能想到的是通過藍牙來傳輸,當然如果在文件大小較少時還好,傳幾分鐘沒關系,如果是視頻,數據包等這類大文件,還這樣傳輸就太費時了。。。。。。。
費話就不多說。直接說說這個文件共享。網絡速度的比藍牙快多了,所以我的共享方法就是通過網絡來共享。說到網絡當然不會是用中國聯通,中國移動這類,指的是局域網,首先得建立一個,android2.2以上系統的手機都可以建立一個無線熱點,可以讓其中一個手機開啟這個功能(如果怕其他設備通過你的手機上網浪費流量,就可以關閉移動數據),讓其他需要共享的設備接入這個網絡,如果在windows 下,大家都知道,通過Windows的資源管理將某個文件夾共享,其他設備通過輸入IP共享目錄就可以了,但是android系統的沒有這么方便的功能,當然在這里原理也是一樣的,必須建立一個共享文件夾,這里個人推薦一個軟件是——無線數據線(這個網上很多)——此軟件建立的是一個FTP
建立 一個共享還不行啦,得有個軟件能訪問網絡文件夾才行啦,個人推薦ES文件瀏覽器,通過這兩個軟件就可以完成共享文件。
軟件的使用,我相信大家大部分一看都會用,如果不會請參考網上。總結:
此方法的條件
1:有WIFI功能的設備
2:有一無線網絡,或者一個手機能提供無線熱點。3:無線數據線軟件(僅建立共享機必備)4:ES文件瀏覽器軟件(訪問共享的必備)、說明:此方式,他人可以刪除文件,安全性不高 玩android高手,可以建立一個SMB服務器進行共享。
另一種和與藍牙點對點發送方式類似,同樣要求上一種方式的前兩項,要求另外一個軟件,稱為WIFI文件共享軟件,網上有下載。
第五篇:Android總結
Android四大組件:
Activity—表現屏幕界面
Service—后臺服務
BroadcastReceiver—實現廣播機制
ContentProvider—實現數據存儲
Intent類:用來啟動程序并傳遞信息的類
用于Activity、Receiver、Service之間進行交互的類,通過無參構造方法創建對象,增加其action、category、data、extra等屬性進行信息傳遞,并通過Activity中的startActivity(Intent intent)進行界面的跳轉;通過Context中的StartService(Intent intent)進行服務跳轉;通過Context中的registerReceive(Intent intent)對廣播進行注冊,并通過sendBroadcast()進行無序消息發送,或可以通過SendOrderedBroadcast()進行有序的消息發送。Handler類:
用來發送和處理消息,并配合主線程完成UI的更新;消息Message/Runnable傳遞通過MessageQueue(消息隊列,先進先出)進行傳遞,并通過Lopper進行接收,傳遞的消息可以為Message對象,也可以是Runnable對象;接收方法通過HandleMessage(Message msg)進行獲取。SharedPreferences類:
一般用于第一次登錄時的設置,或者是各個界面的一些小型格式設置,如字體等。是本地的小型共享數據庫,可以通過Context的靜態方法getSharedPreferences獲得其對象,對象內的值均為鍵值對進行儲存。通過SharedPreferences對象調用editor()獲取SharedPreferences.Editor對象,向共享數據庫中增加數據,putString(),并提交數據,commit();通過SharedPreferences對象獲取共享數據庫中的數據,getString()。
ViewPager:實現界面滑動的類;
通過設置OnPagerChangedListener設置ViewPager的監聽事件;
實現流程:
①布局文件中設置ViewPager控件;
②代碼中進行綁定控件;
③通過繼承PagerAdapter抽象類進行設置適配器,并傳遞數據源;
④適配器中實現兩個抽象方法,兩個重寫方法:getCount()—獲取滑動界面的數量,isViewFromObject()—判斷視圖是否是來自于Object文件中;重寫兩個方法,分別為destoryItem—銷毀指定位置的視圖;InstantiateItem(),設置指定位置的視圖;
Timer與TimerTask類:
Timer為計時器的類,通過無參構造方法可以獲取對象,通過Timer.schedule(TimerTask task,long time)進行設置多久后執行某任務,當任務執行完后,取消計時的功能,Timer.cancle();TimerTask類為抽象類,實例化時,必須重寫run方法;執行的內容,均在run方法中進行設置,并且執行時,已在子線程中進行執行。自定義View:用到的類有Paint、Canvas、Spec、SpecF、Path、View.MeasureSpec、Timer、TimerTask;
抽象類,通過子類繼承,獲取對象;在布局文件中綁定后,通過代碼,設置自定義View的屬性;自定義View中,通過重寫OnMeasure方法,對布局文件中的尺寸進行測量,并由View中的setMeasureDimenson()方法,進行數據的保存;通過重寫Ondraw方法,進行繪圖;當需要繪制動態圖形時,使用計時器Timer的schedule(TimerTask,long time,delay time2)方法,在time時間后,每隔time2時間,重寫執行run方法中的內容;將耗時的操作設置在run方法中,并通過View中的invalidate()方法刷新主線程中的繪的圖形,通過postInvalidate()刷新子線程中的圖形。數據庫:
常用的數據庫有Oracle,需要安裝和配置的大型收費數據庫;MySQL是中型數據庫,同樣需要安裝配置,但不需要收費;Sqlite是小型免費的嵌入式數據庫,占用內存低,最新版本為3.0。Sqlite數據庫需要通過SqliteDatabaseOpenHelper進行創建數據庫,并通過SqliteDatabase進行數據庫的操作。輔助類是抽象類,通過繼承,重寫兩個方法,并在子類的構造方法中通過OpenHelper的構造方法(Context context,String SqlName,SqliteDatabase.CursorFactory factory,int version)進行數據庫的創建,在onCreate方法中,進行數據庫表的創建,在onUpdate中進行數據庫的版本更新。在數據庫的操作類中,執行exect方法,通過sql語句對數據庫進行操作。Create table student(_id integer primary key auto increament ,name text);insert into student(_id,name)values(1,zx);delete from student where _id=1;update student set _id=2 where name=zx;select *from student;ListView、GridView適配器的優化:
將布局文件中的控件進行封裝,當視圖加載時,判斷可變視圖是否存在,當不存在時,通過布局文件獲取視圖,并新建封裝類,將地址通過setTag()進行發送;當視圖存在時,重復利用地址—getTag()。反射:
存儲數據的方式:
共享數據庫、數據庫、文件、網絡、內容提供者
廣播:
廣播傳播時,需要接收者、發送者、廣播頻道;根據發送者的發送方式不同,分為有序廣播、無序廣播;有序廣播為接收者有接收順序,根據設置的優先級不同,確定先后順序,接收者同時也是發送者,向后面的廣播發送消息,發送過程中,可以添加信息,也可以停止廣播的傳輸;無序廣播,接收者之間無聯系,均從發送者處接收信息;廣播在傳輸過程中,不能被添加信息,也不可能被停止。廣播在發送前,需要對接收者進行注冊,注冊方式有兩種,動態注冊、靜態注冊。動態注冊,是在代碼中進行,通過Context對象調用靜態方法進行注冊,所有的廣播均可以用動態注冊,其生命周期依賴于應用,相對于靜態注冊,比較節省內存;靜態方法在清單文件中進行注冊,部分系統廣播不能通過靜態注冊進行,其生命周期依賴于系統,當系統啟動,即運行接收廣播,較耗內存。廣播接收者需要繼承BroadcastReceiver,并實現抽象方法onReceive(),通過回調接口,進行數據的傳輸。注意:廣播發送前,必須進行接收者的注冊,并且,當顯示跳轉時,不需要意圖過濾器。安卓布局:九種布局
線性布局,水平或垂直方向兩種格式,主要特點為權重,即規定各控件在視圖中的占有的比例;
相對布局,相對于父控件或兄弟控件的布局,各控件需指定相對位置; 絕對布局,指定各控件在視圖中的絕對位置,幾乎不再使用; 表格布局,子布局放在行中,列由控件表示(TableRow); 幀布局:覆蓋前面布局的布局,一般用于暫停按鈕等; 風格布局:可以跨行、跨列的布局,占滿換行;
左右側滑:可以實現左右側滑,通過設置主菜單和二級菜單設置左右兩個菜單; 下拉刷新:設置下拉刷新、上拉加載的功能; 抽屜布局;
安卓版本及對應的API:
1.6—4;2—7;3—11;4—15;4.3—18;5—20;5.1—21;6—23;7—25; 安卓四層架構:
應用層:Java語言開發,主要從事App開發;
運行庫層:Java語言與C語言,View視圖、管理類等的開發; 架構層:C語言與Linux語言,各種框架、瀏覽器等; 內核層:Linux、C語言,開發各種驅動; 安卓四大組件:
Activity:界面,實現程序與用戶之間的交換,有自己的生命周期,七個生命周期;4種啟動模式 Service:
BroadcastReceive:三要素,發送者、接收者、發送頻道(Intent);類型:有序(接收有序,有數據傳送,可以攔截數據)、無序廣播(相對);注冊方式:靜態注冊,持久監聽,占用內存比較高生命周期跟隨系統,動態注冊(代碼中),所有廣播都可以動態注冊,部分系統廣播不能動態注冊,臨時監聽,占用內存較少,生命周期隨應用進行;
ContentProvide:不能存放數據,五種存放數據方式之一,特點為:①為數據的獲取等操作添加一個統一的接口②可以實現跨應用訪問數據;③可以實現Android中通訊錄、消息、音頻、視頻等的訪問或操作;通過ContentReceive進行數據的訪問,可以對數據進行增刪改查操作。
動畫: IO流: 序列化: AlertDialog:
Set實現類: 手機電量檢測:
自定義SurfaceView:
自定義View:三個構造方法的區別
Message:Handler.obtain/new/Message.obtain
HttpUriConnection訪問網絡
gride 異步任務 動畫
抽象類和接口 反射 克隆 序列化 側滑的實現 數據庫 Socket:
Gson解析
異步任務和子線程區別 WebView 版本更新 照片的圓角化
Collection與Collections Sql語句
MVP框架與MVC: TCP與UDP的區別: 一鍵分享的流程: Http協議的理解: 不使用框架訪問網絡: List集合與set集合: 自定義View的流程: 線性布局的特點: ViewPager的原理: 服務的啟動方式:
Activity的啟動方式: Xml數據解析: