IntentService 已弃用,如何用 JobIntentService 替换它?
IntentService is deprecated, how do I replace it with JobIntentService?
使用 IntentService
(在 kotlin 中)实现 FetchAddressIntentService
之后:
class FetchAddressIntentService //Constructor of this service
: IntentService(INTENTTAG) {
//Receiver where results are forwarded from this service
protected var resultReceiver: ResultReceiver? = null
private val TAG by lazy { this::class.java.simpleName }
//Intent Service handler
override fun onHandleIntent(intent: Intent?) { //Errormessages
var errorMessage = ""
if (intent != null) {
resultReceiver =
intent.getParcelableExtra(RECEIVER)
}
//Checks if receiver was properly registered
if (resultReceiver == null) {
Log.wtf(
TAG,
"No reciever received. There is nowhere to send the results !!"
)
return
}
//Get the location passed to this service through an extra.
var location: Location? = null
if (intent != null) {
location =
intent.getParcelableExtra(LOCATION_DATA_EXTRA)
}
//Make sure the location is really sent
if (location == null) {
errorMessage = getString(R.string.gis_error_no_location_data_provided)
Log.wtf(TAG, errorMessage)
deliverResultToReceiver(FAILURE_RESULT, errorMessage)
return
}
//Setting locale
val geocoder = Geocoder(this, Locale.ROOT)
//Address found
var addresses: List<Address>? = null
try {
addresses = geocoder.getFromLocation(location.latitude, location.longitude, 1)
Log.i(TAG,"rec: address = ${addresses[0]}")
} catch (ioException: IOException) { //Catches network or i/o problems
errorMessage = getString(R.string.gis_error_service_not_available)
Log.e(TAG, errorMessage, ioException)
} catch (illegalArgumentException: IllegalArgumentException) { //Error in latitude or longitude data
errorMessage = getString(R.string.gis_error_invalid_lat_long_used)
Log.e(
TAG,
errorMessage + ". Latitude = " + location.latitude +
", Longitude = " + location.longitude,
illegalArgumentException
)
}
//Handles cases where no addresses where found
if (addresses == null || addresses.isEmpty()) {
if (errorMessage.isEmpty()) {
errorMessage = getString(R.string.gis_error_no_address_found)
Log.e(TAG, errorMessage)
}
deliverResultToReceiver(FAILURE_RESULT, errorMessage)
} else {
val address = addresses[0]
//deliverAddressToReceiver(SUCCESS_RESULT, address)
deliverAddressToReceiver2(SUCCESS_ADDRESS,address)
}
}
private fun deliverAddressToReceiver2(
resultCode: Int,
address: Address
){
val bundle = Bundle()
bundle.putParcelable("address",address)
resultReceiver?.send(resultCode,bundle)
}
private fun deliverResultToReceiver(resultCode: Int, message: String) {
val bundle = Bundle()
bundle.putString(RESULT_DATA_KEY, message)
resultReceiver!!.send(resultCode, bundle)
}
companion object {
private const val INTENTTAG = "FetchAddressIS"
}
}
有人建议我如何用 JobIntentService
替换 IntentService
吗?
IntentService
在 Android-R / Android-11 中已弃用。
我已经尝试关注一些关于此的帖子,但没有人指导正确的路径如何以 AddressFetchIntentService 使用的方式更改 IntentService 调用对 JobIntentService 调用的可用性 IntentService
。
RG
class FetchAddressIntentService : JobIntentService() {
// This method is called when service starts instead of onHandleIntent
override fun onHandleWork(intent: Intent) {
onHandleIntent(intent)
}
// remove override and make onHandleIntent private.
private fun onHandleIntent(intent: Intent?) {}
// convenient method for starting the service.
companion object {
fun enqueueWork(context: Context, intent: Intent) {
enqueueWork(context, FetchAddressIntentService::class.java, 1, intent)
}
}
}
您可以将服务启动为
val intent = Intent(this, FetchAddressIntentService::class.java)
FetchAddressIntentService.enqueueWork(this, intent)
重要:
您需要添加清单权限。
<uses-permission android:name="android.permission.WAKE_LOCK" />
// 奥利奥之前的设备需要
还有
<service
android:name=".FetchAddressIntentService"
android:permission="android.permission.BIND_JOB_SERVICE" // needed for oreo and above
android:exported="true"/>
阅读更多here
已添加 2020.06.02 19:20 格林威治标准时间,作者:Roar Grønmo
我将代码更改为:
class FetchAddressJobIntentService:JobIntentService()
{
private val TAG by lazy { this::class.java.simpleName }
protected var resultReceiver: ResultReceiver? = null
/*
override fun onHandleWork(intent: Intent) {
onHandleIntent(intent)
}*/
override fun onHandleWork(intent: Intent) { //Errormessages
var errorMessage = ""
resultReceiver = intent.getParcelableExtra(RECEIVER)
//Checks if receiver was properly registered
if (resultReceiver == null) {
Log.wtf(
TAG,
"No reciever received. There is nowhere to send the results !!"
)
return
}
//Get the location passed to this service through an extra.
var location: Location? = null
location = intent.getParcelableExtra(LOCATION_DATA_EXTRA)
//Make sure the location is really sent
if (location == null) {
errorMessage = getString(R.string.gis_error_no_location_data_provided)
Log.wtf(TAG, errorMessage)
deliverResultToReceiver(FAILURE_RESULT, errorMessage)
return
}
//Setting locale
val geocoder = Geocoder(this, Locale.ROOT)
//Address found
var addresses: List<Address>? = null
try {
addresses = geocoder.getFromLocation(location.latitude, location.longitude, 1)
Log.i(TAG,"rec: address = ${addresses[0]}")
} catch (ioException: IOException) { //Catches network or i/o problems
errorMessage = getString(R.string.gis_error_service_not_available)
Log.e(TAG, errorMessage, ioException)
} catch (illegalArgumentException: IllegalArgumentException) { //Error in latitude or longitude data
errorMessage = getString(R.string.gis_error_invalid_lat_long_used)
Log.e(
TAG,
errorMessage + ". Latitude = " + location.latitude +
", Longitude = " + location.longitude,
illegalArgumentException
)
}
//Handles cases where no addresses where found
if (addresses == null || addresses.isEmpty()) {
if (errorMessage.isEmpty()) {
errorMessage = getString(R.string.gis_error_no_address_found)
Log.e(TAG, errorMessage)
}
deliverResultToReceiver(FAILURE_RESULT, errorMessage)
} else {
val address = addresses[0]
//deliverAddressToReceiver(SUCCESS_RESULT, address)
deliverAddressToReceiver2(SUCCESS_ADDRESS,address)
}
}
private fun deliverAddressToReceiver2(
resultCode: Int,
address: Address
){
val bundle = Bundle()
bundle.putParcelable("address",address)
resultReceiver?.send(resultCode,bundle)
}
private fun deliverResultToReceiver(resultCode: Int, message: String) {
val bundle = Bundle()
bundle.putString(RESULT_DATA_KEY, message)
resultReceiver!!.send(resultCode, bundle)
}
companion object{
fun enqueueWork(context: Context, intent: Intent){
enqueueWork(context,FetchAddressJobIntentService::class.java, 1, intent)
}
}
}
使用 IntentService
(在 kotlin 中)实现 FetchAddressIntentService
之后:
class FetchAddressIntentService //Constructor of this service
: IntentService(INTENTTAG) {
//Receiver where results are forwarded from this service
protected var resultReceiver: ResultReceiver? = null
private val TAG by lazy { this::class.java.simpleName }
//Intent Service handler
override fun onHandleIntent(intent: Intent?) { //Errormessages
var errorMessage = ""
if (intent != null) {
resultReceiver =
intent.getParcelableExtra(RECEIVER)
}
//Checks if receiver was properly registered
if (resultReceiver == null) {
Log.wtf(
TAG,
"No reciever received. There is nowhere to send the results !!"
)
return
}
//Get the location passed to this service through an extra.
var location: Location? = null
if (intent != null) {
location =
intent.getParcelableExtra(LOCATION_DATA_EXTRA)
}
//Make sure the location is really sent
if (location == null) {
errorMessage = getString(R.string.gis_error_no_location_data_provided)
Log.wtf(TAG, errorMessage)
deliverResultToReceiver(FAILURE_RESULT, errorMessage)
return
}
//Setting locale
val geocoder = Geocoder(this, Locale.ROOT)
//Address found
var addresses: List<Address>? = null
try {
addresses = geocoder.getFromLocation(location.latitude, location.longitude, 1)
Log.i(TAG,"rec: address = ${addresses[0]}")
} catch (ioException: IOException) { //Catches network or i/o problems
errorMessage = getString(R.string.gis_error_service_not_available)
Log.e(TAG, errorMessage, ioException)
} catch (illegalArgumentException: IllegalArgumentException) { //Error in latitude or longitude data
errorMessage = getString(R.string.gis_error_invalid_lat_long_used)
Log.e(
TAG,
errorMessage + ". Latitude = " + location.latitude +
", Longitude = " + location.longitude,
illegalArgumentException
)
}
//Handles cases where no addresses where found
if (addresses == null || addresses.isEmpty()) {
if (errorMessage.isEmpty()) {
errorMessage = getString(R.string.gis_error_no_address_found)
Log.e(TAG, errorMessage)
}
deliverResultToReceiver(FAILURE_RESULT, errorMessage)
} else {
val address = addresses[0]
//deliverAddressToReceiver(SUCCESS_RESULT, address)
deliverAddressToReceiver2(SUCCESS_ADDRESS,address)
}
}
private fun deliverAddressToReceiver2(
resultCode: Int,
address: Address
){
val bundle = Bundle()
bundle.putParcelable("address",address)
resultReceiver?.send(resultCode,bundle)
}
private fun deliverResultToReceiver(resultCode: Int, message: String) {
val bundle = Bundle()
bundle.putString(RESULT_DATA_KEY, message)
resultReceiver!!.send(resultCode, bundle)
}
companion object {
private const val INTENTTAG = "FetchAddressIS"
}
}
有人建议我如何用 JobIntentService
替换 IntentService
吗?
IntentService
在 Android-R / Android-11 中已弃用。
我已经尝试关注一些关于此的帖子,但没有人指导正确的路径如何以 AddressFetchIntentService 使用的方式更改 IntentService 调用对 JobIntentService 调用的可用性 IntentService
。
RG
class FetchAddressIntentService : JobIntentService() {
// This method is called when service starts instead of onHandleIntent
override fun onHandleWork(intent: Intent) {
onHandleIntent(intent)
}
// remove override and make onHandleIntent private.
private fun onHandleIntent(intent: Intent?) {}
// convenient method for starting the service.
companion object {
fun enqueueWork(context: Context, intent: Intent) {
enqueueWork(context, FetchAddressIntentService::class.java, 1, intent)
}
}
}
您可以将服务启动为
val intent = Intent(this, FetchAddressIntentService::class.java)
FetchAddressIntentService.enqueueWork(this, intent)
重要:
您需要添加清单权限。
<uses-permission android:name="android.permission.WAKE_LOCK" />
// 奥利奥之前的设备需要
还有
<service
android:name=".FetchAddressIntentService"
android:permission="android.permission.BIND_JOB_SERVICE" // needed for oreo and above
android:exported="true"/>
阅读更多here
已添加 2020.06.02 19:20 格林威治标准时间,作者:Roar Grønmo
我将代码更改为:
class FetchAddressJobIntentService:JobIntentService()
{
private val TAG by lazy { this::class.java.simpleName }
protected var resultReceiver: ResultReceiver? = null
/*
override fun onHandleWork(intent: Intent) {
onHandleIntent(intent)
}*/
override fun onHandleWork(intent: Intent) { //Errormessages
var errorMessage = ""
resultReceiver = intent.getParcelableExtra(RECEIVER)
//Checks if receiver was properly registered
if (resultReceiver == null) {
Log.wtf(
TAG,
"No reciever received. There is nowhere to send the results !!"
)
return
}
//Get the location passed to this service through an extra.
var location: Location? = null
location = intent.getParcelableExtra(LOCATION_DATA_EXTRA)
//Make sure the location is really sent
if (location == null) {
errorMessage = getString(R.string.gis_error_no_location_data_provided)
Log.wtf(TAG, errorMessage)
deliverResultToReceiver(FAILURE_RESULT, errorMessage)
return
}
//Setting locale
val geocoder = Geocoder(this, Locale.ROOT)
//Address found
var addresses: List<Address>? = null
try {
addresses = geocoder.getFromLocation(location.latitude, location.longitude, 1)
Log.i(TAG,"rec: address = ${addresses[0]}")
} catch (ioException: IOException) { //Catches network or i/o problems
errorMessage = getString(R.string.gis_error_service_not_available)
Log.e(TAG, errorMessage, ioException)
} catch (illegalArgumentException: IllegalArgumentException) { //Error in latitude or longitude data
errorMessage = getString(R.string.gis_error_invalid_lat_long_used)
Log.e(
TAG,
errorMessage + ". Latitude = " + location.latitude +
", Longitude = " + location.longitude,
illegalArgumentException
)
}
//Handles cases where no addresses where found
if (addresses == null || addresses.isEmpty()) {
if (errorMessage.isEmpty()) {
errorMessage = getString(R.string.gis_error_no_address_found)
Log.e(TAG, errorMessage)
}
deliverResultToReceiver(FAILURE_RESULT, errorMessage)
} else {
val address = addresses[0]
//deliverAddressToReceiver(SUCCESS_RESULT, address)
deliverAddressToReceiver2(SUCCESS_ADDRESS,address)
}
}
private fun deliverAddressToReceiver2(
resultCode: Int,
address: Address
){
val bundle = Bundle()
bundle.putParcelable("address",address)
resultReceiver?.send(resultCode,bundle)
}
private fun deliverResultToReceiver(resultCode: Int, message: String) {
val bundle = Bundle()
bundle.putString(RESULT_DATA_KEY, message)
resultReceiver!!.send(resultCode, bundle)
}
companion object{
fun enqueueWork(context: Context, intent: Intent){
enqueueWork(context,FetchAddressJobIntentService::class.java, 1, intent)
}
}
}