文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android静态,动态注册与跨平台接收广播

2022-06-06 13:43

关注

Android静态,动态注册与跨平台接收广播 静态注册 在activity_main.xml 中添加一个button,用来发送广播的点击事件

    
在MainActivity.java 中声明并且写入点击监听事件
	public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //发送广播
                Intent intent = new Intent();
                intent.setPackage("com.zhanghaopeng.day0402demo1");
                intent.setAction("HAO_PENG");
                sendBroadcast(intent);
            }
        });
    }
}

小提示:通俗的来讲 静态注册中只有接收广播的一方需要在AndroidManifest.xml中进行广播注册(谁接收,谁用呗~)

创建BroadcastReceiver(广播)
public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"已接收静态广播",Toast.LENGTH_SHORT).show();
    }
}

小提示:为了代码简单化,这里就简单的使用Toast来提示。
创建广播的方法:
第一种就是像创建java类一样,在类名后继承BroadcastReceiver类,并实现它的方法
但是这样创建在AndroidManifest.xml中并不会自动地去注册,而需要自己手动地去添加注册广播(代码如下)


第二种方法则是右击新建广播类即可(会自动注册)
四:这样一个简单的静态注册就写完了(是不是挺简单)
简单的提示一下:
安卓8.0后静态注册的广播无法接收需要添加Intent.setComponent();
在安卓9.0后对静态注册又进行了一丢丢的改动
在发送端中需要指定app所在的包名(代码如下)

intent.setPackage("com.zhanghaopeng.day0402demo1");
动态注册

上面讲了那么多的静态注册,相信大家对广播有些认识了
下面我们就来讲第二点:广播的动态注册
小提示:动态和静态的注册通俗理解可以认为(静态需要在xml中进行注册,动态则只需要在java代码中进行注册)

在activity_main.xml 中添加一个button,用来发送广播的点击事件

    
在MainActivity.java 中声明并且写入点击监听事件
public class MainActivity extends AppCompatActivity {
    private MyReceiver broad = new MyReceiver();
    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        IntentFilter filter = new IntentFilter("HAO_PENG1");
        registerReceiver(broad, filter);
        findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction("HAO_PENG1");
                intent.putExtra("key","动态传输数据");
                sendBroadcast(intent);
            }
        });
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(broad);
    }
}

小提示:在MainActivity.java中我来通俗给大家捋捋
动态注册和静态注册不同,在上面中我们提过动态注册是写在java代码中,所以下面便是动态注册的代码:

MyReceiver broad = new MyReceiver();//声明自己创建的广播
IntentFilter filter = new IntentFilter("HAO_PENG1");//类似于筛选器
registerReceiver(broad, filter);//注册广播
创建BroadcastReceiver(广播)
public class MyReceiver extends BroadcastReceiver {
    private DaiLi daiLi;
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,intent.getStringExtra("key"),Toast.LENGTH_SHORT).show();
    }

到这一步,动态注册也就完成了。
现在我们来总结一下:
动态注册:当Activity销毁的时候,广播就失效了。(收到生命周期的影响)
静态注册:即使Activity销毁了,仍然可以收到广播。

跨平台接收广播

对动静态注册的了解过后,终于来到最后一步了(不同app之间的广播传递)
这里呢我也就再次对动,静态注册的使用方法分别举例

静态注册(跨平台)

小提示:首先大家创建两个工程,方便一个发送,一个接收

发送方: 在activity_main.xml 中添加一个button,用来发送广播的点击事件

    
在MainActivity.java 中声明并且写入点击监听事件
	public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //发送广播
                Intent intent = new Intent();
                intent.setPackage("com.zhanghaopeng.day0402demo1");
                intent.setAction("HAO_PENG");
                intent.putExtra("key","静态传输数据");
                sendBroadcast(intent);
            }
        });
    }
}

小提示:为了可以更好的检验广播是否传递数据这里传递了一些字符串。
在上面中我们提过发送方并不需要注册广播,所以这里我们跳过。

接收方: 在activity_main.xml 中添加一个TextView,用来接收发送方传来的值

