带对话框的BroadcastReceiver上下文

时间:2015-07-02 13:53:17

标签: android android-alertdialog

我正在努力实现以下目标

  1. 活动启动后台任务(SyncAdapter)并显示一个对话框。
  2. 后台任务发送广播。
  3. 这些广播应该被对话框拦截。
  4. 我期望的是:

    Dialog           Broadcast
      <-------------------
     OK!
      <-------------------
     OK!
    
             ....
    
      <-------------------
     OK!
    

    但我得到的是:

    Dialog           Broadcast
      <-------------------
      <-------------------
    
             ....
    
      <-------------------
    
        (dialog dismiss)
    
     OK!
     OK!
    
             ....
     OK!
    

    如图所示,广播正在正确发送,但只有在解除对话后才会收到广播。我希望在显示对话框时收到它们。换句话说,步骤1和2工作正常,但3.正在部分工作。我认为可能是问题是我没有使用适当的上下文广播。

    所以我的问题是:我应该使用哪个上下文来订阅更新(即接收广播,而不是发送它们),以便在显示时可以通过对话框拾取它们?

    我尝试过Activity.thisActivity.this.getBaseContext()Activity.this.getApplicationContext()dialog.getContext()DialogFragment.getActivity()无效。

    只是为了澄清:我多次使用BroadcastReceiver模式,在对话框中使用它时遇到了麻烦。

3 个答案:

答案 0 :(得分:1)

事实:

  • ACTIVITY(A)显示DIALOG(D)
  • 名为BACKGROUND TASK(T)
  • 的未知类型(SOMTHING)
  • (T)SENDS BROADCAST到BROADCASTRECEIVER(R)
  • (R)应该解散(D)

<强>问题:

  • (T)你的意思是来自AbstractThreadedSyncAdapter的CLASS DERIVED?
  • 在(T)开始并显示(D)之后,您是否完成了(A)?

结论:

  • 无论你做什么,如果你的(A)创建并显示(D)它有责任解雇(D)&amp;要做到这一点,请进入onStop()状态
  • 换句话说,如果活动将在没有被解雇的对话的情况下死亡,那么
android.view.WindowLeaked exception will be thrown.
  • &安培;当你尝试操纵对话框时,你会得到:
java.lang.IllegalArgumentException: View not attached to window manager

您问题的第二部分,涉及上下文

  • 您始终可以通过方法
  • 检查将哪个上下文分配给Dialog
Dialog.getContext()
  • 使用它来匹配其他上下文
Dialog.getContext().equals(Context);
  • 你也可以使用Class方法
Class.isAssignableFrom(Class<?> c)
  • 如果你想将上下文与类匹配(例如活动你使用)
MyActivity.class.isAssignableFrom(ObjectToMatch.getClass());

我会忘记添加:

你总是使用宣传语言开始对话:)

&安培;还有一件事:

任何涉及UI的东西都要在UI THREAD 上完成,万一你会忘记&amp;得到

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

修改

我没有看到任何问题:工作解决方案 THREAD CALLING RECEIVER

答案 1 :(得分:0)

这是BroadcastReceiver,您可以根据代码进行调整。而不是Activity.thisActivity.this.getBaseContext()Activity.this.getApplicationContext(),您应该使用Context,如下所示:

class BroadCastReceiverTest extends BroadcastReceiver {
Context context;
public void onReceive(Context c, Intent intent) {
    this.context = c;

}

现在您必须使用this.context作为Context

答案 2 :(得分:0)

尝试 Otto

https://github.com/square/otto

来自文档,

  

增强的基于Guava的事件总线,重点是Android支持。

     

Otto是一种活动总线,旨在解耦您的不同部分   申请,同时仍然允许他们有效沟通。

     

从番石榴分叉,奥托为已经添加了独特的功能   精致的活动总线以及专门的Android平台。