原文地址:Sony Notification APIcss
Notifaciton是Smart Extension API的一部分。Notification引擎收集不一樣來源的事件數據到同一個位置,供配件主應用訪問,主應用沒必要去訪問各個不一樣的數據源。 事件數據的一個例子是社交網絡上的活動流,新的短信和彩信提醒,未接來電提醒,等等。android
應用開發者想在配件上展現事件數據,須要按照Notification API的規則嚮應用提供數據。數據庫
下圖顯示了Notification API的位置後端
Notification API使用Android ContentProvider來定義和實現,並用數據庫來存放數據。Extension想跟Notificaiton API交互,必須使用註冊API向Extension表中插入相關數據。必要時, 會向Extension發送Intent以執行某項任務。安全
Extension使用Notification API規定的格式來提供數據。Extension做爲獨立的Android應用,隨時可能被卸載或禁用,除非它位置system目錄且操做過程當中隨時可安裝(unless they are part of the system image, and may be installed any time during the operation of the device)。當Extension被禁用時,其數據將不會在配件主應用中顯示。服務器
配件主應用能夠控制並顯示Notification引擎收集的數據。實際應用中,Notification引擎可能不是惟一的數據源。配件主應用能夠讀取全部Extension的數據,甚至能夠更新某些數據字段。因爲這個緣由,須要權限才能讀取數據。網絡
Notification引擎充當用戶感興趣事件的數據中心。使用這種設計的目的是考慮到主應用的性能和安全。跨數據庫的查詢很是慢,可能嚴重影響配件的性能,破壞用戶體驗。當有過多的數據庫時,容許"合法應用"訪問其中的Extension數據,會很是困難以至不可行。注意:Notification引擎的目的不是成爲全部類型數據的倉庫,好比文件、多媒體等等。app
包含如下內容:less
1.概念闡述
2.應用間通訊
3.安全
4.Extension生命週期
5.添加一個數據源
6.獲取事件數據
7.顯示事件的詳細信息
8.聯繫人連接
9.處理圖片
10.性能ide
開發者須要理解關於Notification引擎的數據庫的三個基本概念。
Extension, 是一個Android APK級別的概念。Registration數據庫中的Extension表包含了每一個Extension的元數據。Extension表的目的是向Notification引擎提供必要的數據。而Extension的事件數據多是本身生成的,或者來自其餘的ContentProvider,Web服務器等等。Extension是獨立的應用,能夠有本身的界面,且能夠由主應用(使用Notification引擎)顯示這些數據;或者也能夠沒有界面,徹底依靠主應用來顯示數據。
Source,是邏輯上的抽象。引入這個概念是爲了讓開發者能夠區別不一樣來源的數據,但同時又可將這些來源打包到同一個獨立的APK。一個用例是郵件聚合器Extension,它容許僅使用一個Android程序包就能讓用戶鏈接不一樣的電子郵箱;每一個郵箱都是一個數據源,或者整個Extension自己僅是一個數據源。後者的話,來自不一樣郵箱的郵件能夠顯示在同一個View中而非不一樣的View。Notification.Source存儲了Source相關的屬性信息。主應用可使用Source來過濾事件數據,或者給用戶提供配置項進行Source事件數據過濾。開發者想讓主應用顯示來自不一樣Source的事件,須要添加Notification.Source信息。一個Extension最多能夠關聯8個Source。超過上限將致使拋出異常。一個Source必須跟一個Extension關聯。
Event,表明一個須要顯示給用戶的重要提醒。好比短信提醒,未接電話提醒,社交網絡上朋友們的狀態更新等等。Notification.Event用於保存Extension提供的事件。主應用一般使用Event表中的信息來進行顯示。Event老是來自於Source,但Source並非總有Event。每一個Source最多容許100個Event存放在Notification.Event中。到達上限後,以前的事件會被自動清除。
Extension使用Android ContentResolver API跟Notification引擎的ContentProvider通訊。爲響應用戶輸入,Extension須要實現至少一個BroadcastReceiver來監聽主應用發出的廣播。
Extension可監聽的廣播列表及描述請參考Notification.Intents
爲使用Notification API,Extension必須首先向Extension表中添加信息。添加信息須要特定的權限,詳細內容請參考Registration API。
Extension僅能訪問它本身的數據:增長、刪除、修改、查找它本身存放在Notification引擎中的數據。當先前已註冊爲Extension的應用從Android系統中卸載後,存放在引擎中的數據相應也會自動被刪除。
若是想容許其餘應用訪問當前Extension的數據,可使用shareUserId(不建議這麼作)。當有shareUserId相同的幾個Extension安裝後,Notification引擎的安全機制會認爲它們是同一個Extension。
應用在使用Notification引擎前須要告訴引擎它本身的存在,即註冊。成功註冊後,Notification引擎會認爲該應用是一個Extension。實現上,Extension註冊過程不過是使用註冊API向數據庫中插入幾條關於Extension自身的數據。
從Notification引擎的角度,Extension的生命週期從成功註冊開始,直到從Android系統中卸載結束(或者Extension將本身從系統中反註冊)。在此期間,Extension能夠訪問事件流引擎並從它接收Intent。
如前面所說,Source是一個邏輯抽象概念,便於展現來自於不一樣的後端的事件數據。由開發者肯定如何劃分Extension的事件數據,但全部的事件數據必須跟某個Source產生聯繫,不然插入事件數據的操做會失敗。
應該在Extension成功註冊後、插入任何數據以前設置Source信息。
ContentValues values = new ContentValues(); Builder iconUriBuilder = new Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) .authority(getPackageName()) .appendPath(Integer.toString(R.drawable.icon)); values.put(SourceColumns.NAME, "RSS news feed"); values.put(SourceColumns.ENABLED, "1"); values.put(SourceColumns.ICON_URI_1,iconUriBuilder.toString()); ... uri = cr.insert(Source.URI, values);
可參考Sony AddOn SDK中演示Notification用法的例子: SampleNotificationExtension
Extension能夠週期性地自動從Source獲取事件數據, 或者依賴主應用發出的Intent來觸發獲取數據的過程。
這個Intent名爲REFRESH_REQUEST_INTENT。 若是依賴這個Intent來觸發獲取事件數據的操做,須要定義BroadcastReceiver。程序不該依賴Intent的時間間隔,由於其順序是任意的。固然,主應用啓動時必定會發出一個Intent,Extension能夠利用這一特色。
當Extension有事件數據須要插入到 Notification引擎的ContentProvider中時,能夠用insert(Uri, ContentValues)或bulkInsert(Uri, ContentValues[])。當有大量事件數據須要插入時,考慮到性能問題建議使用後一種方法。
ContentResolver cr = getContentResolver(); ContentValues[] valueArray = new ContentValues[count]; < fill valueArray with data > cr.bulkInsert(Event.URI, valueArray);
從數據源接收到事件數據時,強烈建議Extension也從同一數據源獲取相關的數據更新,好比用戶最近的狀態更新。這種作法能夠最小化網絡流量以及網絡延遲。頻繁的網絡操做會過多地消耗電量。
若是須要週期性地從網絡服務器同步數據,可考慮使用AlarmManager。這裏有一篇博文給出了使用方法。
Notification.Event中提供的的事件數據可能只是一個信息快照(a snapshot of the information),用戶跟主應用上展現的信息交互很是有限。用戶可能想看到事件的詳情並進行操做,好比添加爲喜歡,回覆,或者觀看視頻等等。若是Extension提供在應用內或在網站上的交互,請監聽VIEW_EVENT_INTENT。 當用戶查看事件詳情時主應用會發送這種Intent。該Intent包含特定的事件數據,可讓Extension啓動事件詳情頁面。
圖片的位置是一個字符串。圖片能夠存放在本地SD卡上。
支持如下URI模式:
爲保證數據庫的完整性,Notification引擎會在Extension插入或更新時保證完整性。尤爲是外鍵的完整性。好比,Event的source_id是一個外鍵,它關聯到Source表中的_id列。因此source_id必須是Source表中一個有效的_id。If values for the stated mandatory columns are not provided,將拋出SQLException。
爲了達到最好的性能,建議開發者使用在更新Event Stream ContentProvider時使用bulkInsert或applyBatch方法