问题标签 [localbroadcastmanager]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - 尝试结束 Screencast 后 android.com.systemui 中的 ANR
出于某种奇怪的原因,我不完全确定为什么,我不仅得到了我的应用程序的 ANR,还得到了整个 systemui 的 ANR。太糟糕了,我必须重新启动,重新启动后它必须“优化”我所有的应用程序,就像它损坏了某些东西一样(任何人都可以解释为什么会发生这种情况?)。
我假设我的部分代码非常糟糕以至于它们导致了这种情况,但是即使是恶意代码也应该能够使 systemui 过载吗?反正...
我正在做的是我正在尝试启动一项服务来处理屏幕录制。活动(来自片段)请求许可(获得许可,我在屏幕右上角看到 Screencast 图标),然后它绑定一个处理任何状态更改的服务。我所说的状态变化的意思是......
状态:
- Dead - 意味着它需要被初始化和准备
- 活着 - 意味着它需要启动并完全初始化/准备好
- 已开始 - 表示当前正在录制。
- 暂停 - 意味着它将在重新开始后开始一个新视频,它将所有临时视频合并为一个(尚未制定出详细信息)。
- 已停止 - 意味着将所有文件合并为一个,然后通过广播中的意图发送 URI(还没有到这一步)。
它从死 -> 活着 -> 开始 <-> 暂停 -> 停止 -> 死。至少这是总体计划。我计划有一个浮动按钮作为远程控制服务,因此在接收器(本地)上广播到等待它完成的我的片段。
现在,我打算拥有的东西已经够多了,让我们进入我现在拥有的东西。有点乱,我以前从来没有做过这种事情,所以我在这里问。当我说我已经尝试了很多东西时,请相信我,不幸的是,测试新解决方案的唯一方法是重新启动并等待 15 分钟,而 Android 会再次优化所有内容。现在我知道它是一个“长”代码段,但我会说它崩溃的一个地方是 stopRecording(),在第 216 行。
代码在这里。
让我知道是否应该进行任何更改。
最后:是否应该在另一个线程上运行这些?这可能是问题吗?为什么应用程序不会只崩溃而不是systemui?
android - 如何确保当前在前台的任何应用程序活动接收消息
我希望Activities
当前处于前台的任何应用程序都可以接收消息。
所以我正在发送一个LocalBroadcastManager
在我的应用程序中分发消息。然后我的想法是拥有BaseActivity
所有其他Activities
必须扩展的东西。在BaseActivity
in 中onResume
,接收者已registerReceiver
为消息注册 ( ),而unregisterReceiver
在 中未注册 ( ) onPause
。
这将始终有效,但当消息仅在Activities
发生转换的时隙中分发时无效,前一个Activity
在它之后onPause
,下一个Activity
在它之前onResume
。
所以我想用sendStickyBroadcast
这样的消息会等到有些Activity
人没有把它拿出来,但我明白了
此方法在 API 级别 21 中已弃用。
那么如何确保当前在前台的任何应用程序的活动都能接收到消息。
android - 无法从工作线程向主线程发送广播
我正在尝试实现一种类似于 2015 年 Android 开发者峰会上提出的架构:https ://github.com/yigit/dev-summit-architecture-demo 。我的应用程序有一个处理网络请求的简单类。该类对请求使用 Retrofit 2。我也在使用 Dagger 2 进行依赖注入。
我正在尝试实现一些非常简单的事情。我的活动告诉控制器获取数据。然后控制器调用我的 REST 客户端以执行网络请求。当请求成功完成时,我想向我的 Activity 广播一个事件,以便它可以更新 UI。但是,该事件没有被广播。
我正在使用 LocalBroadcastManager 广播事件。我的活动在 onResume/onPause 方法中注册/取消注册广播。我的 REST 客户端有一个通过依赖注入提供的应用程序上下文实例。REST 客户端使用应用程序上下文来发送广播。
我的第一个怀疑是没有发送广播,因为网络请求是在工作线程上执行的,而活动期望在主线程上进行广播。但是,如果 Android 文档是正确的,这种情况应该不会有问题。
这是我的活动。
这是我的 REST 客户端。
任何帮助将不胜感激。
broadcastreceiver - LocalBroadcastManager 可以在同一个 App 中向全局 BroadcastReceivers 发送 Intent 吗?
如果 LocalBroadcastManager 驻留在同一个 App 中,它可以向全局注册的 BroadcastReceiver 发送 Intent 吗?或者我必须为此使用 context.sendBroadcast() 吗?
android - 尽管使用 Looper.getMainLooper(),LocalBroadcast 无法在工作线程中工作
我正在尝试在屏幕上显示进度条的屏幕(例如活动 A)上工作,并且我需要在进度条运行时将广播发送到不同的活动(活动 B)broadcastReceiver。如果活动 B 中的功能完成,它将显示回活动 A。
现在我在这样的工作线程中运行进度条并使用处理程序(Looper.getMainLooper())发送本地广播:
但它不起作用。其他活动未接收到广播。我知道广播应该在 UI 线程上完成,如果我在 onResume() 或 onCreate() 方法中完成它工作正常。但是当我在线程内的处理程序中使用它时(在 onCreate() 内)它不起作用。
我做错了什么还是有其他方法可以做到这一点?
编辑
我在活动 B 中收到我的意图,如下所示:
android - 在尚未创建类时管理 LocalBroadcastManager
我在 android 上有一个基本的水平,但我仍然无法理解应用程序的生命周期。所以我正在做这个测试。
假设我有一个包含三个类的应用程序:MainActivity、A 类和 B 类。
A 类接收“外部”意图。我已经在清单中定义了接收器,它运行良好。现在,我想要的是,当 A 类接收和意图时,它应该使用 LocalBroadcastManager 发送“本地”意图。如果我在 Main Activity 类上注册接收器,它可以工作(它接收本地意图),所以我知道注册接收器的代码是可以的。但是,如果我在 B 类上这样做,它永远不会到达。这是完全正常的,因为我从未在任何地方使用/定义过 B 类,因此,由于 B 类从未以任何方式执行,因此接收者永远不会被注册。
现在,这是我的问题(如果我要说的是错误的,请纠正我,因为我不确定我是否理解它):
由于我们不知道外部意图何时到来,可能主 Activity(或 B 类,如果它被定义为 Activity,例如)被销毁。但是,意图总是会到达 A 类,因为我们将接收器部分放在清单中,它将广播本地意图。A 类应该怎么做才能确保其他类收到它?(特别是如果我希望接收者进入 B 类) B 类是否应该类似于单例,以确保存在一个且只有一个 B 类,然后 A 类可以在发送意图之前检查并根据需要创建 B 类? 会有更好的方法来做到这一点吗?也许在这种情况下不考虑使用本地广播(当接收器可能不存在时)?
简而言之,我想要的是有一个不在主要活动中的类,并且可以随时接收本地广播的意图,即使应用程序没有被积极使用并且 Android 已经销毁/暂停/等等它。
谢谢你的帮助!
更新:我会放一些代码,这样我就可以告诉你我想要什么。
首先,这是类 ExternalReceiver(我之前称之为 A 类)。此类仅接收外部意图并在我的应用程序中广播本地意图:
然后,这是我的 MainActivity 类。如果我取消注释 registerReceiver,MainActivity 将正确接收本地意图并记录“文本”的内容。我的问题是,如果活动被破坏,那么本地意图就不会到达这里(如果另一个类是接收者,我也更喜欢):
现在,这是 LocalReceiver(我之前称为 B 的类)。我想要的是在这里接收本地意图。因为我从来没有使用过这个类(不在清单中也没有在代码中)它永远不会到达这里,所以现在它永远不会收到意图。我也扩展了 Activity,但我没有把它放在清单中。事实上,我不需要它成为一个活动,但我认为它可能会很好,因为这样我就可以覆盖 onCreate。非常欢迎提出建议,因为我应该如何定义这个类:
最后这是我的清单:
现在,为了测试所有内容,我将通过 adb 发送此意图:
我想要的是:
- 在 ExternalReceiver 上有一个接收器,因此它只听一些意图(在我的示例中为 com.testapp.localbroadcast.TEST)。现在可以了。
- 然后 ExternalReceiver 应该向应用程序中的其他类 (LocalReceiver) 广播本地意图。
- 该类 (LocalReceiver) 接收意图,然后只是做某事(可能甚至不更新任何 UI)。
我的问题:
- 我想确保接收本地意图的类即使在很长一段时间后也能正常工作。例如,如果活动不存在,则 ExternalReceiver 应该做一些事情来确保其他类接收本地意图。我的猜测:让 LocalReceiver 成为一个活动,然后,如果需要,ExternalReceiver 类应该在它不存在时启动它。即使 MainActivity 被破坏,我仍然不明白 ExternalReceiver 是如何工作的。不应该在任何 ExternalReceiver 开始工作后立即创建或恢复 MainActivity 吗?
我在 Main Activity 中做了一个以前的版本,只要一切都存在,一切正常。现在我想分离我的代码并让它准备好工作,即使 Android 已经关闭它。也许我还没有理解这种事情是如何工作的,所以非常欢迎任何建议。
再次感谢你的帮助!
java - Android LocalBroadcast 管理器 onReceive 不起作用
我试图在我的 android 服务类中使用 localbroadcastreceivers。但是当它运行时,主活动中的 onReceive 方法不会被调用。我看过几个例子和教程,但找不到问题。
主要活动
onCreate 方法
测试服务类
android - BroadcastReceiver - 无法获得更改背景的按钮
我有一个活动和一个服务。
在我的活动中,一个按钮与服务交互以启动/停止 GPS 记录。
我的服务有 3 个状态指示器:一个用于连接到 Google Play 服务,一个用于主动记录 GPS,一个用于处理记录的内容。
当连接到 Google Play 服务时,服务流程是这样的:
就绪 -> 记录 -> 处理 -> 就绪
该服务将按如下方式广播这些状态:
我的活动收到如下状态:
然后是我的问题。在HandleTripStatus()
下面发布的 中,我更改了按钮的文本和背景以反映服务当前正在执行的操作。这适用于第一种和第三种情况。尽管接收到正确的布尔值,但我从未看到绘制第二个背景。
为了调试问题,我验证了以下内容:
- 正确定义了文本和背景资源(即尝试使用它而不是第一种和第三种情况有效)
- if-else 条件在预期时运行(即“else if”条件实际上在我期望的时候运行。通过断点验证。)
- 在此过程中不使用其他 if-else 条件。(即,只运行正确的条件。)
其他一些可能相关的代码:
这就是 Activity 请求停止 GPS 记录的方式(在完成之前导致处理步骤)
这是从 Activity 接收到消息后在 Service 中发生的结构。
我完全没有想法。原因可能是什么?为什么按钮背景在 else-if 中没有变化?
android - 无法从 IntentService 更新 UI
一个看似简单的要求 - 从IntentService
. 在下面的截图中,当Start Service
单击按钮时,我需要ProgressBar
在唯一的上方显示一个,TextView
然后在延迟后删除ProgressBar
.
在 SO 上找到了很多答案,但不知何故仍然无法破解它。我从中了解到这是LocalBroadcastManager
一个很好的方法。我也尝试过遵循这个,(使用Handler
s 的方法),但它也没有显示ProgressBar
出来。最后,基于这个答案,这就是我的结果。在完成所有日志记录之后,我到目前为止管理的输出只是Toast
连续出现的 s 。
非常感谢您能指出我哪里出错了,现在已经挣扎了很长时间。提前谢谢了!
MainActivity
更新
IntentService
更新
activity_main.xml
AndroidManifest
android - android LocalBroadcast 没有随机收到一些时间
我正在监听媒体挂载和卸载事件,如下所示
当预期的事件发生时,onReceive
发送LocalBroadcast
一个应该在MainActivity
意图过滤器和LocalBroadcast注册如下
问题是当usb快速插入和拔出时,会android.intent.action.MEDIA_EJECT
接收并LocalBroadcast
发送事件。但是LocalBroadcast
接收器没有收到MainActivity