使用广播意图/广播接收到从服务发送消息到活动使用广播意图/广播接收到从服务发送消息到活动(Using

2019-05-13 10:08发布

我是这么理解(我认为)关于广播意图和接收信息给他们。

所以,现在,我的问题/我不能工作是如何从发送信息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
       }
   }
}

如何将消息发送到活动?

我将不得不实例化我想将消息发送到并以某种方式监测其活动的接收器? 或者是什么? 我理解这个概念,但没有真正的应用程序。

任何帮助将是绝对惊人的,谢谢。

汤姆

Answer 1:

用于注册/取消注册EDITED更正代码示例BroadcastReceiver ,并且还除去舱单声明。

限定ReceiveMessages作为内的内类Activity ,其需要监听来自消息Service

然后,声明类变量,如...

ReceiveMessages myReceiver = null;
Boolean myReceiverIsRegistered = false;

onCreate()使用myReceiver = new ReceiveMessages();

然后在onResume() ...

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

...在onPause() ...

if (myReceiverIsRegistered) {
    unregisterReceiver(myReceiver);
    myReceiverIsRegistered = false;
}

Service创建和广播的Intent ......

Intent i = new Intent("com.mycompany.myapp.SOME_MESSAGE");
sendBroadcast(i);

这就是它。 使“行动”唯一的你的软件包/应用程序,即com.mycompany...在我的例子。 这有助于避免的情况下的其他应用程序或系统组件可能会尝试对其进行处理。



Answer 2:

没有进攻,但你的问题仍然是该死的模糊。 所以,我要勾勒出场景的整体混乱,希望他们中的一个实际会达到什么问题你认为你有。

方案A:只有活动

如果你只需要当你在前台活动接收广播,有活动注册BroadcastReceiver使用registerReceiver() 作为@MisterSquonk表示,你会登记在接收器onResume()和注销它onPause()

方案B:活动如果在前台,否则其他; 有序广播

如果你想在前台活动来处理广播,但你想别的事情,如果该活动是不是在前台(例如,养发生Notification ),和广播是有序广播(例如,进入SMS),那么你仍然使用方案A的解决方案,但具有较高的优先级IntentFilter (见setPriority() )。 此外,你会注册BroadcastReceiver经由<receiver>在清单元件,具有低优先级的<intent-filter>为相同的广播。 在活动的BroadcastReceiver ,调用abortBroadcast()消耗事件并防止其到达您的清单注册的BroadcastReceiver

方案C:活动如果在前台,否则其他; 常规的广播

如果方案B几乎千篇一律,但你正在听的广播是不是一个有序广播,您将需要启动方案B.然而,有两个接收机在各自的过滤器广播是一个你自己的,使用私有操作字符串作为@MisterSquonk建议。 此外,还有一个 BroadcastReceiver在清单中,其注册<intent-filter>是您正在收听的广播实。 该接收器将只需调用sendOrderedBroadcast()发出的有序广播,其他接收器监听。

方案d:活动不管前景的

如果你的一些活动需要了解的广播,并不要紧,无论它是不是在前台,你需要重新考虑你的意思是什么。 通常情况下,这实际上意味着广播影响某种方式对你的数据模型,在这种情况下,你的关注应该是让活动的认识,而是更新数据模型,并使用已经存在的“让活动的了解数据模型变化”的逻辑处理其余部分。

但是,如果你相信,这是不是你的数据模型的一部分,可以实现场景B或C方案,再加上坚守在静态数据成员的一些信息。 您的活动可以检查在静态数据成员onResume()当他们返回到前台拿起关于广播的信息。

如果你想“但是,如果我的过程是广播和其他活动来到前台之间结束?”,那么你的广播确实更新的数据模型,每这种情况下的首段。

如果你想“但我想更新该做的工作在后台的活动”,那么有关活动被打破。 活动不应该在后台做的工作。 这项工作应委托给一些形式的服务,而且也为获得广播到服务的整体相关的一系列方案。



Answer 3:

广播的意图:

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);


Answer 4:

可能在这个问题的时间不相关被问到但现在的LocalBroadcastManager在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);


文章来源: Using a broadcast intent/broadcast receiver to send messages from a service to an activity