前言
因爲上一篇博客的緣故,發現安卓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狀態改變時,廣播會接收到這個通知.
上述兩種方法均測試通過。
代碼地址