我已经阅读了这个答案here以及这个here,我正在试图弄清楚什么最适合我的情况.
我在onCreate()中启动一个服务,在那里我发出一个HTTP请求,我得到一个id作为响应.然后我播放了这个id并在我的活动中收到它.
问题是用户显然可以通过打开抽屉并选择一个选项来导航到另一个活动,我可以错过广播.
我显然可以让我的所有活动扩展一个扩展Activity的抽象类,如here所述,但我不是100%确定它是最好的解决方案.如果用户在收到ID之前决定退出应用程序该怎么办?
编辑:应用程序架构
>用户使用Intent捕获图像以打开相机应用程序并获取图像文件的路径.
> FormActivity从用户可以添加有关图像的一些详细信息开始.
>用户点击上传,我将用户刚刚输入的数据传递给QuizActivity.
>在QuizActivity的onCreate()中,我启动了一个服务,其中我:
>创建一个到服务器的空条目,我得到一个id作为响应和
>将图像上传到服务器
>我从服务器获得的响应然后广播它.
> QuizActivity注册了一个entryIdReceiver,接收id并将其存储在私有字段中,直到用户决定离开活动或点击上传测验(如果他输入了测验的数据)
>如果用户点击上传,我会使用id和测验数据启动IntentService.
>如果用户打开抽屉并选择另一个活动或单击取消以创建测验,我启动IntentService以使用“空测验数据”上传ID并将用户移至MainActivity.
问题是:如果你在QuizActivity上关闭应用程序并且我还没有收到id,或者用户决定使用抽屉进入另一个Activity而不添加测验.我仍然需要启动服务并使用“空测验数据”上传ID.
甚至更好地使用特殊的类和接口,而不是抽象类,因为您可能想要使用FragmentActivity,AppCombatActivity等.
例如,您拥有自己的班级,该班级从您的服务中接收结果并将所有注册的活动发送给他.使用接口调用来自网络请求的结果:
public class NetRequestReceiver extends BroadcastReceiver {
private List
然后在所有活动中添加下一个侦听器.但是(!)不要忘记上面的注册接收器服务接收结果!
public class MainActivity extends Activity implements NetRequestReceiver.ReceivingCallback {
public void onStop () {
super.onStop()
NetRequestReceiver.getInstance().unRegisterActivity(this);
}
public void onResume () {
super.onResume()
NetRequestReceiver.getInstance().registerActivity(this);
}
@Override
public onReceiveMessage (Intent intent) {
//put here whaterver you want your activity
//to do with the intent received
}
}
我们用上面的设计得到什么?我们现在有单个Receiver和Callback作为接口.因此,您可以使用Fragment,Activity,FragmentActivity和其他类来接收来自Service via Broadcast和(!)的结果,而无需复制粘贴相同的行为!
它看起来还不错,因为我们拆分了不同的层 – 表示,视图和接收器.您在服务中调用网络请求.此服务将结果发送到广播,然后他将数据发送到所有已注册的活动.
是的,它看起来像是EventBus,但根据你的问题,它只是你需要从服务到不同活动的监听连接,以及更好的结构.