我试图实现以下
- 一个活动启动一个后台任务(SyncAdapter),并显示一个对话框。
- 后台任务发送广播。
- 这些广播应该通过对话来截获。
什么我希望是这样的:
Dialog Broadcast
<-------------------
OK!
<-------------------
OK!
....
<-------------------
OK!
但是我所得到的是这样的:
Dialog Broadcast
<-------------------
<-------------------
....
<-------------------
(dialog dismiss)
OK!
OK!
....
OK!
正如图所示,广播都被正确发送,但在对话框关闭后才可被接收。 我希望收到他们正在显示对话框时。 换言之,步骤1和2都工作正常,但3是工作部分。 我想可能是问题是,我没有使用的广播接收器的正确的上下文。
所以我的问题是:哪方面,我应该使用订阅更新(即接收广播,不给他们),使他们能够通过对话拾起正在显示的时候吗?
我试着Activity.this
, Activity.this.getBaseContext()
和Activity.this.getApplicationContext()
dialog.getContext()
DialogFragment.getActivity()
无济于事。
只是为了澄清:我使用的广播接收器模式多次,使用它一个对话框旁边时,我只是有麻烦。
事实:
- 活性(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()
Dialog.getContext().equals(Context);
Class.isAssignableFrom(Class<?> c)
MyActivity.class.isAssignableFrom(ObjectToMatch.getClass());
我会忘了补充:
你可以随时启动对话框使用应用程序上下文:)
& 还有一件事:
涉及UI任何东西应该在UI线程所做的情况下,你会忘记与获得
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
编辑:
我看不出有任何问题: 工作液
![](https://www.manongdao.com/static/images/pcload.jpg)
这是一个BroadcastReceiver
,你适应它在你的代码。 取而代之的Activity.this
, Activity.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
。
尝试奥托
https://github.com/square/otto
从技术文档,
增强的基于番石榴事件总线重点在支持Android。
奥托是一个事件总线设计解耦应用程序的不同部分,同时还使他们能够有效地沟通。
番石榴分叉,奥托增加了独特的功能,一个已被精磨事件总线,以及它专门到Android平台。