创建BroadcastReceiver(广播)
public class AnBroadCast extends BroadcastReceiver {
	private DaiLi daiLi;
    @Override
    public void onReceive(final Context context, Intent intent) {
        //接收广播
        if (intent.getAction().equals("HAO_PENG")) {
            daiLi.get(intent.getStringExtra("key"));
        }
    }
    public void chuanDi(DaiLi d) {
        daiLi = d;
    }
    interface DaiLi {
        void get(String s);
    }
}

小提示:为了逻辑清晰,所以我们这里就先创建广播。
然后来对其中的代码进行通俗的理解

if (intent.getAction().equals("HAO_PENG")) {
            daiLi.get(intent.getStringExtra("key"));
            //发送方中我们使用的是setAction("HAO_PENG"),那么这就好理解了
            //get到我们发送的值与"HAO_PENG"进行比对,如果正确则执行下面代码
        }
public void chuanDi(DaiLi d) {
        daiLi = d;
        //这里的意思将形参中的DaiLi接口类型的d赋给daiLi(这里的daiLi在上面已经声明的接口实例)
    }
    interface DaiLi {//创建的一个内部接口
        void get(String s);//这个为了在MainActivity.java中获取布局id
    }
在MainActivity.java 中实现广播类中的内部接口并实现其方法
public class MainActivity extends AppCompatActivity implements MyReceier.DaiLi{
    private MyReceier myReceier = new MyReceier();
    private TextView tv1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myReceier.chuanDi(this);//将当前的布局传递
        tv1 = findViewById(R.id.tv1);
    }
    @Override
    public void get(String s) {
        tv1.setText(s);//将发送方发送的字符串在tv1中显示
    }
}

小提示:由于是在接收方,我们需要在AndroidManifest.xml查看是否注册广播,如果没有注册则需要手动注册(代码如下)


到这里,我们的静态注册(跨平台接收广播)的代码已经完成了

动态注册(跨平台)

小提示:首先大家创建两个工程,方便一个发送,一个接收

发送方: 在activity_main.xml 中添加一个button,用来发送广播的点击事件

    
在MainActivity.java 中动态注册广播并发送
public class MainActivity extends AppCompatActivity implements public class MainActivity extends AppCompatActivity {
    private MyReceiver broad = new MyReceiver();
    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        IntentFilter filter = new IntentFilter("HAO_PENG1");
        registerReceiver(broad, filter);
        findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction("HAO_PENG1");
                intent.putExtra("key","动态传输数据");
                sendBroadcast(intent);
            }
        });
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(broad);
    }
}

小提示:如果这里有些思路混淆,可以在上面的动态注册代码中再理解一边,这里就不再多解释勒~

接收方: 在activity_main.xml 中添加一个TextView,用来接收发送方传来的值

创建BroadcastReceiver(广播)
public class MyReceiver extends BroadcastReceiver {
    private DaiLi daiLi;
    @Override
    public void onReceive(Context context, Intent intent) {
        daiLi.xieRu(intent.getStringExtra("key"));
    }
    public void chuanDi(DaiLi d) {
        daiLi = d;
    }
    public interface DaiLi {
        void xieRu(String s);
    }
}

小提示:这里代码与上面的静态注册神似,也就不再多详细解释勒(嘿嘿~)

在MainActivity.java 中实现广播类中的内部接口并实现其方法
public class MainActivity extends AppCompatActivity implements MyReceier.DaiLi{
    private MyReceier myReceier = new MyReceier();
    private TextView tv1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        IntentFilter filter = new IntentFilter("HAO_PENG1");
        registerReceiver(myReceier, filter);
        myReceier.chuanDi(this);
        tv1 = findViewById(R.id.tv1);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myReceier);
    }
    @Override
    public void get(String s) {
        tv1.setText(s);
    }
}
真机演示:
静态注册(本机接收)
动态注册(跨平台)

到这里关于Android静态,动态注册与跨平台接收广播都简单的过了一遍,
由于本身也是白板一个,如果有哪里写的有错误,或者哪里写的不够好。希望可以谅解,并在下方留言问题的错误所在(狗头保命)

在这感谢庭博老师耐心教导


作者:反向学习


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