<video id="qgh8k"><bdo id="qgh8k"></bdo></video>
  1. <source id="qgh8k"><mark id="qgh8k"><big id="qgh8k"></big></mark></source>
      <source id="qgh8k"><menu id="qgh8k"><ins id="qgh8k"></ins></menu></source>
        1. <i id="qgh8k"></i>
            <acronym id="qgh8k"></acronym>
          <rp id="qgh8k"><bdo id="qgh8k"><pre id="qgh8k"></pre></bdo></rp>

          android軟件開發廣播(android系統廣播有哪些)

          軟件開發 513
          今天給各位分享android軟件開發廣播的知識,其中也會對android系統廣播有哪些進行解釋,如果能碰巧解決你現在面臨的問題,別忘了關注本站,現在開始吧!本文目錄一覽: 1、android 7.0對開發者會有哪些影響

          今天給各位分享android軟件開發廣播的知識,其中也會對android系統廣播有哪些進行解釋,如果能碰巧解決你現在面臨的問題,別忘了關注本站,現在開始吧!

          本文目錄一覽:

          android 7.0對開發者會有哪些影響

          Android N 除了提供諸多新特性和功能外,還對系統和 API 行為做出了各種變更。 本文重點介紹您應該了解并在開發應用時加以考慮的一些重要變更。

          如果您之前發布過 Android 應用,請注意您的應用可能受到這些平臺變更的影響。

          電池和內存

          Android N 包括旨在延長設備電池壽命和減少 RAM 使用的系統行為變更。 這些變更可能會影響您的應用訪問系統資源,以及您的系統通過特定隱式 Intent 與其他應用互動的方式。

          低電耗模式

          Android 6.0(API 級別

          23)引入了低電耗模式,當用戶設備未插接電源、處于靜止狀態且屏幕關閉時,該模式會推遲 CPU 和網絡活動,從而延長電池壽命。而 Android N

          則通過在設備未插接電源且屏幕關閉狀態下、但不一定要處于靜止狀態(例如用戶外出時把手持式設備裝在口袋里)時應用部分 CPU

          和網絡限制,進一步增強了低電耗模式。

          圖 1. 低電耗模式如何應用第一級系統活動限制以延長電池壽命的圖示。

          當設備處于充電狀態且屏幕已關閉一定時間后,設備會進入低電耗模式并應用第一部分限制: 關閉應用網絡訪問、推遲作業和同步。 如果進入低電耗模式后設備處于靜止狀態達到一定時間,系統則會對 PowerManager.WakeLock、AlarmManager 鬧鈴、GPS

          和 Wi-Fi 掃描應用余下的低電耗模式限制。 無論是應用部分還是全部低電耗模式限制,系統都會喚醒設備以提供簡短的維護時間窗口,在此窗口期間,應用程序可以訪問網絡并執行任何被推遲的作業/同步。

          圖 2. 低電耗模式如何在設備處于靜止狀態達到一定時間后應用第二級系統活動限制的圖示。

          請注意,激活屏幕或插接設備電源時,系統將退出低電耗模式并取消這些處理限制。 此項新增的行為不會影響有關使您的應用適應 Android 6.0(API 級別 23)中所推出的舊版本低電耗模式的建議和最佳實踐,如低電耗模式和應用待機模式優化中所討論。

          您仍應遵循這些建議(例如使用 Google Cloud Messaging (GCM) 發送和接收消息)并開始安排更新計劃以適應新增的低電耗模式行為。

          Project Svelte:后臺優化

          Android N 刪除了三項隱式廣播,以幫助優化內存使用和電量消耗。 此項變更很有必要,因為隱式廣播會在后臺頻繁啟動已注冊偵聽這些廣播的應用。 刪除這些廣播可以顯著提升設備性能和用戶體驗。

          移動設備會經歷頻繁的連接變更,例如在 Wi-Fi 和移動數據之間切換時。 目前,可以通過在應用清單中注冊一個接收器來偵聽隱式 CONNECTIVITY_ACTION廣播,讓應用能夠監控這些變更。

          由于很多應用會注冊接收此廣播,因此單次網絡切換即會導致所有應用被喚醒并同時處理此廣播。

          同理,應用可以注冊接收來自其他應用(例如相機)的隱式 ACTION_NEW_PICTURE 和 ACTION_NEW_VIDEO 廣播。

          當用戶使用相機應用拍攝照片時,這些應用即會被喚醒以處理廣播。

          為緩解這些問題,Android N 應用了以下優化措施:

          面向 Android N 開發的應用不會收到 CONNECTIVITY_ACTION 廣播,即使它們已有清單條目來請求接受這些事件的通知。

          在前臺運行的應用如果使用BroadcastReceiver 請求接收通知,則仍可以在主線程中偵聽 CONNECTIVITY_CHANGE。

          應用無法發送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 廣播。此項優化會影響所有應用,而不僅僅是面向

          Android N 的應用。

          如果您的應用使用任何 Intent,您仍需要盡快移除它們的依賴關系,以正確適配 Android N 設備。 Android 框架提供多個解決方案來緩解對這些隱式廣播的需求。 例如,JobScheduler API

          提供了一個穩健可靠的機制來安排滿足指定條件(例如連入無限流量網絡)時所執行的網絡操作。 您甚至可以使用JobScheduler 來適應內容提供程序變化。

          如需了解有關 Android N 中后臺優化以及如何改寫應用的詳細信息,請參閱后臺優化。

          權限更改

          Android N 做了一些權限更改,這些更改可能會影響您的應用。

          系統權限更改

          為了提高私有文件的安全性,面向 Android N 或更高版本的應用私有目錄被限制訪問 (0700)。 此設置可防止私有文件的元數據泄漏,如它們的大小或存在。 此權限更改有多重副作用:

          私有文件的文件權限不應再由所有者放寬,為使用 MODE_WORLD_READABLE 和/或 MODE_WORLD_WRITEABLE 而進行的此類嘗試將觸發SecurityException。

          注:迄今為止,這種限制尚不能完全執行。 應用仍可能使用原生 API 或 File API 來修改它們的私有目錄權限。 但是,我們強烈反對放寬私有目錄的權限。

          傳遞軟件包網域外的 file:// URI 可能給接收器留下無法訪問的路徑。 因此,嘗試傳遞 file:// URI 會觸發 FileUriExposedException。 分享私有文件內容的推薦方法是使用 FileProvider。

          DownloadManager 不再按文件名分享私人存儲的文件。

          舊版應用在訪問 COLUMN_LOCAL_FILENAME 時可能出現無法訪問的路徑。

          面向 Android N 或更高版本的應用在嘗試訪問 COLUMN_LOCAL_FILENAME 時會觸發 SecurityException。

          通過使用DownloadManager.Request.setDestinationInExternalFilesDir() 或 DownloadManager.Request.setDestinationInExternalPublicDir() 將下載位置設置為公共位置的舊版應用仍可以訪問 COLUMN_LOCAL_FILENAME 中的路徑,但是我們強烈反對使用這種方法。

          訪問由 DownloadManager 公開的文件的首選方式是使用 ContentResolver.openFileDescriptor()。

          應用間共享文件

          對于面向 Android N 的應用,Android 框架執行的 StrictMode API

          政策禁止向您的應用外公開 file:// URI。 如果一項包含文件 URI 的 Intent 離開您的應用,應用失敗,并出現 FileUriExposedException 異常。

          若要在應用間共享文件,您應發送一項 content:// URI,并授予 URI 臨時訪問權限。 進行此授權的最簡單方式是使用 FileProvider 類。

          如需有關權限和共享文件的更多信息,請參閱共享文件。

          無障礙改進

          為提高平臺對于視力不佳或視力受損用戶的可用性,Android N 做出了一些更改。這些更改一般并不要求更改您的應用代碼,不過您應仔細檢查并使用您的應用測試這些功能,以評估它們對用戶體驗的潛在影響。

          屏幕縮放

          Android N 支持用戶設置顯示尺寸,以放大或縮小屏幕上的所有元素,從而提升設備對視力不佳用戶的可訪問性。用戶無法將屏幕縮放至低于最小屏幕寬度 sw320dp,該寬度是

          Nexus 4 的寬度,也是常規中等大小手機的寬度。

          圖 3. 右側屏幕顯示的是一臺運行 Android N 系統映像的設備增大顯示尺寸后的效果。

          當設備密度發生更改時,系統會以如下方式通知正在運行的應用:

          如果是面向 API 級別 23 或更低版本系統的應用,系統會自動終止其所有后臺進程。 這意味著如果用戶切換離開此類應用,轉而打開“Settings”屏幕并更改 Display size 設置,則系統會像處理內存不足的情況一樣終止該應用。 如果應用具有任何前臺進程,則系統會如處理運行時變更中所述將配置變更通知給這些進程,就像對待設備屏幕方向變更一樣。

          如果是面向 Android N 的應用,則其所有進程(前臺和后臺)都會收到有關配置變更的通知,如處理運行時變更中所述。

          大多數應用并不需要進行任何更改即可支持此功能,不過前提是這些應用遵循 Android 最佳實踐。具體要檢查的事項:

          在屏幕寬度為 sw320dp 的設備上測試您的應用,并確保其充分運行。

          當設備配置發生變更時,更新任何與密度相關的緩存信息,例如緩存位圖或從網絡加載的資源。當應用從暫停狀態恢復運行時,檢查配置變更。

          注:如果您要緩存與配置相關的數據,則最好也包括相關元數據,例如該數據對應的屏幕尺寸或像素密度。 保存這些元數據便于您在配置變更后決定是否需要刷新緩存數據。

          避免用像素單位指定尺寸,因為像素不會隨屏幕密度縮放。應改為使用與密度無關像素 (dp)

          單位指定尺寸。

          設置向導中的視覺設置

          Android N 在“Welcome”屏幕中加入了“Vision Settings”,用戶可以在新設備上設置以下無障礙功能設置: Magnification gesture、Font size、Display size 和 TalkBack。 此項變更增強了與不同屏幕設置相關的錯誤的可見性。

          要評估此功能的影響,您應在啟用這些設置的狀態下測試應用。 您可以在Settings Accessibility 中找到這些設置。

          NDK 應用鏈接至平臺庫

          Android N 做了一些命名空間更改,以阻止加載非公開 API。 如果您使用 NDK,則只能使用 Android 平臺提供的公開 API。 在下一個官方發布的 Android 版本上使用非公開 API 會導致應用崩潰。

          為提醒您使用了非公開 API,在 Android N

          設備上運行的應用會在有應用調用非公開 API 時在日志消息輸出中生成一個錯誤。

          此錯誤還會作為消息顯示在設備屏幕上,以幫助增強您對此情況的認識。 您應檢查應用代碼以刪除使用非公開平臺

          API,并使用預覽版設備或模擬器全面測試應用。

          如果您的應用依賴平臺庫,則請參見 NDK 文檔,了解使用公開 API 等效項替換普通私有 API 的典型修復。 您還可以鏈接至平臺庫,而無需實現此應用,如果應用使用的庫是平臺的一部分(例如 libpng),但不屬于 NDK,則更可如此。 此情況下,請確保您的 APK 包含您打算鏈接到的所有 .so 文件。

          注意:有些第三方庫可能會鏈接至非公開 API。 如果您的應用使用這些庫,那么當您的應用在下一個官方發布的 Android 版本上運行時可能會出現崩潰現象。

          應用不應依賴或使用不屬于 NDK

          的原生庫,因為這些庫可能會發生更改或從一個 Android 版本遷移至另一版本。 例如,從 OpenSSL 切換至 BoringSSL

          即屬于此類更改。 此外,不同的設備可能提供不同級別的兼容性,因為不屬于 NDK 中的平臺庫沒有兼容性要求。 如果您必須在較舊設備上訪問非 NDK

          庫,則請依據 Android API 級別進行加載。

          為幫助您診斷此類問題,下面列舉了一些在您試圖使用 Android N 開發應用時可能遇到的 Java 和 NDK 錯誤:

          Java 錯誤示例:

          java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so"

          is not accessible for the namespace "classloader-namespace"

          NDK 錯誤示例:

          dlopen failed: cannot locate symbol "__system_property_get" referenced by ...

          以下是遇到這類錯誤的應用的一些典型修復:

          可以使用標準 JNI 函數來替代使用 libandroid_runtime.so 中的 getJavaVM 和 getJNIEnv:

          AndroidRuntime::getJavaVM - GetJavaVM from jni.h

          AndroidRuntime::getJNIEnv - JavaVM::GetEnv or

          JavaVM::AttachCurrentThread from jni.h.

          可以使用公開 alternative __system_property_get 來替代使用 libcutils.so 中的 property_get 符號。如需這樣做,請使用__system_property_get 及以下 include 函數:

          #include sys/system_properties.h

          應使用應用本地版本來替代使用 libcrypto.so 中的 SSL_ctrl 符號。例如,您應在 .so 文件中靜態鏈接 libcyrpto.a,或者在應用中包含您自己的來自 BoringSSL 或 OpenSSL 的動態 libcrypto.so。

          Android for Work

          Android N 包含一些針對面向 Android

          for Work 的應用的變更,包括對證書安裝、密碼重置、二級用戶管理、設備標識符訪問權限的變更。如果您是要針對 Android for

          Work 環境開發應用,則應仔細檢查這些變更并相應地修改您的應用。

          您必須先安裝授權證書安裝程序,然后 DPC 才能對其進行設置。 對于面向 N SDK 的個人資料和設備所有者應用,您應在設備策略控制器 (DPC) 調用DevicePolicyManager.setCertInstallerPackage() 之前安裝授權證書安裝程序。 如果尚未安裝此安裝程序,則系統會引發IllegalArgumentException。

          針對設備管理員的重置密碼限制現在也適用于個人資料所有者。 設備管理員無法再使用 DevicePolicyManager.resetPassword() 來清除或更改已經設置的密碼。 設備管理員仍可以設置密碼,但只能在設備沒有密碼、PIN 或圖案時這樣做。

          即使設置了限制,設備所有者和個人資料所有者仍可以管理帳戶。而且,即使具有 DISALLOW_MODIFY_ACCOUNTS 用戶限制,設備所有者和個人資料所有者仍可調用 Account Management API。

          設備所有者可以更輕松地管理二級用戶。當設備在設備所有者模式下運行時,系統將自動設置 DISALLOW_ADD_USER 限制。 這樣可以防止用戶創建非托管二級用戶。 此外,CreateUser() 和 createAndInitializeUser() 方法已棄用,取而代之的是 DevicePolicyManager.createAndManageUser() 方法。

          設備所有者可以訪問設備標識符。設備所有者可以使用 DevicePolicyManagewr.getWifiMacAddress() 訪問設備的 Wi-Fi MAC 地址。 如果設備上從未啟用 Wi-Fi,則此方法將返回一個 null 值。

          工作模式設置控制工作應用訪問。當工作模式關閉時,系統啟動器通過使工作應用顯示為灰色來指示它們不可用。 啟用工作模式會再次恢復正常行為。

          如需了解有關 Android N 中針對 Android for Work 所做變更的詳細信息,請參閱 Android for

          Work 更新。

          注解保留

          Android N 在注解可見性被忽略時修復錯誤。這種問題將啟用本不應被允許的運行時訪問注解。 這些注解包括:

          VISIBILITY_BUILD:僅應編譯時可見。

          VISIBILITY_SYSTEM:運行時應可見,但僅限基本系統。

          如果您的應用依賴這種行為,請在注解中添加一項運行時必須可用的保留政策。 您可通過使用 @Retention(RetentionPolicy.RUNTIME) 來如此做。

          其他重要說明

          如果一個應用在 Android N 上運行,但卻是針對更低 API 級別開發的,那么在用戶更改顯示尺寸時,系統將終止此應用進程。 應用必須能夠正常處理此情景。 否則,當用戶從最近使用記錄中恢復運行應用時,應用將會出現崩潰現象。

          您應測試應用以確保不會發生此行為。要進行此測試,您可以通過 DDMS 手動終止應用,以造成相同的崩潰現象。

          在密度發生更改時,系統不會自動終止面向 N 及更高版本的應用;不過,這些應用仍可能對配置變更做出不良響應。

          Android N 上的應用應能夠正常處理配置變更,并且在后續啟動時不會出現崩潰現象。您可以通過更改字體大小 (Setting Display Font size) 并隨后從最近使用記錄中恢復運行應用,來驗證應用行為。

          由于之前的 Android 版本中的一項錯誤,系統未能將對主線程上的一個 TCP 套接字的寫入操作舉報為嚴格模式違反。 Android N 修復了此錯誤。呈現出這種行為的應用引發 android.os.NetworkOnMainThreadException。一般情況下,我們不建議在主線程上執行網絡操作,因為這些操作通常都有可能導致 ANR 和卡頓的高尾延遲。

          Debug.startMethodTracing() 方法族現在默認在您的共享的存儲空間上的軟件包特定目錄中存儲輸出,而非 SD 卡頂級。 這意味著應用不再需要請求WRITE_EXTERNAL_STORAGE 使用這些 API 的權限。

          許多平臺 API 現在開始檢查在 Binder 事務間發送的大負載,系統現在會將 TransactionTooLargeExceptions 再次作為 RuntimeExceptions 引發,而不再只是默默記錄或抑制它們。

          一個常見例子是在 Activity.onSaveInstanceState() 上存儲過多數據,導致 ActivityThread.StopInfo 在您的應用面向

          Android N 時引發 RuntimeException。

          如果應用向 View 發布 Runnable 任務,并且 View 未附加到窗口,系統會用 View 為 Runnable 任務排隊;在 View 附加到窗口之前,Runnable 任務不會執行。

          此行為會修復以下錯誤:

          如果一項應用是從并非預期窗口 UI 線程的其他線程發布到 View,則Runnable 可能會因此運行錯誤的線程。

          如果 Runnable 任務是從并非環路線程的其他線程發布,則應用可能會曝光 Runnable 任務。

          如果 Android N 上一項有 DELETE_PACKAGES 權限的應用嘗試刪除一個軟件包,但另一項應用已經安裝了這個軟件包,則系統可能要求用戶確認。

          在這種情況下,應用在調用 PackageInstaller.uninstall() 時的返回狀態應為 STATUS_PENDING_USER_ACTION。

          android開發一般都使用什么框架

          Android開發框架介紹

          編輯文檔

          學分 +2

          開發框架方面包含基本的應用功能開發、數據存儲、網絡訪問這三大塊:

          一、應用方面

          一般而言一個標準的Android程序由如下4部分組成即Activity、Broadcast Intent Receiver、Service、Content Provider: 1. Activity是最頻繁、最基本的模塊,在Android中,一個Activity就是手機上一屏,相當于一個網頁一樣,所不同的是,每個Activity運行結束了,有個返回值,類似一個函數一樣。Android系統會自動記錄從首頁到其他頁面的所有跳轉記錄并且自動將以前的Activity壓入系統堆棧,用戶可以通過編程的方式刪除歷史堆棧中的Activity Instance。

          Activity類中主要是跟界面資源文件關聯起來(res/layout目錄下的xml資源,也可以不含任何界面資源),內部包含控件的顯示設計、界面交互設計、事件的響應設計以及數據處理設計、導航設計等application設計的方方面面。 2. Broadcast Intent Receiver

          Intent提供了各種不同Activity進行跳轉的機制,譬如如果從A activity跳轉到B activity,使用Intent來實現如下: Intent in = new Intent(A.this, B.class); startActivity(in);

          BroadcastReceiver提供了各種不同的Android應用程序進行進行進程間通訊的機制,譬如當電話呼叫來臨時,可以通過BroadcastReceiver發布廣播消息。對于用戶而言,BroadcastReceiver是不透明的,用戶無法看到這個事件,BroadcastReceiver通過NotificationManager來通知用戶這些事件發生了,它既可以在資源AndroidManifest.xml中注冊,也可以在代碼中通過Context.registerReceiver()進行注冊,只要是注冊了,當事件來臨的時候,即時程序沒有啟動,系統也在需要的時候會自動啟動此應用程序;另外各應用程序很方便地通過Context.sendBroadcast()將自己的事情廣播給其他應用程序;

          3. Service,跟Windows當中的Service完全是一個概念,用戶可以通過startService(Intent service)啟動一個Service,也可通過Context.bindService來綁定一個Service.

          4. Content Provider,由于Android應用程序內部的數據都是私有的,Content Provider提供了應用程序之間數據交換的機制,一個程序可以通過實現一個ContentProvider的抽象接口將自己的數據暴露出去,并且隱蔽了具體的數據存儲實現,標準的ContentProvider提供了基本的CRUD(Create,Read,Update,Delete)的接口,并且實現了權限機制,保護了數據交互的安全性; 一個標準的Android應用程序的工程文件包含如下幾大部分: - Java源代碼部分(包含Activity),都在src目錄當中;

          - R.java文件,這個文件是Eclipse自動生成與維護的,開發者不需要修改,提供了Android對的資源全局索引; - Android Library,這個是應用運行的Android庫;

          - assets目錄,這個目錄里面主要用與放置多媒體等一些文件;

          - res目錄,放置的是資源文件,跟VC中的資源目錄基本類似,其中的drawable包含的是圖片文件,layout里面包含的是布局文件,values目錄里面主要包含的是字符串(strings.xml)、顏色(colors.xml)以及數組(arrays.xml)資源;

          - AndroidManifest.xml,這個文件異常重要,是整個應用的配置文件,在這個文件中,需要聲明所有用到的Activity、Service、Receiver等。

          安卓廣播接收器怎么判斷是哪個應用發送的?想要只接收自身應用廣播,怎么實現?

          安卓廣播接收器Intent,它有提供過濾器功能,也就是開發者定義過濾條件,只有是這個條件的廣播才接收,這樣就可以接收指定廣播。這也是安卓廣播的基礎知識功能,具體自己查閱相關資料,很簡單的。

          我用eclipse開發android里的一個播放器軟件,運行出現Unable to start service Intent not found 錯誤

          你這里應該有兩點問題:

          1.manifest里的service/service標簽有 intent-fliter和actio等子標簽,

          注意:intent-fliter和actio等子標簽是對于廣播接收receiver的,不是針對服務service的,所以去掉intent-fliter等子標簽。改成:Service android:name=".Music" /Service 就行了。

          2. 在叫PlayService類的Activity中,

          按鈕事件中的:

          startService(new Intent("com.PlayService.test.START_AUDIO_SERVICE"));

          就要相應的該為:

          startService(new Intent(PlayService.this,Music.class));

          你要注意service和receiver這兩個標簽的區別哦!

          Android軟件開發主要是學習什么的?

          近半年來,手機的安卓系統與ios系統是目前主流的手機系統,Android軟件開發主要是學習什么的?IT培訓發現安卓開發的技術很多的,如果想一次性學好是不實際的,但下面這些基礎還是要學好的。

          1、Activity生命周期

          雖然Android中有四大組件,但是不可否認Activity是最常用的。所以熟練掌握Android的生命周期是必須的。其實生命周期就是記住Activity的那些方法在什么時候被系統調用,這樣才可以把對應的邏輯代碼寫到合適的方法內部去。

          至于服務和廣播組件可以稍微緩一下,到實際使用的時候再學習都可以。

          2、界面開發技術

          界面開發是一種基本的技術,幾乎所有的程序里面都需要用到。在Android開發中界面開發分為3種:

          1)使用xml文件布局

          使用xml首先對于界面進行布局,然后在Activity里面進行引用是最常見的應用軟件開發技術,這種方式使用的最大,需要學習的內容也最多。學習時需要熟悉:

          a)五種Layout布局

          深刻理解五種布局組織控件的方式是一個基本的基礎,這樣你才可以在實際的界面中靈活的使用每種布局結構,構造出需要的界面。

          b)常用控件

          控件有很多,至少要知道每種控件是做什么的,至于里面的特定參數和方法可以學要的時候再去查

          c)界面美化

          系統的控件很多時候無法滿足要求,需要通過添加背景更換圖片等進行美化,要熟悉每種控件如何去美化。

          掌握了上面的內容,通過布局的嵌套就可以制作出各種界面,如果在熟悉include的使用就可以減少xml的重復,方便后期的修改和維護了。

          2)使用代碼動態創建

          有些時候需要動態的創建一些布局和控件,這個就需要使用LayoutInflater去創建一些動態的界面了。

          3)自己繪制界面

          游戲中常用,繼承SurfaceView自己繪制。

          3、數據存儲技術

          Android中的數據存儲方式有3種:

          1)SharedPrefereneces存儲

          對于簡單的數據可以使用該方式存儲,以鍵值對的方式存儲一些基本的數據。

          2)文件存儲

          將數據以文件的形式存儲,可以是手機自身的存儲也可以是SD卡,文件的數據格式自己定義。

          3)SQLite數據庫存儲

          使用標準SQL語句進行操作,復雜數據的首選。

          4、網絡編程

          現在的Android程序不需要聯網的已經不多了。所以網絡編程也是必須的,一般的公司都會封裝有自己的聯網結構,但是基本的聯網還是要熟悉。

          1)HTTP聯網

          使用Http聯網+Json數據格式是現在很多客戶端的首選。

          2)Socket聯網

          至于藍牙等連接方式則可以在項目需要的時候學習。

          對于手機的系統功能,如撥打電話、發送短信、讀取系統參數等則可以根據需要在學習,不麻煩的。

          其次,手機軟件相關

          Android開發不同于普通的電腦軟件開發,需要了解手機的操作習慣,知道手機的屏幕不大、內存有限,電池有限等,在實際開發和設計時盡量考慮。

          為什么Android要使用各種BroadcastReceiver

          作為Android四大組件之一的BroadcastReceiver(廣播接收者),同Activity(活動)一樣,經常被大家用到,網上也是一堆對它的講解,那么為什么Android要用廣播接收者這種機制呢?

          廣播分為:普通廣播和有序廣播

          1.Normal broadcasts(普通廣播):Normal broadcasts是完全異步的可以同一時間被所有的接收者接收到。消息的傳遞效率比較高。但缺點是接收者不能將接收的消息的處理信息傳遞給下一個接收者也不能停止消息的傳播??梢岳肅ontext.sendBroadcast發送。

          2.Ordered broadcasts(有序廣播):Ordered broadcasts的接收者按照一定的優先級進行消息的接收。一次傳送到一個接收器。 隨著每個接收器依次執行,它可以將結果傳播到下一個接收器,或者它可以完全中止廣播,使得它不會被傳遞到其他接收器。 命令接收器運行可以用匹配的意圖過濾器的android:priority屬性控制; 具有相同優先級的接收器將以任意順序運行??梢岳肅ontext.sendOrderedBroadcast發送。

          官網上介紹廣播是用的監聽系統網絡狀況的例子,其實關鍵字在于“監聽”。

          (1) 創建廣播接收者

          BroadcastReceiver是一個抽象類,所以我們要創建自己的廣播接收者就要繼承它,繼承后會有提示重寫onReceive方法。

          public class NetworkBroadcastReceiver extends BroadcastReceiver {

          @Override

          public void onReceive(Context context, Intent intent) {

          if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {

          ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

          NetworkInfo activeNetwork = manager.getActiveNetworkInfo();

          if (activeNetwork != null activeNetwork.isAvailable()) {

          Toast.makeText(context, "有網絡連接", Toast.LENGTH_SHORT).show();

          } else {

          Toast.makeText(context, "無網絡連接", Toast.LENGTH_SHORT).show();

          }

          }

          }

          }

          廣播接收者的生命周期是從接收廣播開始,到onRecevier方法執行完成結束,時間很短,一般不允許處理大批量耗時操作。這里順便給出打印NetworkInfo的信息以供參考:

          NetworkInfo:

          type: WIFI[,type_ext: WIFI],

          state: CONNECTED/CONNECTED,

          reason: (unspecified),

          extra: "TP-LINK_EFE8",

          roaming: false,

          failover: false,

          isAvailable: true,

          isConnectedToProvisioningNetwork: false,

          isIpv4Connected: true,

          isIpv6Connected: false

          [type: MOBILE[LTE],

          state: CONNECTED/CONNECTED,

          reason: connected,

          extra: cmnet,

          roaming: false,

          failover: false,

          isAvailable: true,

          isConnectedToProvisioningNetwork: false]

          (2) 靜態注冊廣播

          靜態注冊廣播,需要在AndroidManifest.xml中,添加recevier/ 標簽,將廣播接收者注冊到應用中。要添加過濾器IntentFilter,由于系統網絡變化時會發送ConnectivityManager.CONNECTIVITY_ACTION ("android.net.conn.CONNECTIVITY_CHANGE")的廣播,所以我們要監聽這條廣播。

          receiver android:name=".NetworkBroadcastReceiver"

          intent-filter android:priority="1000"

          action android:name="android.net.conn.CONNECTIVITY_CHANGE"/

          /intent-filter

          /receiver

          這里priority代表的是執行順序的優先級,取值[-1000,1000],后面的有序廣播會講到。

          (3) 動態注冊廣播

          i.意圖過濾器 IntentFilter 用于給BroadcastReceiver綁定監聽廣播類型

          ii.自定義的BroadcastReceiver,例如上文的NetworkChangeBroadcastReceiver

          iii.注冊方法 Context.registerReceiver(Receiver, IntentFilter)

          iv.反注冊方法 unregisterReceiver(Receiver)

          IntentFilter mFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);

          NetworkChangeBroadcastReceiver mReceiver = new NetworkChangeBroadcastReceiver();

          registerReceiver(mReceiver, mFilter);

          @Override

          public void onDestroy() {

          super.onDestroy();

          unregisterReceiver(mReceiver);

          }

          這段代碼是成對出現的,可以在onCreate的時候注冊,在onDestroy的時候反注冊,也可以在onResume和onPause中執行這寫方法。不過Google API推薦的做法,在activity的onResume()中注冊,在onPause()反注冊。效果是當界面pause時,就不接收廣播,從而減少不必要的系統開銷。還有就是一定要主動反注冊你的廣播,否則會出現異常。

          動態注冊和靜態注冊的差別:動態注冊后,廣播接收者會依賴Activity的生命周期,而靜態注冊的廣播不會,只要是系統有發出的廣播,它都會接收,與程序是否啟動無關。

          (4) 發送普通廣播

          具體使用的方法是sendBroadcast(Intent intent),通過隱式調用就可以,注意action是你自定義的,意思就是不可以發送系統廣播,我試了,直接就崩了。

          Intent intent = new Intent();

          intent.setAction("com.fleming.chen.mybroadcast");

          sendBroadcast(intent);

          針對(3)(4)兩點,如果你要用到的廣播僅僅是應用里的,那么你可以用LocalBroadcastManager這個類,它與上述描述中的區別在于:

          LocalBroadcastManager.getInstance(context).registerReceiver(mReceiver, mFilter);

          LocalBroadcastManager.getInstance(context).unregisterReceiver(mReceiver);

          LocalBroadcastManager.getInstance(context).sendBroadcast(intent);

          通過sendBroadcast發送的廣播,不會被通過LocalBroadcastManager類注冊的廣播接收者接收,反之也是如此,兩者是不可以”互通友誼“的,推薦使用LocalBroadcastManager來管理廣播。

          (5) 發送有序廣播

          上面講了那么多都是普通廣播,那什么又是有序廣播呢?

          有序廣播關鍵在于這類廣播是有序的,上文中提到priority,這是IntentFilter的屬性,用來讓不同的廣播擁有不同的執行順序,即優先級不同。

          定義三種不同優先級的廣播接收者:

          public class MyBroadcastReceiver extends BroadcastReceiver {

          @Override

          public void onReceive(Context context, Intent intent) {

          if (intent.getAction().equals("com.fleming.chen.myreceiver")) {

          String message = getResultData();

          Toast.makeText(context, message, Toast.LENGTH_SHORT).show();

          setResultData("這是修改后的數據");//第一個接收后處理一下,再交給下一個

          }

          }

          }

          public class MyBroadcastReceiver2 extends BroadcastReceiver {

          @Override

          public void onReceive(Context context, Intent intent) {

          if (intent.getAction().equals("com.fleming.chen.myreceiver")) {

          String message = getResultData();//得到上一個的處理結果

          Toast.makeText(context, message, Toast.LENGTH_SHORT).show();

          abortBroadcast();//主動停止廣播,不再繼續傳下去

          }

          }

          }

          public class MyBroadcastReceiver3 extends BroadcastReceiver {

          @Override

          public void onReceive(Context context, Intent intent) {

          if (intent.getAction().equals("com.fleming.chen.myreceiver")) {

          //此時雖然該廣播接收者也監聽了,不過也沒有內容

          Toast.makeText(context, getResultData(), Toast.LENGTH_SHORT).show();

          }

          }

          }

          receiver android:name=".MyBroadcastReceiver"

          intent-filter android:priority="1000"

          action android:name="com.fleming.chen.myreceiver"/

          /intent-filter

          /receiver

          receiver android:name=".MyBroadcastReceiver2"

          intent-filter android:priority="0"

          action android:name="com.fleming.chen.myreceiver"/

          /intent-filter

          /receiver

          receiver android:name=".MyBroadcastReceiver3"

          intent-filter android:priority="-1000"

          action android:name="com.fleming.chen.myreceiver"/

          /intent-filter

          /receiver

          Intent intent = new Intent();

          intent.setAction("com.fleming.chen.myreceiver");

          sendOrderedBroadcast(intent, null, null, null, 0, "這是初始的數據", null);

          對于廣播的內容,在Android 7.0上做了修改,即Project Svelte:后臺優化

          Android 7.0 移除了三項隱式廣播,以幫助優化內存使用和電量消耗。此項變更很有必要,因為隱式廣播會在后臺頻繁啟動已注冊偵聽這些廣播的應用。刪除這些廣播可以顯著提升設備性能和用戶體驗。

          移動設備會經歷頻繁的連接變更,例如在 WLAN 和移動數據之間切換時。目前,可以通過在應用清單中注冊一個接收器來偵聽隱式 CONNECTIVITY_ACTION 廣播,讓應用能夠監控這些變更。由于很多應用會注冊接收此廣播,因此單次網絡切換即會導致所有應用被喚醒并同時處理此廣播。

          同理,在之前版本的 Android 中,應用可以注冊接收來自其他應用(例如相機)的隱式 ACTION_NEW_PICTURE 和 ACTION_NEW_VIDEO 廣播。當用戶使用相機應用拍攝照片時,這些應用即會被喚醒以處理廣播。

          為緩解這些問題,Android 7.0 應用了以下優化措施:

          面向 Android 7.0 開發的應用不會收到 CONNECTIVITY_ACTION 廣播,即使它們已有清單條目來請求接受這些事件的通知。在前臺運行的應用如果使用 BroadcastReceiver 請求接收通知,則仍可以在主線程中偵聽 CONNECTIVITY_CHANGE。

          應用無法發送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 廣播。此項優化會影響所有應用,而不僅僅是面向 Android 7.0 的應用。

          如果您的應用使用任何 intent,您仍需要盡快移除它們的依賴關系,以正確適配 Android 7.0 設備。Android 框架提供多個解決方案來緩解對這些隱式廣播的需求。例如,JobScheduler API 提供了一個穩健可靠的機制來安排滿足指定條件(例如連入無限流量網絡)時所執行的網絡操作。您甚至可以使用 JobScheduler 來適應內容提供程序變化。

          所以說,在Android的世界,到處都充滿著廣播,就是為了用來監聽手機的各種狀態,給用戶提醒,這是一種很好的用戶體驗,不過任何事情都是如此,廣播也不可以多用哦,

          關于android軟件開發廣播和android系統廣播有哪些的介紹到此就結束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關注本站。

          掃碼二維碼
          日韩在线视频首页
            <video id="qgh8k"><bdo id="qgh8k"></bdo></video>
          1. <source id="qgh8k"><mark id="qgh8k"><big id="qgh8k"></big></mark></source>
              <source id="qgh8k"><menu id="qgh8k"><ins id="qgh8k"></ins></menu></source>
                1. <i id="qgh8k"></i>
                    <acronym id="qgh8k"></acronym>
                  <rp id="qgh8k"><bdo id="qgh8k"><pre id="qgh8k"></pre></bdo></rp>