美文网首页
【Android】广播

【Android】广播

作者: 感同身受_ | 来源:发表于2019-07-29 17:14 被阅读0次

一、注册广播一般两种形式:

  1. 在代码中注册(动态注册)
  2. 在AndroidManifest中注册(静态注册)

优缺点:

  1. 动态注册阔以自由控制注册和注销,灵活性强,但必须在程序启动之后才能接收到广播,静态广播可以在程序未启动的情况下收到广播
  2. 静态注册的广播接收器没办法在onReceive方法里面弹出对话框这样的UI控件

注册:
静态广播都是在<application>中的<receive>中注册的
例如:

<receiver
            android:name=".MyBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.broadcasttest.MY_BROADCAST"/>
            </intent-filter>
        </receiver>

二、标准广播发出后,接收不到的问题解决:

《第一行代码》上用的方法是

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
                sendBroadcast(intent);
            }
        });

当发送后,接收不到,查了一下,有两个方法:

  1. 将静态注册改为动态注册
  2. 以下方法:
//包名:com.example.broadcasttest
//接收的类名:com.example.broadcasttest.MyBroadcastReceiver
//注册名:com.example.broadcasttest.MY_BROADCAST
button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
                intent.setComponent(new ComponentName("com.example.broadcasttest",
                        "com.example.broadcasttest.MyBroadcastReceiver"));
                sendBroadcast(intent);
            }
        });

三、有序广播:

不同:1、发送方式

                //标准广播
                sendBroadcast(intent);
                //有序广播
                //第二个参数是一个与权限相关的字符串
                sendOrderedBroadcast(intent,null);

2、可在AndroidManifest中设置优先级

 <intent-filter android:priority="100">
                <action android:name="com.example.broadcasttest.MY_BROADCAST"/>
            </intent-filter>

3、在接受处,可阻断通知的继续传递

@Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_LONG).show();
        //阻断
        abortBroadcast();
    }

四、1.最终代码:

MainActivity

package com.example.broadcasttest;

import androidx.appcompat.app.AppCompatActivity;

import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    /**
     * 权限:
     * <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     */

    private IntentFilter intentFilter;

    private NetworkChangeReceiver networkChangeReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
                intent.setComponent(new ComponentName("com.example.broadcasttest",
                        "com.example.broadcasttest.MyBroadcastReceiver"));
                sendBroadcast(intent);
            }
        });


        intentFilter = new IntentFilter();
        //广播接收器想要监听什么广播,就在addAction中添加相应的action
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReceiver = new NetworkChangeReceiver();
        //动态注册
        //这样NetworkChangeReceiver就能接受到所有android.net.conn.CONNECTIVITY_CHANGE的广播了
        registerReceiver(networkChangeReceiver,intentFilter);


    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        //动态注册的广播接收器一定要取消注册
        unregisterReceiver(networkChangeReceiver);

    }

    class NetworkChangeReceiver extends BroadcastReceiver{
        @Override
        //每当网络状态发生变化时,onReceive就会得到执行
        public void onReceive(Context context,Intent intent){
            //getSystemService此为系统服务类,专门用于管理网络连接
            ConnectivityManager connectivityManager =
                    (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            //isAvailable()判断当前是否有网络
            if (networkInfo != null && networkInfo.isAvailable()){
                Toast.makeText(context,"network is available",Toast.LENGTH_LONG).show();
            }else{
                Toast.makeText(context,"network is unavailable",Toast.LENGTH_LONG).show();
            }

        }
    }
}

2.MyBroadcastReceive:

package com.example.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_LONG).show();

    }
}

【注】:通知需要到在AndroidManifest中申明权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

相关文章

  • Android广播

    参考:Android总结篇系列:Android广播机制Android广播机制 一. 广播 1. 广播是什么? 广播...

  • Android笔记——BroadcastReceiver

    1.0Android中的广播类型 Android中的广播主要可以分为两种类型:标准广播和有序广播。 标准广播(no...

  • Android动态广播的使用

    说到Android的广播,分为动态广播和静态广播两种。这篇文章主要讲解下Android的动态广播。广播的作用主要是...

  • Android体系复习---广播

    一、广播简介 Android 应用与 Android 系统和其他 Android 应用之间可以相互收发广播消息,这...

  • 浅谈Android Broadcast

    Android Broadcast Broadcast使用场景 Android广播分为两个方面:广播发送者和广播接...

  • Android 广播

    【Android 广播】 BroadcastReceiver简介 BroadcastReceiver(广播接收器)...

  • Android基础:BroadcastReceiver广播接收者

    介绍 BroadcastReceiver(广播接收器),属于 Android 四大组件之一 Android广播机制...

  • Android 发送接收广播原理

    前言 本文代码基于 Android R。 注册广播接收者 Android 可以动态和静态注册广播接收者。动态广播接...

  • Android 广播

    广播接收器 是Android的四大组件之一,可见广播在Android中的重要性; 1. 什么是广播? 广播(Bro...

  • BroadcastReceiver的使用

    Android中的广播分为标准广播(Normal broadcasts)、有序广播(Ordered broadca...

网友评论

      本文标题:【Android】广播

      本文链接:https://www.haomeiwen.com/subject/vsnbrctx.html