broadcastreceiver

「已注销」 「已注销」     2023-03-25     791

关键词:

转载请标明出处: http://blog.csdn.net/wu_wxc/article/details/51394220
本文出自【吴孝城的CSDN博客】

关于广播的内容,可以看下官方的介绍:http://developer.android.com/intl/zh-cn/reference/android/content/BroadcastReceiver.html

广播的生命周期只在调用onReceive(Context, Intent)时活跃。
广播分两种

Normal broadcasts:标准广播,无序广播

通过Context.sendBroadcast发送,是完全异步的,所有的接收器以不确定的顺序运行,通常是同时的,这样效率更高,但也意味着接收器不能传递结果,也不能中止广播。

Ordered broadcasts:有序广播

通过Context.sendOrderedBroadcast发送,一次只发送给一个接收器,每个接收器按顺序执行,所以它可以向下一个接收器传递结果,也可以退出广播,不再传递给其他接收器,接收器的运行顺序可以通过android:priority属性控制,如< intent-filter android:priority = “1000” >,级别数值在-1000到1000之间,值越大,优先级越高。相同优先级的接收器会以随机的顺序执行。

注册

我们可以用Context.registerReceiver()在程序中动态注册广播,动态注册的需程序启动后才能接收广播。
也可以通过在AndroidManifest.xml中静态注册,静态注册的可以让程序在未启动的情况下接收广播。

如果在Activity.onResume()里注册了一个receiver,就应该在Activity.onPause()里调用unregisterReceiver()注销它,暂停后将不会收到intents,这将减少不必要的系统开销,不用在Activity.onSaveInstanceState()注销,因为用户回到历史堆栈它将不会被调用。

注意

不要在广播里添加任何逻辑和耗时操作,因为广播不允许开辟线程,当onReceive(Context, Intent)运行时间超过10秒还没有结束时,程序会报错(ANR),广播更多的是用来打开其他组件,如Service,Activity,Notification提示等。

接收广播

接下来来实践一下
创建一个类,继承BroadcastReceiver
在onReceive(Context context, Intent intent)方法里完成广播要做的事。

动态注册

MyReceiver.java

package cn.wuxiaocheng.broadcastreceiver;

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

public class MyReceiver extends BroadcastReceiver 
    public MyReceiver() 
    

    // 在onReceive里完成广播要操作的事,这里弹出一个吐丝
    @Override
    public void onReceive(Context context, Intent intent) 
        Toast.makeText(context, "网络状态发生改变~", Toast.LENGTH_SHORT).show();
    

在MainActivity.java中动态注册

package cn.wuxiaocheng.broadcastreceiver;

import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity 

    MyReceiver myReceiver;

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

        myReceiver = new MyReceiver();
        // 创建意图过虑器
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        // 注册Receiver
        registerReceiver(myReceiver, filter);
    

    // 注销广播
    @Override
    protected void onPause() 
        super.onPause();
        unregisterReceiver(myReceiver);
    

在AndroidManifest.xml里声明

<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true"></receiver>

静态注册

MyReceiver.java

package cn.wuxiaocheng.broadcastreceiver;

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

public class MyReceiver extends BroadcastReceiver 

    private final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";

    public MyReceiver() 
    

    // 在onReceive里完成广播要操作的事,这里弹出一个吐丝
    @Override
    public void onReceive(Context context, Intent intent) 
        if (ACTION_BOOT.equals(intent.getAction()))
            Toast.makeText(context, "已开机", Toast.LENGTH_LONG).show();
    

在AndroidManifest.xml里声明和添加intent-filter

<receiver
    android:name=".MyReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.cation.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

发送广播

这里只写一个标准广播扩运行,有序广播的可以自己写一下。或者我有空再来补充
标准广播用:sendBroadcast
有序广播用:sendOrderedBroadcast
先写一个程序,创建一个继承BroadcastReceiver的类,实现onReceive(Context context, Intent intent)方法
MyReceiver.java

package cn.wuxiaocheng.broadcastreceiver;

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

public class MyReceiver extends BroadcastReceiver 

    private final String GET_Broadcast = "cn.wuxiaocheng.MY_BROADCAST";

    public MyReceiver() 
    

    // 在onReceive里完成广播要操作的事,这里弹出一个吐丝
    @Override
    public void onReceive(Context context, Intent intent) 
        if (GET_Broadcast.equals(intent.getAction()))
            // 当收到其他应用程序发送的广播时,会弹出Toast
            Toast.makeText(context, "收到广播", Toast.LENGTH_LONG).show();
    

在AndroidManifest.xml里声明和添加intent-filter

<receiver
    android:name=".MyReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="cn.wuxiaocheng.MY_BROADCAST"/>
    </intent-filter>
