Android8.0適配前臺(tái)定位服務(wù)service的示例代碼
從Android 8.0開始系統(tǒng)為實(shí)現(xiàn)降低功耗,對(duì)后臺(tái)應(yīng)用獲取用戶位置信息頻率進(jìn)行了限制,每小時(shí)只允許更新幾次位置信息,詳細(xì)信息請(qǐng)參考官方說(shuō)明。按照官方指引,如果要提高位置更新頻率,需要后臺(tái)應(yīng)用提供一個(gè)前臺(tái)服務(wù)通知告知。
所以原來(lái)的單單使用locationManager獲得當(dāng)前位置在后臺(tái)情況下無(wú)法使用了。于是打算使用一個(gè)前臺(tái)服務(wù),當(dāng)app在后臺(tái)時(shí)也能獲得當(dāng)前位置。
查了幾篇博客說(shuō)前臺(tái)服務(wù)需要在service的onStartCommand方法中調(diào)用startForeground(int, Notification)才能開啟前臺(tái)服務(wù)。
但是onStartCommand需要走startservice()的生命周期才會(huì)調(diào)用。
我改用了bindservice() 正好需要activity和service交互,當(dāng)然兩個(gè)啟動(dòng)方法混用也可以。但是沒有必要。
我需要的只是和控件綁定的service并且不想處理服務(wù)的結(jié)束操作。
1、activity / fragment調(diào)用 綁定服務(wù)
Intent serviceIntent = new Intent(this, ForegroundLocationService.class);
bindService(serviceIntent, conn, Service.BIND_AUTO_CREATE);
// 綁定服務(wù)時(shí)要求傳入一個(gè)ServiceConnection實(shí)現(xiàn)類的對(duì)象
// 綁定服務(wù)時(shí),會(huì)觸發(fā)服務(wù)的onBind方法,此方法會(huì)返回一個(gè)Ibinder的對(duì)象給activity / fragment的onServiceConnected(),通過這個(gè)對(duì)象可以訪問服務(wù)中的方法
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)
第一個(gè)參數(shù)是一個(gè)不為0的正整數(shù),代表通知的id,第二個(gè)參數(shù)代表需要顯示的通知。
適配8.0的通知構(gòu)建需要適配,不然會(huì)導(dǎo)致你的通知無(wú)法顯示(第一次調(diào)用的時(shí)候還以為是一加攔截了通知)
3、那么這時(shí)候應(yīng)該已經(jīng)實(shí)現(xiàn)了前臺(tái)服務(wù),需要把服務(wù)獲得的位置信息傳遞給activity。(直接調(diào)用locationmanager就可以獲得,這里把位置實(shí)現(xiàn)隱去)
public class MyBinder extends Binder {
public ForegroundLocationService getService(){
return ForegroundLocationService.this;
}
}
//通過binder實(shí)現(xiàn)調(diào)用者client與Service之間的通信
private MyBinder binder = new MyBinder();
//通過service的onBind()方法返回我們實(shí)例化的MyBinder對(duì)象,該對(duì)象可以獲的當(dāng)前的Service
@Override
public IBinder onBind(Intent arg0) {
NotificationUtils notificationUtils = new NotificationUtils(this);
startForeground(111, notificationUtils.getNotification("Notice", "Continuous positioning",null));
return binder;
}
4、然后需要進(jìn)行控件和服務(wù)的交互,這里就分成了三種方法
- 在得到service的情況下act主動(dòng)調(diào)用得到數(shù)據(jù)
- 在service中設(shè)置回調(diào),service主動(dòng)傳遞數(shù)據(jù)給act
- 通過廣播傳遞數(shù)據(jù)。
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//通過這個(gè)方法可以得到service的實(shí)例,通過設(shè)置回調(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 {
/**
* 當(dāng)前位置
*/
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: " + "當(dāng)前坐標(biāo):" + location.getLatitude() + " : " + location.getLongitude());
if(mLocationCallback!=null){
mLocationCallback.onLocation(location);
}
}
}
Service向Activity發(fā)送消息,可以使用廣播,當(dāng)然Activity要注冊(cè)相應(yīng)的接收器。比如Service要向多個(gè)Activity發(fā)送同樣的消息的話,用這種方法就更好,這里就省略不寫了。具體可以參考下面的文章。
參考文章:http://www.dbjr.com.cn/article/123316.htm
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android?Service基礎(chǔ)(啟動(dòng)服務(wù)與綁定服務(wù))
- Android服務(wù)Service教程
- 淺談Android Service服務(wù)的高級(jí)技巧
- 說(shuō)說(shuō)在Android如何使用服務(wù)(Service)的方法
- Android實(shí)現(xiàn)Service在前臺(tái)運(yùn)行服務(wù)
- Android 判斷某個(gè)服務(wù)(service)是否運(yùn)行
- Android Service服務(wù)詳細(xì)介紹及使用總結(jié)
- Android Service服務(wù)不被停止詳解及實(shí)現(xiàn)
- Android四大組件之Service服務(wù)詳細(xì)講解
相關(guān)文章
Android編程之頁(yè)面切換測(cè)試實(shí)例
這篇文章主要介紹了Android編程之頁(yè)面切換測(cè)試,實(shí)例分析了Android實(shí)現(xiàn)頁(yè)面點(diǎn)擊切換的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
Android Studio獲取網(wǎng)絡(luò)JSON數(shù)據(jù)并處理的方法
這篇文章主要為大家詳細(xì)介紹了Android Studio獲取網(wǎng)絡(luò)JSON數(shù)據(jù)并處理的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Android開發(fā)實(shí)現(xiàn)的簡(jiǎn)單媒體播放器功能示例
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)的簡(jiǎn)單媒體播放器功能,結(jié)合實(shí)例形式分析了Android基于surfaceview實(shí)現(xiàn)多媒體視頻及音頻播放的相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
Android基于注解的6.0權(quán)限動(dòng)態(tài)請(qǐng)求框架詳解
這篇文章主要介紹了Android基于注解的6.0權(quán)限動(dòng)態(tài)請(qǐng)求框架詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-04-04
Android獲取雙卡雙待手機(jī)的SIM卡信息示例代碼
這篇文章主要給大家介紹了關(guān)于Android獲取雙卡雙待手機(jī)的SIM卡信息的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
Flutter實(shí)現(xiàn)視頻壓縮功能的示例代碼
移動(dòng)應(yīng)用程序中,視頻占用了大量的存儲(chǔ)空間和帶寬,這在一定程度上影響了應(yīng)用程序的性能和用戶體驗(yàn),所以本文為大家準(zhǔn)備了Flutter實(shí)現(xiàn)視頻壓縮的方法,需要的可以參考一下2023-06-06
Android應(yīng)用開發(fā)中自定義ViewGroup視圖容器的教程
這篇文章主要介紹了Android應(yīng)用開發(fā)中自定義ViewGroup視圖容器的教程,重點(diǎn)在于View之間的參數(shù)傳遞,文中還講到了使用ViewDragHelper自定義ViewGroup的方法,需要的朋友可以參考下2016-04-04
Android實(shí)現(xiàn)帶頁(yè)面切換的鎖屏功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)帶頁(yè)面切換的鎖屏功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06

