Android 使用广播意图/广播接收器从服务向活动发送消息

Android 使用广播意图/广播接收器从服务向活动发送消息,android,android-intent,broadcastreceiver,Android,Android Intent,Broadcastreceiver,所以我理解(我认为)广播意图和接收信息给他们 所以现在,我的问题/我无法解决的是如何从接收者的onReceive方法向活动发送消息。假设我有一个这样的接收器: public class ReceiveMessages extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAc

所以我理解(我认为)广播意图和接收信息给他们

所以现在,我的问题/我无法解决的是如何从接收者的
onReceive
方法向活动发送消息。假设我有一个这样的接收器:

public class ReceiveMessages extends BroadcastReceiver 
{
@Override
   public void onReceive(Context context, Intent intent) 
   {    
       String action = intent.getAction();
       if(action.equalsIgnoreCase(TheService.DOWNLOADED)){    
           // send message to activity
       }
   }
}
我如何向活动发送消息

我是否必须在我想要向其发送消息的活动中实例化接收者并以某种方式对其进行监视?还是怎样我理解这个概念,但不是真正的应用程序

任何帮助都会非常令人惊讶,谢谢


Tom

编辑了更正了注册/注销
广播接收器的代码示例,并删除了清单声明

ReceiveMessages
定义为
活动
中的一个内部类,该类需要侦听来自
服务的消息

然后,声明类变量,例如

ReceiveMessages myReceiver = null;
Boolean myReceiverIsRegistered = false;
onCreate()
中使用
myReceiver=newreceivemessages()

然后在
onResume()

if (!myReceiverIsRegistered) {
    registerReceiver(myReceiver, new IntentFilter("com.mycompany.myapp.SOME_MESSAGE"));
    myReceiverIsRegistered = true;
}
if (myReceiverIsRegistered) {
    unregisterReceiver(myReceiver);
    myReceiverIsRegistered = false;
}
Intent i = new Intent("com.mycompany.myapp.SOME_MESSAGE");
sendBroadcast(i);
…并在
onPause()中

if (!myReceiverIsRegistered) {
    registerReceiver(myReceiver, new IntentFilter("com.mycompany.myapp.SOME_MESSAGE"));
    myReceiverIsRegistered = true;
}
if (myReceiverIsRegistered) {
    unregisterReceiver(myReceiver);
    myReceiverIsRegistered = false;
}
Intent i = new Intent("com.mycompany.myapp.SOME_MESSAGE");
sendBroadcast(i);
服务中
创建并广播
意图

if (!myReceiverIsRegistered) {
    registerReceiver(myReceiver, new IntentFilter("com.mycompany.myapp.SOME_MESSAGE"));
    myReceiverIsRegistered = true;
}
if (myReceiverIsRegistered) {
    unregisterReceiver(myReceiver);
    myReceiverIsRegistered = false;
}
Intent i = new Intent("com.mycompany.myapp.SOME_MESSAGE");
sendBroadcast(i);

就这样。使“操作”对您的软件包/应用程序是唯一的,即,
com.mycompany…
,如我的示例所示。这有助于避免其他应用程序或系统组件可能试图处理它的情况。

无意冒犯,但您的问题仍然非常模糊。所以,我将概述一大堆场景,并希望其中一个能够解决您认为存在的任何问题

场景A:只有活动 如果您只需要在前台有活动时接收广播,请让活动使用
registerReceiver()
注册
BroadcastReceiver
。正如@MisterSquonk所指出的,您将在
onResume()
中注册接收器,并在
onPause()
中注销它

场景B:活动(如果在前台,则为其他);有序广播 如果您希望前台活动处理广播,但如果该活动不在前台(例如,发出
通知
),并且广播是有序广播(例如,传入SMS),则您仍将使用场景a解决方案,但是具有更高的优先级
IntentFilter
(请参阅
setPriority()
)。此外,您可以通过清单中的
元素注册
广播接收器
,同一广播的优先级较低。在活动的
BroadcastReceiver
中,调用
abortBroadcast()
,以使用事件并阻止它到达您的清单注册的
BroadcastReceiver

场景C:活动(如果在前台,则为其他);定期广播 如果场景B几乎适合,但您正在收听的广播不是有序广播,则您需要从场景B开始。但是,使用@MisterSquonk建议的私人操作字符串,让两个接收器在各自的筛选器中拥有的广播为您自己的广播。此外,在清单中注册另一个
BroadcastReceiver
,其
用于您正在收听的真实广播。该接收器只需调用
sendOrderedBroadcast()
,即可发送其他接收器正在收听的有序广播

场景D:不考虑前景的活动 如果你的某些活动需要了解广播,而不管它是否在前台,你需要重新思考你的意思。通常,这实际上意味着广播会以某种方式影响您的数据模型,在这种情况下,您不应该让活动知道,而应该更新您的数据模型,并使用您已经存在的“让活动知道数据模型更改”逻辑来处理其余部分

但是,如果您确信这不是数据模型的一部分,那么可以实现场景B或场景C,并将一些信息粘贴到静态数据成员中。您的活动可以在
onResume()
中检查该静态数据成员,以便在返回前台时获取有关广播的信息

如果您在想“但是,如果我的进程在广播和其他活动之间终止,该怎么办?”,那么您的广播实际上是根据本场景的开头段落更新您的数据模型


如果你想“但是,我想更新一个在后台工作的活动”,那么这个活动就被打断了。活动不应在后台进行。这项工作应该委托给某种形式的服务,并且有一整套相关的场景用于向服务广播。

在提出问题时可能不相关,但现在Android支持包中有了

工作原理与正常广播几乎相同,但所有“聊天”都是它运行的应用程序的本地内容

优点:

  • 你知道你正在广播的数据不会离开你的应用程序,所以不必担心泄露私人数据
  • 其他应用程序不可能将这些广播发送到您的应用程序,因此您无需担心它们会利用安全漏洞
  • 它比通过系统发送全球广播更有效
例如:

Intent i = new Intent("my.local.intent");
LocalBroadcastManager.getInstance(context).sendBroadcast(i);
接受

receiver = new MyBroadcastReceiverToHandleLocalBroadcast();

IntentFilter i = new IntentFilter();
i.addAction("my.local.intent");
LocalBroadcastManager.getInstance(context).registerReceiver(receiver, i);

广播意图:

Intent intent = new Intent("com.yourcompany.testIntent");
intent.putExtra("value","test");
sendBroadcast(intent);
要获得相同的目的,请使用:

IntentFilter filter = new IntentFilter("com.yourcompany.testIntent");
        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
              String value =  intent.getExtras().getString("value");
            }
        };
registerReceiver(receiver, filter);

抱歉“发送消息”=“在我的活动中运行带参数的函数”。“这会阻止其他应用程序或系统组件处理它。”--不太可能
setPackage()
的行为方式是这样的,尽管这对于
Intent
来说相对较新。其他