Android 四大组件之广播基础

原创 2018年04月17日 18:41:07

Android中的广播分为标准广播和有序广播。

标准广播是异步执行的广播,所有广播接收器会在同一时刻接收到广播内容,效率较高但是无法截断。

有序广播是同步执行的广播,在同一时刻只有一个广播接收器会收到消息,此时的广播接收器是有优先级的。

接收系统广播:

广播接收器可以自由的对自己感兴趣的广播进行注册。注册广播的方式分为在代码中注册(动态注册),在AndroidManifest.xml中注册(静态注册)。

动态注册广播接收器:新建一个类,继承自BroadcasstReceiver,并重写父类的onReceive()方法就好了。

public class MainActivity extends AppCompatActivity {
    private IntentFilter intentFilter;
    private  NetworkChangeReceiver networkChangeReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReceiver = new NetworkChangeReceiver();
        registerReceiver(networkChangeReceiver,intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);
    }

    private class NetworkChangeReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            if(networkInfo!=null&&networkInfo.isAvailable()){
                Toast.makeText(context,"network is available",Toast.LENGTH_SHORT).show();
            }
            else{
                Toast.makeText(context,"network is unavailable",Toast.LENGTH_SHORT).show();
            }
        }
    }
}

在onCreate方法中创建了一个InterFilter实例,并给他添加了一个值为android.net.conn.CONNECTIVITY_CHANGE的action,因为在网络状态发生变化的时候,系统会发出这条广播,也就是说广播接收器想监听什么广播,就在这里添加相应的action。

调用registerReceiver()方法进行注册。在onReceive()方法中,通过getSystemService()方法得到ConnectivityManager的实例,这是一个系统服务类,专门用于管理网络连接。然后调用getActiveNetworkInfo()方法得到NetworkInfo的实例,调用Network的isAvailable()方法。判断出是否有网络。

在新的安卓中访问网络权限自动添加了:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

静态注册实现开机启动:可以在程序未启动的情况下接收到广播。

右击com.example.mypc.broadcasttest->New->Other->Broadcast Receiver 即可创建:

public class BootCompleteReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
//        throw new UnsupportedOperationException("Not yet implemented");
        Toast.makeText(context,"Boot Complete",Toast.LENGTH_SHORT).show();
    }
}

在AndroidManifest.xml添加 :

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver
    android:name=".BootCompleteReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
</receiver>
发送一条自定义的标准广播
将AndroidManifest.xml修改为:
<receiver
    android:name=".BootCompleteReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="com.example.mypc.broadcasttest.MY_BROADCAST"></action>
    </intent-filter>
</receiver>

在MainACtivity.java中添加一个按钮事件:

Intent intent = new Intent("com.example.mypc.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
这样就可以接收到自定义的标准广播了。


发送有序广播:
只需把sendBroadcast()改为sendOrderedBroadcast()即可,sendOrderedBroadcast接收两个参数第一个是Intent,第二个是与权限操作有关的字符串。现在只需输入null就好。

有序广播是可以截断,这部分内容到用到的时候再补充上来,在书中的182页。

使用本地广播:

之前发送的广播都是属于全局广播,具有一定的安全性。Andriod中引入了一套本地广播机制,这样广播就只可以在应用程序内部进行传递,并且广播也只接受本应用程序发出的广播。本地广播机制主要使用LocalBroadcastManager来对广播进行管理,并提供了发送广播和注册广播接收器的方法。

package com.example.mypc.localbroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private IntentFilter intentFilter;
    private  LocalReceiver localReceiver;
    private LocalBroadcastManager localBroadcastManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        localBroadcastManager = localBroadcastManager.getInstance(this);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.example.mypc.localbroadcast.LOCAL_BROADCAST");
                localBroadcastManager.sendBroadcast(intent);
            }
        });
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.mypc.localbroadcast.LOCAL_BROADCAST");
        localReceiver = new LocalReceiver();
        localBroadcastManager.registerReceiver(localReceiver,intentFilter);
    }

    private class LocalReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context,"received local broadcast",Toast.LENGTH_LONG).show();
        }
    }
}

广播对应源码

  • 2017年09月15日 22:04
  • 20.01MB
  • 下载

Android基础四大组件详解

Android四大组件Activity,Service,BroadCastReceiver,ContentProvider详解
  • qq_35578940
  • qq_35578940
  • 2016-09-05 23:46:27
  • 7525

BroadcastReceiver

  • 2015年11月11日 15:24
  • 2.29MB
  • 下载

Android学习之四大组件之广播接收器BroadcastReceiver

BroadcastReceiver顾名思义也就是说"广播接收器"的意思,它用来接收系统和应用中的广播。作为四大组件之一想必大家肯定比我更熟悉。...
  • qq_23940659
  • qq_23940659
  • 2016-02-28 10:41:04
  • 575

Android四大组件——BroadcastReceiver普通广播、有序广播、拦截广播、本地广播、Sticky广播、系统广播

  • 2016年11月26日 13:23
  • 3KB
  • 下载

Android中Service(服务)详解,四大组件之一:Service

一、 Service简介 Service是android 系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activi...
  • a78270528
  • a78270528
  • 2015-12-25 15:05:28
  • 1034

安卓四大组件之一广播

前言BroadcastReceiver(广播接收器),属于 Android 四大组件之一在 Android 开发中,BroadcastReceiver 的应用场景非常多今天,我将详细讲解关于Broad...
  • Wawdjr19970078
  • Wawdjr19970078
  • 2018-03-26 16:14:20
  • 26

Android开发 四大组件是否运行在主线程中?

Android的四大组件是不是运行在主线程中?打了log,做个笔记. 先上图: 图没有说服力,因为log是我写的.哈哈. 1.activity 在onCreate()里面打印当前的线程...
  • qq_31383345
  • qq_31383345
  • 2016-11-23 12:59:06
  • 2665

四大组件安全

本文为学习记录,将一些重点记录下。参考droidsec网站。推荐大家关注一下。 Activity:http://www.droidsec.cn/android-activtity-security/ ...
  • u012195899
  • u012195899
  • 2016-11-30 17:27:15
  • 671

Android笔记---四大组件之Broadcast Receive广播接收器详解

广播(Broadcast)是一种广泛运用的在应用程序之间传输信息的机制,在 Android 里面有各种各样的广播,比如电池的使用状态,电话的接收和短信的接收都会产生一个广播,应用程序也可以接受广播并做...
  • netdxy
  • netdxy
  • 2016-02-21 19:09:51
  • 5014
收藏助手
不良信息举报
您举报文章:Android 四大组件之广播基础
举报原因:
原因补充:

(最多只允许输入30个字)