Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用哪种广播接收器?_Android - Fatal编程技术网

Android 使用哪种广播接收器?

Android 使用哪种广播接收器?,android,Android,我已经读了这个答案,也读了这个,我正试图找出什么最适合我的情况 我在onCreate()中启动一个服务,在这里我发出一个HTTP请求,并得到一个id作为响应。然后我广播这个id,并在我的活动中接收它 问题是,用户只需打开抽屉并选择一个选项,显然就可以导航到另一个活动,我可能会错过广播 很明显,我可以让我所有的活动都扩展一个抽象类,这个抽象类扩展了前面提到的Activity,但我不能100%肯定这是最好的解决方案。如果用户在我收到id之前决定退出应用程序怎么办 编辑:应用程序架构 用户使用打开照

我已经读了这个答案,也读了这个,我正试图找出什么最适合我的情况

我在
onCreate()
中启动一个服务,在这里我发出一个HTTP请求,并得到一个
id
作为响应。然后我广播这个
id
,并在我的活动中接收它

问题是,用户只需打开抽屉并选择一个选项,显然就可以导航到另一个活动,我可能会错过广播

很明显,我可以让我所有的活动都扩展一个抽象类,这个抽象类扩展了前面提到的
Activity
,但我不能100%肯定这是最好的解决方案。如果用户在我收到id之前决定退出应用程序怎么办

编辑:应用程序架构

  • 用户使用打开照相机应用程序并获取图像文件路径的意图捕获图像
  • FormActivity
    从用户可以添加有关图像的一些详细信息开始
  • 用户单击上载,我将用户刚刚输入的数据传递到
    QuizActivity
  • quizaActivity
    onCreate()
    中,我启动
    服务
    ,其中我:
    • 创建一个空的服务器条目,我得到一个
      id
      作为响应,然后
    • 将图像上载到服务器
  • 那个
    id
    我从服务器得到一个响应,然后广播它
  • quizaActivity
    注册了一个
    entrydReceiver
    ,其中接收
    id
    并将其存储在一个私有字段中,直到用户决定离开活动或单击上载测验(当然,如果他为测验输入了数据)
  • 如果用户单击“上载”,我将启动一个带有
    id
    和测验数据的
    IntentService
  • 如果用户打开抽屉并选择另一个
    Activity
    或单击cancel创建测验,我将启动
    IntentService
    以上载带有“空测验数据”的
    id
    ,并将用户移动到
    main Activity

问题是:如果uer在
quizaActivity
上关闭应用程序,而我还没有收到
id
,或者用户决定使用抽屉进入另一个
活动而不添加测验,该怎么办。我仍然需要启动一个服务,上传带有“空测验数据”的
id

也许你可以发送一个粘性广播。即使活动被破坏,系统也会保留它,并且您可以在注册财产时立即收到意图 接受者

但请注意,sendStickyBroadcast已被弃用,请不要忘记声明

android.permission.BROADCAST_STICKY

如果您决定使用它,请在您的AndroidManifest.xml中使用它。

通过使用抽象类,您可以在其中处理所有操作,并只向您的活动发送回调,这非常好。在我看来,在你上面的问题中使用这个例子就像是EventBus

最好使用特殊类和接口,而不是抽象类,因为您可能需要使用FragmentActivity、AppCombatActivity等。

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

public class NetRequestReceiver extends BroadcastReceiver {

private List<Activities> registeredActivities;

public static void getInstance () {
    //Continue singleton 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);
}

}
使用上面的设计,你认为我们得到了什么?我们现在有了单接收器和回调作为接口所以您可以使用Fragment、Activity、FragmentActivity和其他类,通过广播和(!)从服务接收结果,而无需复制粘贴相同的行为

另外,它看起来很不错,因为我们划分了不同的层-表示层、视图层和接收器层。您在服务中调用网络请求。该服务将结果发送到广播,然后他将数据发送到所有注册的活动


是的,它看起来像是EventBus,但根据您的问题,它正是您需要的,用于侦听从服务到不同活动的连接,并且具有更好的结构

您为什么不在
活动
中进行网络呼叫?
活动
是否绝对需要接收id?一般来说,广播是不可能的。@XaverKapeller,这样我也可以“听”其他活动,以防用户决定离开
活动
@XaverKapeller不,
活动
接收它不是绝对必要的。我只需要它,直到我从用户那里得到一些其他信息,并启动一个
IntentService
有更好的方法来做到这一点。当我回家后,我可以写下这个问题的答案,并为你的应用程序建议一个合适的架构。
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
}
}