问题标签 [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.

0 投票
0 回答
446 浏览

android - 尝试结束 Screencast 后 android.com.systemui 中的 ANR

出于某种奇怪的原因,我不完全确定为什么,我不仅得到了我的应用程序的 ANR,还得到了整个 systemui 的 ANR。太糟糕了,我必须重新启动,重新启动后它必须“优化”我所有的应用程序,就像它损坏了某些东西一样(任何人都可以解释为什么会发生这种情况?)。

我假设我的部分代码非常糟糕以至于它们导致了这种情况,但是即使是恶意代码也应该能够使 systemui 过载吗?反正...

我正在做的是我正在尝试启动一项服务来处理屏幕录制。活动(来自片段)请求许可(获得许可,我在屏幕右上角看到 Screencast 图标),然后它绑定一个处理任何状态更改的服务。我所说的状态变化的意思是......

状态:

  • Dead - 意味着它需要被初始化和准备
  • 活着 - 意味着它需要启动并完全初始化/准备好
  • 已开始 - 表示当前正在录制。
  • 暂停 - 意味着它将在重新开始后开始一个新视频,它将所有临时视频合并为一个(尚未制定出详细信息)。
  • 已停止 - 意味着将所有文件合并为一个,然后通过广播中的意图发送 URI(还没有到这一步)。

它从死 -> 活着 -> 开始 <-> 暂停 -> 停止 -> 死。至少这是总体计划。我计划有一个浮动按钮作为远程控制服务,因此在接收器(本地)上广播到等待它完成的我的片段。

现在,我打算拥有的东西已经够多了,让我们进入我现在拥有的东西。有点乱,我以前从来没有做过这种事情,所以我在这里问。当我说我已经尝试了很多东西时,请相信我,不幸的是,测试新解决方案的唯一方法是重新启动并等待 15 分钟,而 Android 会再次优化所有内容。现在我知道它是一个“长”代码段,但我会说它崩溃的一个地方是 stopRecording(),在第 216 行。

代码在这里

让我知道是否应该进行任何更改。

最后:是否应该在另一个线程上运行这些?这可能是问题吗?为什么应用程序不会只崩溃而不是systemui?

0 投票
1 回答
55 浏览

android - 如何确保当前在前台的任何应用程序活动接收消息

我希望Activities当前处于前台的任何应用程序都可以接收消息。

所以我正在发送一个LocalBroadcastManager在我的应用程序中分发消息。然后我的想法是拥有BaseActivity所有其他Activities必须扩展的东西。在BaseActivityin 中onResume,接收者已registerReceiver为消息注册 ( ),而unregisterReceiver在 中未注册 ( ) onPause

这将始终有效,但当消息仅在Activities发生转换的时隙中分发时无效,前一个Activity在它之后onPause,下一个Activity在它之前onResume

所以我想用sendStickyBroadcast这样的消息会等到有些Activity人没有把它拿出来,但我明白了

此方法在 API 级别 21 中已弃用。

那么如何确保当前在前台的任何应用程序的活动都能接收到消息。

0 投票
0 回答
574 浏览

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 客户端。

任何帮助将不胜感激。

0 投票
1 回答
348 浏览

broadcastreceiver - LocalBroadcastManager 可以在同一个 App 中向全局 BroadcastReceivers 发送 Intent 吗?

如果 LocalBroadcastManager 驻留在同一个 App 中,它可以向全局注册的 BroadcastReceiver 发送 Intent 吗?或者我必须为此使用 context.sendBroadcast() 吗?

0 投票
2 回答
495 浏览

android - 尽管使用 Looper.getMainLooper(),LocalBroadcast 无法在工作线程中工作

我正在尝试在屏幕上显示进度条的屏幕(例如活动 A)上工作,并且我需要在进度条运行时将广播发送到不同的活动(活动 B)broadcastReceiver。如果活动 B 中的功能完成,它将显示回活动 A。

现在我在这样的工作线程中运行进度条并使用处理程序(Looper.getMainLooper())发送本地广播:

但它不起作用。其他活动未接收到广播。我知道广播应该在 UI 线程上完成,如果我在 onResume() 或 onCreate() 方法中完成它工作正常。但是当我在线程内的处理程序中使用它时(在 onCreate() 内)它不起作用。

我做错了什么还是有其他方法可以做到这一点?

编辑

我在活动 B 中收到我的意图,如下所示:

0 投票
1 回答
932 浏览

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 已经关闭它。也许我还没有理解这种事情是如何工作的,所以非常欢迎任何建议。

再次感谢你的帮助!

0 投票
0 回答
374 浏览

java - Android LocalBroadcast 管理器 onReceive 不起作用

我试图在我的 android 服务类中使用 localbroadcastreceivers。但是当它运行时,主活动中的 onReceive 方法不会被调用。我看过几个例子和教程,但找不到问题。

主要活动

onCreate 方法

测试服务类

0 投票
1 回答
76 浏览

android - BroadcastReceiver - 无法获得更改背景的按钮

我有一个活动和一个服务。

在我的活动中,一个按钮与服务交互以启动/停止 GPS 记录。

我的服务有 3 个状态指示器:一个用于连接到 Google Play 服务,一个用于主动记录 GPS,一个用于处理记录的内容。

当连接到 Google Play 服务时,服务流程是这样的:

就绪 -> 记录 -> 处理 -> 就绪

该服务将按如下方式广播这些状态:

我的活动收到如下状态:

然后是我的问题。在HandleTripStatus()下面发布的 中,我更改了按钮的文本和背景以反映服务当前正在执行的操作。这适用于第一种和第三种情况。尽管接收到正确的布尔值,但我从未看到绘制第二个背景。

为了调试问题,我验证了以下内容:

  • 正确定义了文本和背景资源(即尝试使用它而不是第一种和第三种情况有效)
  • if-else 条件在预期时运行(即“else if”条件实际上在我期望的时候运行。通过断点验证。)
  • 在此过程中不使用其他 if-else 条件。(即,运行正确的条件。)

其他一些可能相关的代码:

这就是 Activity 请求停止 GPS 记录的方式(在完成之前导致处理步骤)

这是从 Activity 接收到消息后在 Service 中发生的结构。

我完全没有想法。原因可能是什么?为什么按钮背景在 else-if 中没有变化?

0 投票
2 回答
1267 浏览

android - 无法从 IntentService 更新 UI

一个看似简单的要求 - 从IntentService. 在下面的截图中,当Start Service单击按钮时,我需要ProgressBar在唯一的上方显示一个,TextView然后在延迟后删除ProgressBar.

AVD 截图

在 SO 上找到了很多答案,但不知何故仍然无法破解它。我从中了解到LocalBroadcastManager一个很好的方法。我也尝试过遵循这个,(使用Handlers 的方法),但它也没有显示ProgressBar出来。最后,基于这个答案,这就是我的结果。在完成所有日志记录之后,我到目前为止管理的输出只是Toast连续出现的 s 。

非常感谢您能指出我哪里出错了,现在已经挣扎了很长时间。提前谢谢了!

MainActivity更新

IntentService更新

activity_main.xml

AndroidManifest

0 投票
0 回答
71 浏览

android - android LocalBroadcast 没有随机收到一些时间

我正在监听媒体挂载和卸载事件,如下所示

当预期的事件发生时,onReceive发送LocalBroadcast一个应该在MainActivity

意图过滤器和LocalBroadcast注册如下

问题是当usb快速插入和拔出时,会android.intent.action.MEDIA_EJECT接收并LocalBroadcast发送事件。但是LocalBroadcast接收器没有收到MainActivity