![]() |
1
52
更新2015: 这个问题/答案仍然有一点活跃,但它已经超过5年了,事情已经发生了很大的变化。5年前,下面的答案是我应该如何处理。后来我写了一个非常轻量级的依赖注入解决方案,我使用了一段时间(我在评论中提到)。现在,我会用匕首和恶棍来回答这个问题。匕首将一个“mediator”类注入到服务和所有需要通知的活动中,服务将状态更新推送到mediator类,mediator类将暴露一个可观察的活动来使用状态更新(代替op的广播CEVER)。 原始答案 我通常对应用程序进行子类划分,让我的应用程序内通信通过这个类(或者让应用程序拥有的中介来完成工作……不管怎样,应用程序是服务通信的入口点)。我有一个绑定服务,它也需要更新ui(比你的简单得多,但想法相同),它基本上告诉应用程序它的新状态,然后应用程序可以通过某种方式将这些信息传递给当前活动。您还可以维护指向当前活动活动(如果有多个活动)的指针,并决定是否简单地更新当前活动、广播启动其他活动的意图、忽略消息等。我还将对活动进行子类划分,并让您的新活动vity基类告诉应用程序它当前是onresume中的活动类,并且它正在onpause中暂停(对于在后台运行服务并且所有活动都暂停的情况)。 编辑: 针对这一评论,这里有更多的细节。 您的应用程序目前大部分由活动派生类和服务派生类组成。从本质上讲,您可以从android.app.application类的实例获得功能。这是在清单(默认情况下)中用以下行声明的:
清单中的application元素没有使用android:name属性,因此它只是创建一个默认android.app.application类的实例来表示全局应用程序上下文。 在我的应用程序中,我创建应用程序的一个子类(例如applicationex),并通过清单告诉我的应用程序,这是要实例化为我的全局应用程序上下文的类。例如:
我现在可以向applicationex中添加用于通信的活动和服务的方法。您的全局应用程序上下文始终只有一个实例,因此,如果您的应用程序需要全局性,则这是您的起点。 第二点是,我没有从服务和活动派生我的服务和活动,而是使用getappcontext方法创建每个的子类,该方法将getapplicationcontext的返回值(这两个类中都已经存在,因为它们是从上下文派生的)强制转换为是applicationex类。 所以… 尽管如此,您还是向activity类型的applicationex类(或者activitybase,如果您像我一样对其进行子类化的话)添加了currentActivity属性。在activitybase的onresume方法中,您将自己传递给applicationex,以便它将currentactivity设置为该活动。现在,您可以在applicationex上公开方法,直接将信息传递给当前活动,而不依赖于意图机制。 我已经尽可能清楚了 |
![]() |
2
2
您可以将广播意图发送到您自己的应用程序,而不是整个系统 LocalBroadcastManager : 帮助程序注册意图广播并将其发送到进程中的本地对象。与使用SendBroadcast发送全局广播相比,它有许多优点(意图):
但是,我仍然建议您使用服务方法和本地绑定,并在必要时通过处理程序来更新ui组件以提高效率。 |
![]() |
Abhilash Das · 输入文本时,编辑文本与工具栏重叠 1 年前 |
![]() |
Community wiki · 局部变量可能尚未初始化 1 年前 |
![]() |
jvargas · 如何获取上个月的第一天和最后一天以及一年的第一天 1 年前 |