Android App后台服务报告工作状态实例
本节讲运行在后台服务里的工作请求,如何向发送请求者报告状态。推荐用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来响应广播。