Android8.0適配前臺定位服務service的示例代碼
從Android 8.0開始系統(tǒng)為實現(xiàn)降低功耗,對后臺應用獲取用戶位置信息頻率進行了限制,每小時只允許更新幾次位置信息,詳細信息請參考官方說明。按照官方指引,如果要提高位置更新頻率,需要后臺應用提供一個前臺服務通知告知。
所以原來的單單使用locationManager獲得當前位置在后臺情況下無法使用了。于是打算使用一個前臺服務,當app在后臺時也能獲得當前位置。
查了幾篇博客說前臺服務需要在service的onStartCommand方法中調(diào)用startForeground(int, Notification)才能開啟前臺服務。
但是onStartCommand需要走startservice()的生命周期才會調(diào)用。
我改用了bindservice() 正好需要activity和service交互,當然兩個啟動方法混用也可以。但是沒有必要。
我需要的只是和控件綁定的service并且不想處理服務的結(jié)束操作。
1、activity / fragment調(diào)用 綁定服務
Intent serviceIntent = new Intent(this, ForegroundLocationService.class);
bindService(serviceIntent, conn, Service.BIND_AUTO_CREATE);
// 綁定服務時要求傳入一個ServiceConnection實現(xiàn)類的對象
// 綁定服務時,會觸發(fā)服務的onBind方法,此方法會返回一個Ibinder的對象給activity / fragment的onServiceConnected(),通過這個對象可以訪問服務中的方法
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
}
};
2、我在onBind()方法中調(diào)用了startForeground(int, Notification)
第一個參數(shù)是一個不為0的正整數(shù),代表通知的id,第二個參數(shù)代表需要顯示的通知。
適配8.0的通知構(gòu)建需要適配,不然會導致你的通知無法顯示(第一次調(diào)用的時候還以為是一加攔截了通知)
3、那么這時候應該已經(jīng)實現(xiàn)了前臺服務,需要把服務獲得的位置信息傳遞給activity。(直接調(diào)用locationmanager就可以獲得,這里把位置實現(xiàn)隱去)
public class MyBinder extends Binder {
public ForegroundLocationService getService(){
return ForegroundLocationService.this;
}
}
//通過binder實現(xiàn)調(diào)用者client與Service之間的通信
private MyBinder binder = new MyBinder();
//通過service的onBind()方法返回我們實例化的MyBinder對象,該對象可以獲的當前的Service
@Override
public IBinder onBind(Intent arg0) {
NotificationUtils notificationUtils = new NotificationUtils(this);
startForeground(111, notificationUtils.getNotification("Notice", "Continuous positioning",null));
return binder;
}
4、然后需要進行控件和服務的交互,這里就分成了三種方法
- 在得到service的情況下act主動調(diào)用得到數(shù)據(jù)
- 在service中設置回調(diào),service主動傳遞數(shù)據(jù)給act
- 通過廣播傳遞數(shù)據(jù)。
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//通過這個方法可以得到service的實例,通過設置回調(diào)可以持續(xù)更新
ForegroundLocationService foregroundLocationService = ((ForegroundLocationService.MyBinder) service).getService();
foregroundLocationService.setLocationCallback(new ForegroundLocationService.LocationCallback() {
@Override
public void onLocation(Location location) {
}
});
}
};
在service中編寫接口,并在獲得位置的回調(diào)方法中調(diào)用。
public interface LocationCallback {
/**
* 當前位置
*/
void onLocation(Location location);
}
private LocationCallback mLocationCallback;
private class LocationListener implements android.location.LocationListener {
public LocationListener(String provider) {
Logger.e(TAG, "LocationListener " + provider);
}
@Override
public void onLocationChanged(Location location) {
Log.i("location", "onLocationChanged: " + "當前坐標:" + location.getLatitude() + " : " + location.getLongitude());
if(mLocationCallback!=null){
mLocationCallback.onLocation(location);
}
}
}
Service向Activity發(fā)送消息,可以使用廣播,當然Activity要注冊相應的接收器。比如Service要向多個Activity發(fā)送同樣的消息的話,用這種方法就更好,這里就省略不寫了。具體可以參考下面的文章。
參考文章:http://www.dhdzp.com/article/123316.htm
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Android ListView中headerview的動態(tài)顯示和隱藏的實現(xiàn)方法
這篇文章主要介紹了Android ListView中headerview的動態(tài)顯示和隱藏的實現(xiàn)方法的相關資料,這里提供兩種方法幫助實現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08
android開發(fā)基礎教程—SharedPreferences讀寫
本文介紹SharedPreferences的讀與寫的實現(xiàn)思路,感興趣的朋友可以了解下2013-01-01
Flutter Widget移動UI框架使用Material和密匙Key實戰(zhàn)
這篇文章主要為大家介紹了Flutter Widget移動UI框架使用Material和密匙Key實戰(zhàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
Android使用ViewPager實現(xiàn)屏幕滑動效果
這篇文章主要為大家詳細介紹了Android使用ViewPager實現(xiàn)屏幕滑動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10
Android自定義VIew實現(xiàn)衛(wèi)星菜單效果淺析
這篇文章主要介紹了Android自定義VIew實現(xiàn)衛(wèi)星菜單效果淺析,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-11-11
Android學習筆記--通過Application傳遞數(shù)據(jù)代碼示例
使用Application傳遞數(shù)據(jù)步驟如下:創(chuàng)建新class,取名MyApp,繼承android.app.Application父類,并在MyApp中定義需要保存的屬性2013-06-06
Android利用AsyncTask異步類實現(xiàn)網(wǎng)頁內(nèi)容放大縮小
這篇文章主要為大家介紹了利用AsyncTask異步類實現(xiàn)網(wǎng)頁內(nèi)容放大縮小的相關資料,感興趣的小伙伴們可以參考一下2016-07-07