</receiver>

再写一个程序,用来发送广播
只需要写一行发送代码就行

sendBroadcast(new Intent("cn.wuxiaocheng.MY_BROADCAST"));

写一个按钮,点击发送广播

package cn.wuxiaocheng.testbroadcast;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
    public void send(View v)
        sendBroadcast(new Intent("cn.wuxiaocheng.MY_BROADCAST"));
    

发送后接收广播的程序应付弹出Toast

LocalBroadcastManager

如果我们不需要跨程序发送广播,可以选用:LocalBroadcastManager

注意:
1.本地广播无法通过静态注册方式来接收,相比起全局广播要高效很多
2.在广播中启动Activity时,需要为intent添加FLAG_ACTIVITY_NEW_TASK,不然会报错,因为需要一个栈来存放新打开的Activity
3.在广播中弹出AlertDialog时需要在AndroidManifest.xml设置对话框的类型为TYPE_SYSTEM_ALERT,不然无法弹出< uses-permission android:name=”android.permission.SYSTEM_ALERT_WINDOW” />

来个小例子


MainActivity.java

package cn.wuxiaocheng.testbroadcast;

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

public class MainActivity extends AppCompatActivity 

    private LocalBroadcastManager mLcalBroadcastManager;
    private BroadcastReceiver mBroadcastReceiver;
    private IntentFilter mIntentFilter;

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

        mLcalBroadcastManager = LocalBroadcastManager.getInstance(this);

        // 初始化广播接收者
        mBroadcastReceiver = new MyReceiver();
        // 创建意图过虑器
        mIntentFilter = new IntentFilter();
        mIntentFilter.addAction("cn.wuxiaocheng.LOCAL_BROADCAST");
        // 注册Receiver
        mLcalBroadcastManager.registerReceiver(mBroadcastReceiver, mIntentFilter);
    

    public void send(View v) 
        Intent intent = new Intent("cn.wuxiaocheng.LOCAL_BROADCAST");
        mLcalBroadcastManager.sendBroadcast(intent);
    

    // 注销广播
    @Override
    protected void onPause() 
        super.onPause();
        mLcalBroadcastManager.unregisterReceiver(mBroadcastReceiver);
    

MyReceiver.java

package cn.wuxiaocheng.testbroadcast;

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

public class MyReceiver extends BroadcastReceiver 

    private final String GET_Broadcast = "cn.wuxiaocheng.LOCAL_BROADCAST";
    public MyReceiver() 
    

    @Override
    public void onReceive(Context context, Intent intent) 
        if (GET_Broadcast.equals(intent.getAction()))
            // 当收到其他应用程序发送的广播时,会弹出Toast
            Toast.makeText(context, "LocalBroadcastManager", Toast.LENGTH_LONG).show();
    

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="cn.wuxiaocheng.testbroadcast.MainActivity">

    <Button
        android:onClick="send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送广播" />
</RelativeLayout>

BroadcastReceiver 是不是只监听变化?

】BroadcastReceiver是不是只监听变化?【英文标题】:DoesaBroadcastReceiveronlylistentochanges?BroadcastReceiver是否只监听变化?【发布时间】:2012-07-2215:05:17【问题描述】:我正在阅读指南here,关于设置BroadcastReceiver以检查电池的变化。它... 查看详情

broadcastreceiver

