【Android】广播

2019-07-29  本文已影响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" />

上一篇 下一篇

猜你喜欢

热点阅读