- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一项服务可以获取用户的位置并在 Intent 中广播纬度和经度。
我认为我需要该服务成为启动服务(而不是绑定(bind)服务),因为我希望它能够在来自 firebase 的新 geoFire 条目进入用户半径时向用户发送推送通知即使应用程序关闭。
目前,该服务已设置为广播位置。
鉴于位置服务将是一项启动服务,我不知道如何从两个单独的 Activity 访问广播。
我相信,如果它是一个绑定(bind)服务,我可以实现这一目标,但由于我希望它无限期地保持活力,我不确定该怎么做。
这是一个minimal example that demonstrates my issue .
具体来说,我可以通过注册一个广播接收器来获得在第一个 Activity 上显示的经纬度,但是我无法通过注册一个单独的广播接收器来获得在第二个 Activity 上显示的经纬度。
我已阅读 Android's documentation on Services但仍然不知道我应该怎么做才能解决这个问题。
我一直在 Android Studio 的模拟器上测试这一切:Nexus 5X API 25 x86。
2017 年 11 月 8 日更新:我更新了 github 项目以包含下面提供的 EventBus 解决方案。它在 eventBus 分支中。 master 分支仍然包含与问题相关的已更改、有问题的代码。
查看:
git clone https://github.com/Atticus29/locationServiceMCV.git
git checkout eventBus
然后,打开 AndroidStudio 或所选的 IDE 并像往常一样查看/运行。
最佳答案
广播结果是解决此问题的一种方法。但是如果你愿意在你的项目中添加一个库,我会强烈推荐 Green Robot's EventBus .这是一个非常轻量级的库,因为它速度很快。此外,通过它发布复杂对象也很简单,而无需实现 Parcelable
界面。
此库以发布者/订阅者的方式工作,在您的情况下,两个 Activity 都是订阅者,而 Service 将是发布者。
首先,您必须添加对build.gradle
文件的依赖,如下所示。
implementation 'org.greenrobot:eventbus:3.0.0'
如果你在一个 Kotlin 项目上,还要添加这个依赖:
kapt 'org.greenrobot:eventbus-annotation-processor:3.0.1'
然后,定义一个事件类,负责在应用程序中传输您的数据。请注意,这可以从 Service
到 Activity
完成。从一个 Fragment
到另一个。在 Activity 之间,等等。
public class MessageEvent {
public double lat;
public double lng;
// Add additional fields here if needed
public MessageEvent(double lat, double lng) {
this.lat= lat;
this.lng = lng;
}
}
之后,您必须在您的 Activity
上订阅这些事件。
public class MyActivity extends AppCompatActivity {
// ...
@Override
public void onResume() {
super.onResume();
// This line will register your Activity to the EventBus
// making sure that all the methods annotated with @Subscribe
// will be called if their specific Events are posted.
EventBus.getDefault().register(this);
}
@Override
public void onPause() {
super.onPause();
// This line will unregister your Activity.
// It's a good practice to put this on the onPause() method
// to make your event handling system tied to the Activity lifecycle.
EventBus.getDefault().unregister(this);
}
// The threadMode MAIN makes sure this method is called on the main Thread.
// But you could also set it up to be called on other threads if needed. Check the docs for more info.
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
/* Call this line below if you want to remove the sticky event.
* That will prevent that this event will be seen by other subscribers once they subscribe.
* In your specific use case, you don't have to remove the sticky event here.
*/
// EventBus.getDefault().removeStickyEvent(event);
double lat = event.lat;
double lng = event.lng;
// Do whatever you want with the data.
};
}
实现后,您就可以发布您的 Activity 了。现在,在您的 Service
中,当您获得新的 Lat/Lng 信息时调用以下代码。
EventBus.getDefault().postSticky(new MessageEvent(lat,lng));
您可以阅读有关如何设置和自定义 EventBus 的更多信息 on the docs , 或 this tutorial .
关于android - 从 Android 中的两个不同 Activity 访问已启动服务的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47147833/
我最近在/ drawable中添加了一些.gifs,以便可以将它们与按钮一起使用。这个工作正常(没有错误)。现在,当我重建/运行我的应用程序时,出现以下错误: Error: Gradle: Execu
Android 中有返回内部存储数据路径的方法吗? 我有 2 部 Android 智能手机(Samsung s2 和 s7 edge),我在其中安装了一个应用程序。我想使用位于这条路径中的 sqlit
这个问题在这里已经有了答案: What's the difference between "?android:" and "@android:" in an android layout xml f
我只想知道 android 开发手机、android 普通手机和 android root 手机之间的实际区别。 我们不能从实体店或除 android marketplace 以外的其他地方购买开发手
自Gradle更新以来,我正在努力使这个项目达到标准。这是一个团队项目,它使用的是android-apt插件。我已经进行了必要的语法更改(编译->实现和apt->注释处理器),但是编译器仍在告诉我存在
我是android和kotlin的新手,所以请原谅要解决的一个非常简单的问题! 我已经使用导航体系结构组件创建了一个基本应用程序,使用了底部的导航栏和三个导航选项。每个导航选项都指向一个专用片段,该片
我目前正在使用 Facebook official SDK for Android . 我现在正在使用高级示例应用程序,但我不知道如何让它获取应用程序墙/流/状态而不是登录的用户。 这可能吗?在那种情
我在下载文件时遇到问题, 我可以在模拟器中下载文件,但无法在手机上使用。我已经定义了上网和写入 SD 卡的权限。 我在服务器上有一个 doc 文件,如果用户单击下载。它下载文件。这在模拟器中工作正常但
这个问题在这里已经有了答案: What is the difference between gravity and layout_gravity in Android? (22 个答案) 关闭 9
任何人都可以告诉我什么是 android 缓存和应用程序缓存,因为当我们谈论缓存清理应用程序时,它的作用是,缓存清理概念是清理应用程序缓存还是像内存管理一样主存储、RAM、缓存是不同的并且据我所知,缓
假设应用程序 Foo 和 Eggs 在同一台 Android 设备上。任一应用程序都可以获取设备上所有应用程序的列表。一个应用程序是否有可能知道另一个应用程序是否已经运行以及运行了多长时间? 最佳答案
我有点困惑,我只看到了从 android 到 pc 或者从 android 到 pc 的例子。我需要制作一个从两部手机 (android) 连接的 android 应用程序进行视频聊天。我在想,我知道
用于使用 Android 以编程方式锁定屏幕。我从 Stackoverflow 之前关于此的问题中得到了一些好主意,并且我做得很好,但是当我运行该代码时,没有异常和错误。而且,屏幕没有锁定。请在这段代
文档说: android:layout_alignParentStart If true, makes the start edge of this view match the start edge
我不知道这两个属性和高度之间的区别。 以一个TextView为例,如果我将它的layout_width设置为wrap_content,并将它的width设置为50 dip,会发生什么情况? 最佳答案
这两个属性有什么关系?如果我有 android:noHistory="true",那么有 android:finishOnTaskLaunch="true" 有什么意义吗? 最佳答案 假设您的应用中有
我是新手,正在尝试理解以下 XML 代码: 查看 developer.android.com 上的文档,它说“starStyle”是 R.attr 中的常量, public static final
在下面的代码中,为什么当我设置时单选按钮的外观会发生变化 android:layout_width="fill_parent" 和 android:width="fill_parent" 我说的是
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
假设我有一个函数 fun myFunction(name:String, email:String){},当我调用这个函数时 myFunction('Ali', 'ali@test.com ') 如何
我是一名优秀的程序员,十分优秀!