fei*_*ong 2 java android android-intent android-service android-fragments
我有一个具有单个活动的应用程序,该活动在一种自定义导航抽屉设计中托管多个片段。这些片段中的两个依赖于服务以将其返回以显示json信息。我希望能够在启动屏幕上启动该服务以加载所需的数据,然后将json异步传达给这些片段。
我一般都不熟悉android和编程,所以如果我的动作不了解,请原谅,但是我首先尝试将片段注册为接收者,然后简单地广播包含json信息的捆绑包的意图。这似乎不起作用,因为当服务广播意图并错过意图时,有时片段将无法运行。
然后,我决定一意孤行,但这导致了过时的信息,更不用说继承安全性了。
启动服务后,让服务执行后台网络请求并随后通过任何活动或片段显示返回的信息的最佳方法是什么?
相信我,我在大型企业项目中尝试了很多第三方方法(服务总线,观察……),事实证明,原生Android机制是最快,最可靠的机制,因为它们利用了框架的优势。
那就是为什么我会推荐与BroadcastReceiver一起使用LocalBroadcastManager的原因。在您的活动(或您的can事件中,按片段执行此操作!)中注册onStart并在onPause专用Receiver中注销。
在您的服务中使用LocalBroadcastManager与所有潜在的订户进行通信。
例:
public class YourActivity extends Activity{
private BroadcastReceiver receiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
//...do the stuff you need to do depending on the received broadcas
}
};
private IntentFilter filter = new IntentFilter(UploadService.INTENT_ACTION_UPLOAD);
protected onStart(){
LocalBroadcastManager.getInstance(this).registerReceiver(receiver, filter);
}
protected onPause(){
LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
}
}
public class UploadService extends IntentService{
public static final String INTENT_ACTION_UPLOAD = "com.your.package.INTENT_ACTION_UPLOAD";
public onHandleIntent(){
//upload
LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(INTENT_ACTION_UPLOAD));
}
}
Run Code Online (Sandbox Code Playgroud)
onReceive然后,您可以在BroadcastReceiver中根据接收到的广播来做您需要做的事情。如果需要进一步区分,则可以使用不同的操作或其他功能,例如在服务中:
...send(new Intent(INTENT_ACTION_SOMETHING_ELSE));
Run Code Online (Sandbox Code Playgroud)
要么
send(new Intent(...).putExtra(WAS_SUCCESSFUL, false));
send(new Intent(...).putExtra(DOWNLOADED_CONTENT, downloadedStuff);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2453 次 |
| 最近记录: |