Android广播接收器和Activity间传递数据

思路

Activity向广播接收器传递数据很简单,只需要在发送广播前将数据put进Intent中就行了。

广播接收器怎么向Activity传送数据?这里要用到接口,通过在广播接收器里定义一个接口,然后让接收广播接收器数据的Activity实现这个接口。先看下面的栗子,Activity发送一个广播,然后广播接收器返回一个字符串。

具体案例

Activity 布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.nangch.broadcastreceivertest.MainActivity">

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hello" />

    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送广播"/>
</LinearLayout>
Activity代码
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements MyReceiver.Message{

    TextView tv;
    MyReceiver myReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //注册广播接收器
        myReceiver = new MyReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.nangch.broadcasereceiver.MYRECEIVER");
        registerReceiver(myReceiver, intentFilter);

        //因为这里需要注入Message,所以不能在AndroidManifest文件中静态注册广播接收器
        myReceiver.setMessage(this);

        tv = (TextView) findViewById(R.id.tv);
        Button btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.nangch.broadcasereceiver.MYRECEIVER");
                intent.putExtra("hello", tv.getText());         //向广播接收器传递数据
                sendBroadcast(intent);      //发送广播
            }
        });
    }

    @Override
    public void getMsg(String str) {
        //通过实现MyReceiver.Message接口可以在这里对MyReceiver中的数据进行处理
        tv.append(str);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myReceiver);     //注销广播接收器
    }
}
广播接收器代码
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver {
    private Message message;

    @Override
    public void onReceive(Context context, Intent intent) {
        //接收MainActivity传过来的数据
        Toast.makeText(context, intent.getStringExtra("hello"), Toast.LENGTH_SHORT).show();

        //调用Message接口的方法
        message.getMsg(" world");
    }

    interface Message {
        public void getMsg(String str);
    }

    public void setMessage(Message message) {
        this.message = message;
    }
}

在 MyReceiver 中定义一个 Message 接口,并声明一个 Message 类型的成员变量 message。然后让 MainActivity实现这个接口,并调用 setMessage 方法将 MainActivity 注入,这样 MainActivity 实例就成了 Myreceiver 的成员变量 message,这样就能处理 MyReceiver 中的数据了。这种思想和我们学习 Android 时设置按钮监听器的思想差不多,仔细想一下还是很好理解的。

引用

本文转载自 https://www.cnblogs.com/nangch/p/5353563.html ,感谢原作者的整理。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
计算机科学与技术系 实 验 报 告 专业名称 计算机科学与技术 课程名称 Android嵌入式软件开发 项目名称 BroadcastReceiver 班 级 学 号 姓 名 同组人员 无 实验日期 2016.10.11 一、实验目的与要求: 【实验目的】 掌握 BroadcastReceiver 的两种注册方法,掌握 Broadcast 的发送方法。 【实验要求】 1、 练习使用静态方法和动态方法注册广播接收器 2、 练习发送广播消息的方法 3、 完成实验报告 二、实验内容 1、 新建 Android 应用程序项目 BroadcastTest; 2、 业务逻辑代码与界面布局文件如下: 1) activity_main.xml,界面布局文件; 2) MainActivity.java,发送广播的函数; 3) activity_sec.xml,动态注册广播界面; 4) SecActivity.java,广播的生命周期回调函数; 5) StaticReceiver.java 被静态注册的广播接收器; 6) DynamicReceiver.java 被动态注册的广播接收器; 7) 在 AndroidManifest.xml 中注册 StaticReceiver; 8) 在 AndroidManifest.xml 中声明 sendStickyBroadcast()对应的权限, 在<uses- sdk>字段之后定义。 实验结果截图: 图表 1 普通广播静态注册 图表 2 普通广播动态注册 图表 3 sticky广播动态注册 三、实验分析与小结: BroadcastReceiver(广播接收器)是Android中的四大组件之一。 注册广播事件:注册 方式有两种,一种是静态注册,就是在AndroidManifest.xml文件中定义,注册的广播接 收器必须要继承BroadcastReceiver;另一种是动态注册,是在程序中使用Context.reg isterReceiver注册,注册的广播接收器相当于一个匿名类。两种方式都需要IntentFIl ter。 发送广播事件:通过Context.sendBroadcast来发送,由Intent来传递注册时用到的Ac tion。 接收广播事件:当发送的广播接收器监听到后,会调用它的onReceive()方法,并将 包含消息的Intent对象传给它。onReceive中代码的执行时不要超过5s,否则Android 会弹出超时dialog。 【思考题】 1. 发送广播消息的3中方法是什么? 1) onSendStaticBroadcast(View v); 2) onSendDynamicBroadcast(View v); 3) onSendStickyBroadcast(View v)。 得分(百分制) ----------------------- Android实验六全文共5页,当前为第1页。 Android实验六全文共5页,当前为第2页。 Android实验六全文共5页,当前为第3页。 Android实验六全文共5页,当前为第4页。 Android实验六全文共5页,当前为第5页。
下面是一个简单的 Activity传递数据的完整代码示例: 发送广播Activity: ```java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 发送自定义广播 Intent intent = new Intent("com.example.MY_CUSTOM_ACTION"); intent.putExtra("message", "Hello world!"); sendBroadcast(intent); } } ``` 接收广播Activity: ```java public class SecondActivity extends AppCompatActivity { private BroadcastReceiver receiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); // 动态注册广播接收器 receiver = new MyBroadcastReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("com.example.MY_CUSTOM_ACTION"); registerReceiver(receiver, filter); } @Override protected void onDestroy() { // 取消注册广播接收器 unregisterReceiver(receiver); super.onDestroy(); } private class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("com.example.MY_CUSTOM_ACTION")) { // 获取广播中的消息 String message = intent.getStringExtra("message"); Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); } } } } ``` 在 AndroidManifest.xml 文件中注册 SecondActivity: ```xml <activity android:name=".SecondActivity"/> ``` 注意:在接收广播Activity 中,需要使用动态注册方式注册广播接收器,并在 Activity 销毁时取消注册。此外,需要在 AndroidManifest.xml 文件中注册接收广播Activity

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值