Android鎖屏黑屏後連續定位問題解決方案
LocationServiceDemo
該示例主要展示App切換到後臺熄滅螢幕後如何持續獲得裝置位置。
前述
掃一掃安裝
問題說明
小米可以在WLAN高階設定中,設定在息屏情況下關閉wifi,(如果裝置手機流量關閉)導致在亮屏時可以定位,息屏後不能定位的情況。針對此種情況,我們在定位服務中,如果檢測到上述邏輯,則去點亮螢幕。 小米息屏後,WIFI大概在5分鐘之後會斷開,所以我們建議點亮螢幕的時間間隔為5分鐘。
核心難點
-
在定位服務中檢測是否是由息屏造成的網路中斷,如果是,則嘗試進行點亮螢幕。同時,為了避免頻繁點亮,對最小時間間隔進行了設定(可以按需求修改).如果息屏沒有斷網,則無需點亮螢幕.
-
需要保證定位服務的優先順序,以免被殺死。
-
定位服務包含了點亮螢幕的功能,需要有拉活機制,保證此服務一直是alive的。部分機型會殺死嘗試多次點亮螢幕的Service(經不完全測試,華為允許的嘗試次數為2次,小米為1次).
實現原理
1.在本地服務裡啟動連續定位:
//在activity中啟動自定義本地服務LocationServicegetApplicationContext().startService(new Intent(this, LocationService.class));//在LocationService中啟動定位mLocationClient = new AMapLocationClient(this.getApplicationContext()); mLocationOption = new AMapLocationClientOption();// 使用連續定位mLocationOption.setOnceLocation(false);// 每10秒定位一次mLocationOption.setInterval(10 * 1000); mLocationClient.setLocationOption(mLocationOption); mLocationClient.setLocationListener(locationListener); mLocationClient.startLocation(); 複製程式碼
2.在locationListener中對結果進行判斷,如果是息屏造成的斷網,則嘗試點亮螢幕:
AMapLocationListener locationListener = new AMapLocationListener() { @Override public void onLocationChanged(AMapLocation aMapLocation) { //傳送結果的通知 sendLocationBroadcast(aMapLocation); //判斷是否需要對息屏斷wifi的情況進行處理 if (!mIsWifiCloseable) { return; } //將定位結果和裝置狀態一起交給mWifiAutoCloseDelegate if (aMapLocation.getErrorCode() == AMapLocation.LOCATION_SUCCESS) { //... } else { //... } } private void sendLocationBroadcast(AMapLocation aMapLocation) { //記錄資訊併傳送廣播... } };/** 處理息屏後wifi斷開的邏輯*/public class WifiAutoCloseDelegate implements IWifiAutoCloseDelegate { /** * 請根據後臺資料自行新增。此處只針對小米手機 * @param context * @return */ @Override public boolean isUseful(Context context) { //... } /** 由於服務可能被殺掉,所以在服務初始化時,初始相關引數*/ @Override public void initOnServiceStarted(Context context) { //... } /** 處理定位成功的資訊*/s @Override public void onLocateSuccess(Context context, boolean isScreenOn, boolean isMobileable) { //... } /** 處理定位失敗的資訊。如果需要喚醒螢幕,則嘗試喚醒*/ @Override public void onLocateFail(Context context, int errorCode, boolean isScreenOn, boolean isWifiable) { //... } } 複製程式碼
3.點亮螢幕時,會利用最小間隔時間加以限制:
/** * 喚醒螢幕 */ public void wakeUpScreen(final Context context) { try { acquirePowerLock(context, PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK); } catch (Exception e) { throw e; } } /** * 根據levelAndFlags,獲得PowerManager的WaveLock * 利用worker thread去獲得鎖,以免阻塞主執行緒,並且增加了最小間隔,防止頻繁喚醒 * @param context * @param levelAndFlags */ private void acquirePowerLock(final Context context, final int levelAndFlags) { //... } 複製程式碼
4.採用雙service繫結Notification,提高程式優先順序
/** * LocationService.java * 觸發利用notification增加程式優先順序 */ protected void applyNotiKeepMech() { //... } /* LocationHelperService * binder中的回撥用於繫結和LocatioService一樣的NotificationId,並stopForeground使通知隱藏 */ private class HelperBinder extends ILocationHelperServiceAIDL.Stub{ @Override public void onFinishBind(int notiId) throws RemoteException { //... } } 複製程式碼
5.採用了LocationHelperService做為守護程式,在檢測到LocationService被殺掉後,重啟定位服務。
private void startBind() { mInnerConnection = new ServiceConnection() { /** 檢測到定位服務被kill掉時,重啟定位服務*/ @Override public void onServiceDisconnected(ComponentName name) { //... } }; //... } 複製程式碼
專案地址
作者:小Fuคิดถึง
連結:
來源:掘金
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69983917/viewspace-2793323/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Ubuntu 16.04 Vysor 破解 和黑屏問題解決+ 閃屏問題解決Ubuntu
- Java 程式死鎖問題原理及解決方案Java
- 解決高度塌陷、定位問題
- 磁碟問題定位與解決
- Android啟動頁黑屏及最優解決方案Android
- 如何在直播中解決黑屏、花屏、閃屏問題 | 直播疑難雜症排查
- Android開屏、鎖屏、解鎖監聽實現Android
- HHMySQL?中定位?DDL?被阻塞的問題及解決方案xmwMySql
- Android利用Theme和Style解決APP啟動閃黑屏問題AndroidAPP
- Android 微信分享後留在微信,沒有回撥的問題解決方案Android
- Oracle 解決鎖表問題Oracle
- oracle 鎖問題的解決Oracle
- 三十四、【Android Splash閃屏頁秒開 Activity白屏、Activity黑屏問題 】Android
- RAC 鎖管理與鎖問題的定位(二)
- RAC 鎖管理與鎖問題的定位(一)
- 解決 wsl2/WSLg 聲音卡頓不連續問題
- 品牌連鎖店無線覆蓋解決方案
- Android studio更新到3.0後問題解決Android
- openldap+NFS 鎖問題解決LDANFS
- vnc連線黑屏,3步解析vnc連線黑屏的解決辦法VNC
- VNC FOR AIX 灰屏的問題解決VNCAI
- 跨域問題,解決方案 – CORS方案跨域CORS
- 跨域問題,解決方案 - CORS方案跨域CORS
- Android應用安全常見問題及解決方案Android
- sqlserver大數批次update時死鎖的問題及解決方案SQLServer
- 木馬問題解決方案
- jive中文問題解決方案
- win10更新後會閃屏黑屏怎麼解決 win10電腦更新後開機桌面一閃一閃黑屏的解決步驟Win10
- win10睡眠只黑屏怎麼辦_win10睡眠只黑屏不鎖屏如何解決Win10
- weblogic連線池重置(Connection reset)問題解決方案Web
- 伺服器解決遠端斷開後自動鎖屏伺服器
- 解決Oracle死鎖問題步驟Oracle
- SQLserver 程式被死鎖問題解決SQLServer
- Android 面向切面程式設計 AOP 解決連續點選開啟重複頁面問題Android程式設計
- 快應用開發常見問題以及解決方案【持續更新】
- Android之批量載入圖片OOM問題解決方案AndroidOOM
- 大屏互動解決方案
- 跨域問題及解決方案跨域