广播接收器方面与对话(BroadcastReceiver context with dialog)

2019-10-23 15:09发布

我试图实现以下

  1. 一个活动启动一个后台任务(SyncAdapter),并显示一个对话框。
  2. 后台任务发送广播。
  3. 这些广播应该通过对话来截获。

什么我希望是这样的:

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()无济于事。

只是为了澄清:我使用的广播接收器模式多次,使用它一个对话框旁边时,我只是有麻烦。

Answer 1:

事实:

  • 活性(A)示出DIALOG(d)
  • 未知类型(东西)命名的后台任务的(T)
  • (T)发送广播TO广播接收器(R)
  • (R)应该DISMISS(d)

问题:

  • (T)你的意思是类从AbstractThreadedSyncAdapter衍生?
  • 你莫名其妙的(T)和show(d)开始后完成(A)?

结论:

  • 无论如果你的(A)你做什么创建和显示(d)负责解雇(d)做它得到的onStop()之前的状态
  • 如果换句话说活动将不被解雇对话框死了,你会得到
android.view.WindowLeaked exception will be thrown. 
  • &当您尝试操作的对话框,你会得到:
java.lang.IllegalArgumentException: View not attached to window manager 

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

  • 你总是可以检查哪些方面是通过方法分配给对话框
Dialog.getContext() 
  • USEN它来搭配其他的上下文
Dialog.getContext().equals(Context); 
  • 也u可以使用类方法
Class.isAssignableFrom(Class<?> c) 
  • 如果u想匹配上下文类(例如活动u使用)
MyActivity.class.isAssignableFrom(ObjectToMatch.getClass()); 

我会忘了补充:

你可以随时启动对话框使用应用程序上下文:)

& 还有一件事:

涉及UI任何东西应该在UI线程所做的情况下,你会忘记与获得

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

编辑:

我看不出有任何问题: 工作液



Answer 2:

这是一个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



Answer 3:

尝试奥托

https://github.com/square/otto

从技术文档,

增强的基于番石榴事件总线重点在支持Android。

奥托是一个事件总线设计解耦应用程序的不同部分,同时还使他们能够有效地沟通。

番石榴分叉,奥托增加了独特的功能,一个已被精磨事件总线,以及它专门到Android平台。



文章来源: BroadcastReceiver context with dialog