Android動態監聽GPS狀態

 

前言

  因爲上一篇博客的緣故,發現安卓9.0的定位跟GPS是否開啓有很大關係,因此就想到安卓能不能監聽GPS的狀態,類似於廣播這種註冊接收等,經過搜索發現,安卓系統還是有預留這個監聽,也許大家對這個需求可能不是太需要,但是我的需求場景是需要的。

 

GPS 狀態的監聽

Android 中有關於GPS狀態的常量,存在於Setting中

Settings.Secure.getUriFor(Settings.System.LOCATION_PROVIDERS_ALLOWED)

該常量 LOCATION_PROVIDERS_ALLOWED 的解釋如下
* Comma-separated list of location providers that activities may access. Do not rely on
* this value being present in settings.db or on ContentObserver notifications on the
* corresponding Uri.

谷歌翻譯:

*活動可以訪問的以逗號分隔的位置提供者列表。 不要依賴
*此值存在於settings.db或ContentObserver通知中
*相應的Uri。

然後通過註冊ContentObserver來觀察GPS的狀態改變,因此需要對象繼承自ContentObserver

ContentObserver部分代碼

/**
 * Receives call backs for changes to content.
 * Must be implemented by objects which are added to a {@link ContentObservable}.
 */
public abstract class ContentObserver {
    private final Object mLock = new Object();
    private Transport mTransport; // guarded by mLock

    Handler mHandler;

    /**
     * Creates a content observer.
     *
     * @param handler The handler to run {@link #onChange} on, or null if none.
     */
    public ContentObserver(Handler handler) {
        mHandler = handler;
    }

定義GPS觀察者監聽對象,當用戶點擊手機上的GPS(Gps快捷開關也可以)可以觸發該觀察者回調.

private final ContentObserver mGpsMonitor = new ContentObserver(null) {
        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            if (mLocationManager != null) {
                boolean enabled = mLocationManager
                        .isProviderEnabled(LocationManager.GPS_PROVIDER);
                notifyChanged(enabled);
            }
        }
    };

在onCreate/onStart中去註冊該監聽,我維護了一個單例,可以再多個界面註冊監聽/移除監聽等.

  GpsMonitor.getInstance().addListener(getLocalClassName(), onGpsMonitorChangedListener).registerGpsMonitor(this);

在onDestroy/onStop中銷燬監聽.

GpsMonitor.getInstance().removeListener(getLocalClassName());

上述操作完成後,即可動態的監聽到GPS狀態的變化(當用戶點擊高精度,移動網絡provider或者僅限設備)均會觸發該監聽,親測可用。

 

文末彩蛋

 

 大家看到上述方法有點類似於安卓中廣播的註冊使用,確實,這個模式貌似已經被@Deprecated了,谷歌已經不建議這樣使用了。

   /**
         * @deprecated Use {@link android.provider.Settings.Secure#LOCATION_PROVIDERS_ALLOWED}
         * instead
         */
        @Deprecated
        public static final String LOCATION_PROVIDERS_ALLOWED = Secure.LOCATION_PROVIDERS_ALLOWED;

谷歌真的建議使用廣播註冊的方式來監聽GPS的狀態改變.

因此有多了上面建議的兩個常量

* {@link LocationManager#MODE_CHANGED_ACTION} (or
* {@link LocationManager#PROVIDERS_CHANGED_ACTION})

因此,再使用這個方式的時候,使用廣播註冊,IntentFilter添加上面兩個action,當GPS狀態改變時,廣播會接收到這個通知.

上述兩種方法均測試通過。

 

代碼地址

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章