广播接收者案例_ip拨号器 (1)定义一个类继承BroadCastReceiver   publicclassOutGoingCallReceiverextendsBroadcastReceiver{//当接收到外拨电话的事件的时候回执行这个方法@OverridepublicvoidonReceive(Contextcontext,Intentintent) 查看详情

采用单独扩展 BroadcastReceiver 的类

】采用单独扩展BroadcastReceiver的类【英文标题】:TakingaclassthatextendsBroadcastReceiveralone【发布时间】:2013-09-3001:25:58【问题描述】:有许多扩展BroadcastReceiver的类示例,可以通过意图从另一个类激活。类也从BroadcastReceiver扩展而来,... 查看详情

broadcastreceiver类

java.lang.Object   ?android.content.BroadcastReceiver已知直接子类AppWidgetProviderDeviceAdminReceiver,WakefulBroadcastReceiver类概述基类代码会收到sendbroadcast()意图。假设你不须要在应用程序发送广播,考虑使用localbroadcastman 查看详情

android从broadcastreceiver刷新listview

】android从broadcastreceiver刷新listview【英文标题】:androidrefreshlistviewfrombroadcastreceiver【发布时间】:2016-01-1703:45:19【问题描述】:我的应用在一个活动中包含一个ListView和一个BroadcastReceiver。我希望我的Broadcastreceiver在触发时刷新Lis... 查看详情

android中创建一个broadcastreceiver

首先创建一个java类继承BroadcastReceiver类 packagecom.example.service;importandroid.content.BroadcastReceiver;importandroid.content.Context;importandroid.content.Intent;importandroid.widget.Toast;publicclas 查看详情

broadcastreceiver

BroadcastReceiver的概念  BroadcastReceiver的作用主要是用来监听系统或者应用发出的广播信息,然后根据广播信息作为相应的逻辑处理;说通俗点其实上就是一种全局监听器,要来实现系统中不同组件之间的通信。有时候也会用来... 查看详情

AlarmManager 不调用 BroadcastReceiver

】AlarmManager不调用BroadcastReceiver【英文标题】:AlarmManagerdoesnotcallBroadcastReceiver【发布时间】:2019-05-0909:53:53【问题描述】:我在每天的特定时间创建了一个预定的重复警报,使用AlarmManager在扩展BroadcastReceiver的类中触发通知。但... 查看详情

BroadcastReceiver 总是与网络断开连接

】BroadcastReceiver总是与网络断开连接【英文标题】:BroadcastReceiveralwaysgetdisconnectedfromnetwork【发布时间】:2016-09-0708:21:21【问题描述】:我关注了AndroidDeveloperstutorialManagingNetworkUsage。似乎BroadcastReceiver总是与网络断开连接。我尝试... 查看详情

broadcastreceiver

BroadcastReceiver,四大组件之一,翻译过来就是广播接收器,那么什么时候会用到BroadcastReceiver呢,又或者说,什么情况下我们需要用到广播呢我认为主要是以下三种情况1,在某些特殊情况下发出广播(如开机,网络可用,又或者... 查看详情

broadcastreceiver广播相关-转

BroadcastReceiver广播接收者用于接收系统或其他程序(包括自己程序)发送的广播。一.注册广播在android中,我们如果想接收到广播信息,必须自定义我们的广播接收者。要写一个类来继承BroadcastReceiver,并且重写其onReceive()方法,... 查看详情

BroadcastReceiver 总是不充电

】BroadcastReceiver总是不充电【英文标题】:BroadcastReceiverallwaysgetnotcharging【发布时间】:2013-11-0506:18:50【问题描述】:我正在尝试检测设备当前是否正在充电,但此代码始终将isCharging变量设置为false:publicclassPowerReceiverextendsBroadca... 查看详情

如何设置 BroadcastReceiver 权限(安全)

】如何设置BroadcastReceiver权限(安全)【英文标题】:HowtoSetBroadcastReceiverPermissions(Security)【发布时间】:2015-01-3005:43:08【问题描述】:所以我有2个应用程序-A和B。在A中,我有一个BroadcastReceiver。在receiver标签(清单文件)中,我... 查看详情

broadcastreceiver基本使用

BroadcastReceiver介绍BroadcastReceiver翻译成中文叫“广播接收器”,所以它的作用是用来接收发送过来的广播的。Android应用程序可以发送或接收来自Android系统和其他Android应用程序的广播消息,类似于发布订阅设计模式。当有兴趣的... 查看详情

学习笔记broadcastreceiver的运用

一、Activity与BroadcastReceiver通信1)新建一个BroadcastReceiver,在MainActivity里通过sendBroadcast方法发送数据650)this.width=650;"src="http://s3.51cto.com/wyfs02/M02/89/5A/wKiom1gQVq_An8z3AAAUzJCb3Zw209.png"title="QQ截图201 查看详情

BroadcastReceiver 生命周期——静态变量

】BroadcastReceiver生命周期——静态变量【英文标题】:BroadcastReceiverLifeCycle--StaticVariables【发布时间】:2011-09-1201:25:51【问题描述】:我有一个BroadcastReceiver类。我声明了一些静态变量,其值在onReceive()方法中更新。据我所知,静... 查看详情

BroadcastReceiver 的 onReceive 中 Intent extra 为空

】BroadcastReceiver的onReceive中Intentextra为空【英文标题】:IntentextrasareemptyinonReceiveofBroadcastReceiver【发布时间】:2018-04-1902:46:03【问题描述】:我想在BroadcastReceiver类的onReceive()方法中从Intent中获取一些参数。但是只有intALARM_COUNT=1,... 查看详情

BroadcastReceiver 不在发布模式下执行

】BroadcastReceiver不在发布模式下执行【英文标题】:BroadcastReceivernotexecuteonreleasemode【发布时间】:2019-01-2609:29:34【问题描述】:我尝试实现RequestSMSVerificationinanAndroidApp,我的代码在调试中就像一个魅力,但是当我生成签名apk应用... 查看详情