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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 解決高度塌陷、定位問題
- 磁碟問題定位與解決
- Android開屏、鎖屏、解鎖監聽實現Android
- HHMySQL?中定位?DDL?被阻塞的問題及解決方案xmwMySql
- Android應用安全常見問題及解決方案Android
- Android 微信分享後留在微信,沒有回撥的問題解決方案Android
- Android平臺HTTPS抓包解決方案及問題分析AndroidHTTP
- Android 面向切面程式設計 AOP 解決連續點選開啟重複頁面問題Android程式設計
- 品牌連鎖店無線覆蓋解決方案
- MATLAB呼叫NASTRAN的連續計算解決方案MatlabAST
- 跨域問題,解決方案 – CORS方案跨域CORS
- vnc連線黑屏,3步解析vnc連線黑屏的解決辦法VNC
- 解決 wsl2/WSLg 聲音卡頓不連續問題
- 解決Oracle死鎖問題步驟Oracle
- Android設定加密鎖屏不可訪問MTPAndroid加密
- win10更新後會閃屏黑屏怎麼解決 win10電腦更新後開機桌面一閃一閃黑屏的解決步驟Win10
- android開發中,button設定shape後,shape的顏色不生效的問題解決方案Android
- PySimpleGUI 引入後VsCode出現問題提示 “could not be resolved” 解決方案GUIVSCode
- 快應用開發常見問題以及解決方案【持續更新】
- win10睡眠只黑屏怎麼辦_win10睡眠只黑屏不鎖屏如何解決Win10
- 伺服器解決遠端斷開後自動鎖屏伺服器
- 跨域問題及解決方案跨域
- HA腦裂問題解決方案
- SpringBoot跨域問題解決方案Spring Boot跨域
- 用分散式鎖解決併發問題分散式
- Mysql使用kill命令解決死鎖問題MySql
- Android高德地圖定位SDK 返回資訊中只有經緯度問題解決Android地圖
- No debuggable processes(Android Studio沒有可除錯應用)問題解決方案Android除錯
- Android 解決BottomSheetDialog 拖曳衝突問題Android
- docker下mysql連線數修改後不生效問題的解決DockerMySql
- 大屏互動解決方案
- 記錄一次重灌電腦黑屏問題解決辦法與解決思路
- Android Activity跳轉閃屏問題Android
- 解決代理連線超時問題
- 解決macOS vim 不能連按問題Mac
- Mycat分片方案需要解決的問題
- 玩Deno遇到問題的解決方案
- 前端跨域問題及其解決方案前端跨域