android – 什么样的广播接收器使用?

我已经阅读了这个答案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.

最佳答案
通过使用抽象类来处理所有操作,并将回调发送到您的活动,这非常好.在上面的问题中使用该示例在我看来像EventBus.

甚至更好地使用特殊的类和接口,而不是抽象类,因为您可能想要使用FragmentActivity,AppCombatActivity等.

例如,您拥有自己的班级,该班级从您的服务中接收结果并将所有注册的活动发送给他.使用接口调用来自网络请求的结果:

public class NetRequestReceiver extends broadcastReceiver {

private Listeton initialing!
    //....
}

@Override
public void onReceive(Context context,Intent intent) {
    for (Activity act : registeredActivities) {
         if (act instanceOf ReceivingCallback) {
             act.onReceiveMessage(intent);
         } else throw Exception("Activity missing ReceivingCallback");
    }
}    

public void registeractivity (Activity,activity) {
    if (!registeredActivities.contains(activity)) {
        registeredActivities.add(activity);
    }
}

public void unRegisteractivity (Activity,activity) {
    if (registeredActivities.contains(activity)) {
        registeredActivities.remove(activity);
    }
}

public interface ReceivingCallback {
    onReceiveMessage (Intent intent);
}

}

然后在所有活动中添加一个侦听器.但是(!)不要忘记上面的注册接收器服务接收结果!

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,但根据你的问题,它只是你需要从服务到不同活动的监听连接,以及更好的结构.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...