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

时间:2016-07-13 16:17:37

标签: android

我已经阅读了这个答案here以及此here,我正在试图找出最适合我案例的答案。

我在<?php include("./inc/connect.inc.php"); if(isset($_POST['comment_area'])) { $update = mysqli_real_escape_string($mysqli, $_POST['comment_area']); $sql = "update comments set comment_area='$update' Where id='".$_POST['id']."'"; $result = mysqli_query($mysqli, $sql); } ?> 内启动了一个服务,在那里我发出了HTTP请求,我得到一个onCreate()作为响应。然后我播放了这个id并在我的活动中收到它。

问题是用户显然可以通过打开抽屉并选择一个选项来导航到另一个活动,我可以错过广播。

我显然可以让我的所有活动扩展一个扩展id的抽象类,就像提到here一样,但我并不是100%确定它是最好的解决方案。如果用户在收到ID之前决定退出应用程序该怎么办?

修改:应用程序架构

  • 用户使用Intent捕获图像以打开相机应用程序并获取图像文件的路径。
  • Activity从用户可以添加有关图像的一些详细信息开始。
  • 用户点击上传,我将用户刚刚输入的数据传递给FormActivity
  • QuizActivity的{​​{1}}中,我开始onCreate(),其中我:
    • 创建一个到服务器的空条目,我得到一个QuizActivity作为回复和
    • 将图片上传到服务器
  • 我从服务器获得Service作为响应然后广播它。
  • id已注册id,其中会收到QuizActivity并将其存储在私人字段中,直到用户决定离开活动或点击上传测验(如果他输入了数据)当然是为了测验)
  • 如果用户点击上传,我会使用entryIdReceiver和测验数据开始id
  • 如果用户打开抽屉并选择其他IntentService或点击取消创建测验,我会开始id上传Activity“空测验数据”并将用户移至{ {1}}。

问题是:如果您在IntentService上关闭应用并且我还没有收到id,或者用户决定使用抽屉而不添加另一个MainActivity,该怎么办?一个测验。我仍然需要启动服务并使用“空测验数据”上传QuizActivity

2 个答案:

答案 0 :(得分:2)

通过使用抽象类来处理所有操作,并将回调发送到您的活动,这非常好。在上面的问题中使用该示例在我看来就像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);
}

}

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

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

答案 1 :(得分:1)

也许你可以发送一个粘性广播。系统将保持它甚至被破坏的活动,你可以立即收到你的注册属性的意图 接收机。

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

android.permission.BROADCAST_STICKY
如果您决定使用它,请在 AndroidManifest.xml