AndroidApp后台服务报告工作状态实例
2023-06-13 09:15:32 时间
本节讲运行在后台服务里的工作请求,如何向发送请求者报告状态。推荐用LocalBroadcastManager发送和接收状态,它限制了只有本app才能接收到广播。
从IntentService汇报状态
从IntentService发送工作请求状态给其他组件,先创建一个包含状态和数据的Intent。也可以添加action和URI到intent里。
下一步,调用LocalBroadcastManager.sendBroadcast()发送Intent,应用中所有注册了接收该广播的接收器都能收到。LocalBroadcastManager.getInstance()获取LocalBroadcastManager实例。
publicfinalclassConstants{
...
//DefinesacustomIntentaction
publicstaticfinalStringBROADCAST_ACTION=
"com.example.android.threadsample.BROADCAST";
...
//Definesthekeyforthestatus"extra"inanIntent
publicstaticfinalStringEXTENDED_DATA_STATUS=
"com.example.android.threadsample.STATUS";
...
}
publicclassRSSPullServiceextendsIntentService{
...
/*
*CreatesanewIntentcontainingaUriobject
*BROADCAST_ACTIONisacustomIntentaction
*/
IntentlocalIntent=
newIntent(Constants.BROADCAST_ACTION)
//PutsthestatusintotheIntent
.putExtra(Constants.EXTENDED_DATA_STATUS,status);
//BroadcaststheIntenttoreceiversinthisapp.
LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent);
...
}
下一步是接收广播并处理。
接收来自IntentService的广播
接收方式与普通的Broadcast一样,用一个BroadcastReceiver的子类,实现BroadcastReceiver.onReceive()方法
//BroadcastreceiverforreceivingstatusupdatesfromtheIntentService
privateclassResponseReceiverextendsBroadcastReceiver
{
//Preventsinstantiation
privateDownloadStateReceiver(){
}
//CalledwhentheBroadcastReceivergetsanIntentit"sregisteredtoreceive
@
publicvoidonReceive(Contextcontext,Intentintent){
...
/*
*HandleIntentshere.
*/
...
}
}
定义好了接收器类以后,定义过滤器,匹配指定的action,categorie,data.
//Classthatdisplaysphotos
publicclassDisplayActivityextendsFragmentActivity{
...
publicvoidonCreate(BundlestateBundle){
...
super.onCreate(stateBundle);
...
//Thefilter"sactionisBROADCAST_ACTION
IntentFiltermStatusIntentFilter=newIntentFilter(
Constants.BROADCAST_ACTION);
//AddsadatafilterfortheHTTPscheme
mStatusIntentFilter.addDataScheme("http");
...
注册方式稍有不同,用LocalBroadcastManager.registerReceiver()。
//InstantiatesanewDownloadStateReceiver
DownloadStateReceivermDownloadStateReceiver=
newDownloadStateReceiver();
//RegisterstheDownloadStateReceiveranditsintentfilters
LocalBroadcastManager.getInstance(this).registerReceiver(
mDownloadStateReceiver,
mStatusIntentFilter);
...
单个BroadcastReceiver可以处理多种类型的广播,这个特性允许你根据不同的action运行不同的代码,而无需为每个action定义一个BroadcastReceiver。
/*
*Instantiatesanewactionfilter.
*Nodatafilterisneeded.
*/
statusIntentFilter=newIntentFilter(Constants.ACTION_ZOOM_IMAGE);
...
//Registersthereceiverwiththenewfilter
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
mDownloadStateReceiver,
mIntentFilter);
发送广播并不会启动或恢复Activity.BroadcastReceiver让Activity能够接收处理数据,包括应用在后台的时候,但不会强制app回到前台。如果你要在app在后台,对用户不可见时,通知用户一个事件发生,用Notification。绝对不要启动一个Activity来响应广播。
相关文章
- java控制台输入数组_Java控制台输入数组并逆序输出的方法实例
- DID-M3D:用于单目3D物体检测的解耦实例深度
- 实例讲解SQL Server加密功能
- MySQL正则表达式regexp_replace函数的用法实例
- JS RegExp的实例属性(成员属性)和静态属性
- CDH集群MySQL数据库实例搭建及优化(cdhmysql)
- 更改 Oracle数据库实例名更改实践(oracle数据库实例名)
- 如何查询Oracle数据库实例名(oracle查实例名)
- Redis单机架构使用实例(redis单机)
- jsp源码实例3(获取jsp各种参数)
- 实例讲解JSPModel2体系结构(中)
- asp.netStreamReader创建文件的实例代码
- jQuery焦点图切换特效插件封装实例
- node.js应用后台守护进程管理器Forever安装和使用实例
- php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
- Perl中使用File::Lockfile确保脚本单实例运行
- Android中使用IntentService创建后台服务实例