广播接收器如何将数据传递给另一个活动

7

你好,我在使用广播接收器时遇到问题,需要将信息传递给另一个活动。我的目标是创建一个应用程序,捕获收到的短信信息,查找其中的网站链接,并弹出警示对话框询问用户是否要跳转至该网站。

public class TextReceiver extends BroadcastReceiver{

public void onReceive(Context context, Intent intent)
{
    // .. other code that
    // sets received SMS into message

    Toast toast = Toast.makeText(context,
            "Received Text: " + message.getMessageBody(), Toast.LENGTH_LONG);
            toast.show();
 }

该代码运行良好,接收到文本后会弹出一个带有消息的Toast。尽管Toast没什么用,但它表明接收器可以正常工作。但我想与一个活动进行通信,以显示警报对话框并启动webView。我已经编写了代码,将获取字符串搜索网站并打开webView。是否可能从广播接收器中获取字符串并执行类似以下操作的操作:

    public class ReceiveText extends Activity{
public void onCreate(Bundle savedInstanceState) {

// Somehow pass the string from the receiver into this activity, 
//stored in variable messages

findOpen(messages);

// is that possible?

}
public class findOpen(string messages){
// do stuff ... open alert...open site if OK
}

基本上,我只想从广播接收器传递一个字符串到另一个将使用该字符串的活动中。其余的代码基本上已经就位了,我只需要那个字符串... 我对此很新,并且对Java不熟悉,任何帮助都将不胜感激。谢谢
3个回答

17
  1. 在你想要接收数据的活动中实例化一个BroadcastReceiver,例如:

    private BroadcastReceiver mServiceReceiver = new BroadcastReceiver(){
        @Override
        public void onReceive(Context context, Intent intent)
        {
            //Extract your data - better to use constants...
            String IncomingSms=intent.getStringExtra("incomingSms");//
            String phoneNumber=intent.getStringExtra("incomingPhoneNumber");
    
        }
    };
    
  2. onPause() 中取消注册您的接收器:

  3. @Override
    protected void onPause() {
        super.onPause();
        try {
            if(mServiceReceiver != null){
            unregisterReceiver(mServiceReceiver);
            }
        } catch (Exception e) {
           e.printStackTrace();
        }
    }
    
  4. onResume()方法中进行注册:

  5. protected void onResume() {
        super.onResume();
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.intent.action.SmsReceiver");
        registerReceiver(mServiceReceiver , filter);
    }
    
  6. 通过 Intent 从服务中广播您的数据,例如:

    Intent i = new Intent("android.intent.action.SmsReceiver").putExtra("incomingSms", message);
    i.putExtra("incomingPhoneNumber", phoneNumber);
    context.sendBroadcast(i);
    

就这些了!祝你好运!


@Dinesh 是的,代码缺少 IntentFilter filter = new IntentFilter(); - Gal Rom
在我看来,这比上面的答案好多了,因为你不需要重新加载活动。 - Luis Aguilar
优秀的回答。这应该被标记为正确答案。 - Vijayendra

16
如果您的活动命名为ReceiveText,则在您的BroadcastReceiver中,您应该执行以下操作:
Intent i = new Intent(context, ReceiveText.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra("message", message.getMessageBody());
context.startActivity(i);

然后,在您的活动中,您需要像这样获取额外的内容:

Intent intent = getIntent();
String message = intent.getStringExtra("message");

然后您将按照您的需要使用message

如果您只想让ReceiveText活动将消息显示为对话框,请在清单文件中为ReceiveText声明<activity android:theme="@android:style/Theme.Dialog" />,然后在活动中将消息设置为文本视图。

编辑: 这会重新启动您的活动。对于大多数人来说,此答案可能是更好的解决方案。


2
对于任何继续使用此实现的人,它将重新启动您的活动。这可能不是您想要的。 - Damercy

0
我们可以使用LocalBroadcastManager将数据从onReceive发送到另一个活动。 这意味着您正在使用上下文重新广播数据。
@Override
    public void onReceive(Context context, Intent intent) {
    
        Log.d("Broadcast", "wifi  ConnectivityReceiver");
    
                Bundle extras = intent.getExtras();
                Intent intent = new Intent("broadCastName");
                // Data you need to pass to another activity
                intent .putExtra("message", extras.getString(Config.MESSAGE_KEY)); 
                context.sendBroadcast(intent );
    } 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接