-
廣播接收器---“普通的廣播接收器” 1.首先發送廣播。 Intent intent=new Intent(); intent.setAction("BC_ONE"); //設置動作(就是給改廣播一個名字,用于過濾),與廣播接收器的過濾條件匹配 intent.putExtra("msg", "這是我發送的廣播");//放入數據 sendBroadcast(intent); //將廣播發送出去 2.然后新建一個類 BC1 ,繼承 BroadcastReceiver 并實現方法 onReceive(): public void onReceive(Context context, Intent intent) { //該廣播接收器注冊之后,如果接受到廣播,會調用該回掉函數。之前通過回掉函數中的intent來獲取信息 String s = intent.getStringExtra("msg"); System.out.printf("receive1收到消息:"+s); } 4.在AndroidManifest.xml中注冊廣播接收器 <!-- 注冊廣播接收器,name為全限定名 --> <receiver android:name="com.example.broadcastreceiverdemo.MyBroadcastReceiver1"> <!-- 廣播接收器過濾器 ,priority設置優先級,-1000~1000--> <intent-filter android:priority="100"> <!-- 過濾Action為“BC_ONE”的廣播,只接受這個 --> <action android:name="BC_ONE"/> </intent-filter> </receiver> 其他知識點總結: 一、優先級 1.通過在xml注冊時設置優先級。數越大,優先級越高。就會越先調用 2.可以動態注冊,如果動態注冊。優先級最大。高于任何xml中注冊的。 3.如果動態注冊和靜態注冊都有,則會執行兩次onReceive查看全部
-
廣播的種類: 1. 普通廣播(Normal broadcasts) 所有監聽該廣播的廣播接收者都可以監聽到該廣播。 2. 有序廣播(Ordered broadcasts) 按照接收者的優先級順序接收廣播,優先級別在 intent-filter中的priority中聲明,-1000到1000之間,值越大,優先級越高??梢越K止廣播意圖的繼續傳播。接收者可以篡改內容。 3. 異步廣播(粘滯性滯留廣播) 不能將處理結果傳給下一個接收者,無法終止廣播。 普通廣播的特點: 1. 同級別接收,次序隨機 2. 級別低的后收到廣播 3. 接收者不能截斷廣播的繼續傳播也不能處理廣播 4. 同級別動態注冊高于靜態注冊(動態注冊的優先級別更高) 有序廣播特點: 1. 同級別接收順序是隨機的 2. 能截斷廣播的繼續傳播,高級別的廣播接收器收到該廣播后,可以決定是否截斷該廣播。 3. 接收器能截斷廣播的繼續傳播,也能處理廣播。 4. 同級別動態注冊高于靜態注冊。查看全部
-
組件篇—BroadcastReceiver 1. Boastcast(廣播)是一種廣泛運用的在應用程序之間傳輸信息的機制。 2. BroadcastReceiver(廣播接受者)是對發送出來的廣播進行過濾并響應的一類組件,它就是用來接收來自系統和應用中的廣播。 3. 用途: * 當開機完成后系統會產生一條廣播;有些程序會接收此廣播而啟動程序,這就是“自啟動”。 * 當網絡狀態改變時系統會產生一條廣播;一般用于提示用戶。 * 當電池電量改變時,系統會產生一條廣播; * 其他。 為什么需要廣播? 假如沒有廣播,那么,很多事情都要自己做,需要自己想辦法去獲取數據。 有了廣播,我們只需等待廣播告訴我們信息。 廣播的優點: 1. 大大減少開發的工作量和開發周期 2. 作為應用開發者,只需要掌握 BroadcastReceiver,不需要了解底層實現。 使用方法:發送: 1. 把信息裝入一個 Intent對象(如Action、Category) 2. 通過調用相應的方法將 Intent對象以廣播方式發送出去:sendBroadcast()、sendOrderBroadcast()、sendStickyBroadcast() 接收:當 Intent 發送以后,所有已經注冊的 BroadcastReceiver 會檢查注冊時的 IntentFilter 是否與發送的 Intent 相匹配,若匹配則就會調用 BroadcastReceiver的 onReceive()方法。所以當我們定義一個 BroadcastReceiver 的時候,都需要實現 onReceive()方法。 注意:BroadcastReceiver需要注冊 :靜態注冊和代碼注冊 1. BroadcastReceiver 生命周期只有十秒左右。 2. BroadcastReceiver 里面不能做一些耗時操作(就是因為生命周期短) 3. 耗時操作應該通過發送 Intent 給 Service,由Service來完成 4. 不能使用子線程。使用子線程不可靠!因為BroadcastReceiver生命周期太短,可能接收都結束了,子線程還沒結束。接收器一旦結束了,Receiver所在的進程很容易在需要的時候被殺死,因為此時它是空進程(沒有任何活動組件的進程就是空進程),一旦宿主進程被殺掉了,那么正在工作的子進程也會被殺死。查看全部
-
插入電話信息 其中的 Data.CONTENT_URI 要導入的包是:android.provider.ContactsContract.Data; 而系統自動匹配的可能是其他包,這時就會出錯,所以要檢查一下是不是導錯包了。 需要添加的權限: <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/> 代碼: ContentResolver cr=getContentResolver(); //向聯系人中插入一行數據 ContentValues values=new ContentValues(); Uri uri=cr.insert(RawContacts.CONTENT_URI, values); Long raw_contact_id=ContentUris.parseId(uri); values.clear(); //插入人名 values.put(StructuredName.RAW_CONTACT_ID, raw_contact_id);// 先確定主鍵,然后才能正確地添加信息 values.put(StructuredName.DISPLAY_NAME, "郭富城"); values.put(StructuredName.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);//聲明MiME類型是一條記錄,而不是很多條查看全部
-
更具聯系人ID查詢出聯系人的郵箱地址---代碼 (不用姓名的原因是姓名可能有相同的,而ID是唯一的)查看全部
-
方法屬性查看全部
-
記得加上<uses-permission android:name="android.permission.READ_CONTACTS"/> 號碼的查詢不再像前面那種直接查詢,而是必須通過聯系人的Id去查找對應的電話,如果不這么做,查出來的電話號碼可能不是當前聯系人的電話號碼。 依然需要通過ContentResolver來查詢(在上節課的游標循環之內),然后返回一個游標Cursor,再通過游標去查詢號碼。這樣就形成了“游標套游標”。 需要導入的包:android.provider.ContactsContract.CommonDataKinds.Phone; 1. 查詢的 Uri : Phone.CONTENT_URI。 2. 查詢的內容:號碼除了數字以外,還有分類型(例如移動號碼、家庭號碼),所以對應兩個屬性:Phone.NUMBER,Phone.TYPE。查詢內容就是 new String[]{Phone.NUMBER,Phone.TYPE}。 3. 查詢條件,是根據 Id 去查的,寫做 Phone.CONTACT_ID+"="+id。注意等號一定要加引號。 4. 最后兩個屬性這里不需要,都寫成 null 就可以了。 ------------- 通過游標查詢電話之后,記得關閉游標c1。注意這里的關閉是在 if (c1!=null)語句塊之內,如果寫到外面則會存在空指針異常。查看全部
-
ContentProvider: 1. 使用 ContentResolver 操作 ContentProvider 中的數據: 當外部應用需要對 ContentProvider 中的數據進行增刪改查的時候,可以使用 ContentResolver 類來完成。 2. 使用 Activity 提供的 getContentResolver() 方法獲取 ContentResolver 對象。 3. ContentResolver 類提供了與 ContentProvider 類相同簽名的四個方法: -- public Uri insert(Uri uri,ContentValues values).該方法用于往ContentProvider里面添加數據。 -- public int delete(Uri uri,String selection,String[] selectionArgs).該方法從ContentProvider中刪除數據。 -- public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs).該方法用于更新ContentProvider里面的數據。 -- public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder).該方法用于從ContentProvider中獲取數據。查看全部
-
UriMatcher類查看全部
-
uri查看全部
-
ContentProvider與其他幾種存儲不同(都只是在單獨的一個應用程序之中達到一個數據的共享,不能訪問其他應用的數據),ContentProvider提供數據,可以在不同應用間 通過繼承ContentProvider實現針對數據的增刪改查等方法,需要在清單文件中注冊 <provider android:name="com.imooc.MusicProvider" android:authorities="com.provider.music" ></provider> 注:注冊的anthorities的屬性值,是全局唯一的。 第三方的訪問能力完全取決于你自定義的ContentProvider,如果定義的ContentProvider只實現查詢功能,那么第三方程序就只能做查詢的操作,不能做其他的操作。 繼承 ContentProvider 之后實現的幾個方法: onCreate() :在ContentProvider創建后使用。 Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):根據Uri查詢selection指定的條件所匹配的全部記錄,并且可以指定查詢哪些字段、以什么方式排序。 insert(Uri uri, ContentValues values):根據Uri插入values對應的數據。 delete(Uri uri, String selection, String[] selectionArgs):根據Uri刪除selection指定的條件所匹配的全部記錄。 update(Uri uri, ContentValues contentValues, Str。。。。):根據Uri修改selection指定的條件所匹配的全部記錄。 比較值得注意的如下: getType(Uri uri):返回當前Uri的 MIME 類型,如果當前的Uri包含多條記錄,那么 MIME 類型字符串就以 vnd.android.dir/ 開頭,如果該Uri對應的數據只有一條記錄,那么 MIME 類型字符串就以 vnd.android.cursor.item/ 開頭查看全部
-
當應用程序在安裝時,系統就會分配給他一個userid,當該應用要去訪問其他資源比如文件的時候,就需要userid匹配。默認情況下,任何應用創建的文件,sharedpreferences,數據庫應該都是私有的(位于/data/data/<package name>/files),其他程序無法訪問。除非在創建時指定了MODE_WORLD_READABLE 或者 MODE_WORLD_WRITEABLE。 創建的文件保存在/data/data/<package name>/files目錄 openFileOutput(fileName,MODE):第一個參數是文件的名字,第二個參數是權限,權限可以疊加的。 如果希望文件被其他應用讀和寫,可以傳入: MODE_WORLD_READABLE + MODE_WORLD_WRITEABLE,也就是說,權限是可以合理地疊加在一起。查看全部
-
File文件操作(圖為讀取文件內容) 輸出流剛開始是沒有內容的,需要調用FileOutputStream.write()來寫入內容;輸入流剛開始是有內容,可以調用FileInputStream.read(buffer)將輸入流的內容讀到buffer中。 1. 創建一個輸出流 FileOutputStream outputStream = openFileOutput("xzhang76.txt", MODE_PRIVATE); 然后寫入內容 outputStream.write(content.getBytes()); outputStream.close(); 2. 創建一個輸入流 FileInputStream inputStream = openFileInput("xzhang76.txt"); 然后從文件中讀取并寫入內容到ByteArrayOutputStream對象: ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while((len=inputStream.read(buffer))!=-1){ //從文件中讀取內容到buffer中 outputStream.write(buffer, 0, len); //把buffer寫入到outputStream }查看全部
-
權限與文件存儲路徑 MODE_PRIVATE - 為默認操作模式,代表該文件是私有數據,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原文件的內容。 MODE_APPEND - 模式會檢查文件是否存在,存在就往文件追加內容,否則就創建新文件。 MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE - 用來控制其他應用是否有權限讀寫該文件 MODE_WORLD_READABLE - 表示當前文件可以被其他應用讀取 MODE_WORLD_WRITEABLE - 表示當前文件可以被其他應用寫入查看全部
-
Android中文件存儲的操作 1.Activity的openFileOutput()方法可以把數據輸出到文件中 2.創建的文件保存在/data/data/<package name>/files目錄 3.實現過程與在java中保存數據到文件中是一樣的 new File("/mnt/sdcard/test"); 路徑指向安卓自帶的目錄,指向SD卡。 new File("/mnt/extsdcard/test"); 指向外存儲卡。 <!-- 在SD卡中創建與刪除文件權限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!-- 向SD卡寫入數據權限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 圖中為文件的創建和刪除查看全部
舉報
0/150
提交
取消