是否有一种一致的方式将数据发送到Android活动,如果尚未打开,则打开该活动?

是否有一种一致的方式将数据发送到Android活动,如果尚未打开,则打开该活动?,android,android-activity,android-lifecycle,Android,Android Activity,Android Lifecycle,我想打开一个活动并向其发送一些数据。活动可以处于其生命周期中的任何状态。我很沮丧,因为我熟悉的每种方法只有在活动处于特定状态时才有效 如果该活动当前已关闭,则我可以启动它并将数据作为附加数据发送。但如果活动已经打开,这似乎不起作用,因为您无法访问最近的意图。如果活动已经打开,那么我可以使用localbroadcast系统。但是,如果活动一开始就关闭,本地广播就不起作用 毫无疑问,我错过了一些东西。是否有人知道向活动发送数据的一致方式,如果活动尚未打开,则打开它 但如果活动已经打开,这似乎不起作用

我想打开一个活动并向其发送一些数据。活动可以处于其生命周期中的任何状态。我很沮丧,因为我熟悉的每种方法只有在活动处于特定状态时才有效

如果该活动当前已关闭,则我可以启动它并将数据作为附加数据发送。但如果活动已经打开,这似乎不起作用,因为您无法访问最近的意图。如果活动已经打开,那么我可以使用localbroadcast系统。但是,如果活动一开始就关闭,本地广播就不起作用

毫无疑问,我错过了一些东西。是否有人知道向活动发送数据的一致方式,如果活动尚未打开,则打开它

但如果活动已经打开,这似乎不起作用,因为您无法访问最近的意图

如果这是已打开的活动的新实例,则使用
getIntent()

相反,如果您使用标志或清单条目来安排将此活动的现有实例带回前台,请重写
onNewIntent()
,这样您就可以获得最新的
Intent

我想从服务中打开一个活动

从后台开始一项活动确实会激怒用户,因为你不知道用户在前台做什么。在大多数常见的情况下,您最好使用
通知进行救援

EventBus分三步执行

定义事件:

准备订阅服务器:声明并注释订阅方法, (可选)指定线程模式:

注册和注销您的订户。例如,在Android上,活动和片段通常应根据其生命周期进行注册:

 @Override
 public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this);
 }



@Override
 public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this);
 }
活动后:


阅读全文

这是单实例活动吗?如果通过“本地广播”,您指的是
LocalBroadcastManager
,则其
sendBroadcast()
方法返回一个
布尔值
,指示当前是否有为给定广播注册的接收器。如果对
活动使用唯一的广播
,适当地注册和注销其接收器,
sendBroadcast()
返回
false
,则可以
startActivity()
。我想其他事件总线实现也有类似的机制。@TheWander它不是,但也许它应该是。我使用此活动请求多个权限,然后在授予权限后导航回该活动。@MikeM。是的,这是我希望避免的事情。我能做到,但我希望有一个干净的方法。当然,我不是第一个尝试这样做的人,我错过了什么?我不知道你为什么认为这是一个复杂的问题。这只是
如果(!LocalBroadcastManager…sendBroadcast(…){startActivity(…);}
。让我看看我是否理解您的意思:我可以创建一个名为handleIntent(Intent)的新函数。然后我从onNewIntent()和onCreate()调用它,传递您描述的获取它们的最新意图。这是否涵盖了所有情况,并给出了我在所有情况下的最新意图?关于从服务打开活动:我编辑了我的问题并删除了该部分,因为它与真实问题正交。这实际上是一个向用户请求多个权限的活动,我希望在授予每个权限后,通过确认重定向到该活动。其中一个权限来自服务,另一个来自广播接收器,另一个来自后台线程。我只想找到一种方法来打开“活动”,并向其传递一些在任何地方都有效的数据。@Tyler:“这会涵盖所有情况,并给出所有情况下的最新意图吗?”--应该是的。很高兴知道这一点。但是,除非我弄错了,否则只有在活动已经激活的情况下,这才有效,对吗?你在问题中提到,如果活动没有激活,你就可以启动活动,所以我只是向你展示了路径。
@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(MessageEvent event) {/* Do something */};
 @Override
 public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this);
 }



@Override
 public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this);
 }
EventBus.getDefault().post(new MessageEvent());