BroadcastReceiver使用完全解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38998213/article/details/81710782
广播接收器是一个用于接收广播通知信息,并做出对应处理的组件。比如我们常见的系统广播──通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。在实际开发中我们可以拥通过集成自BroadcastReceiver基类来进行自定义广播,实现我们的业务需求的消息通讯。广播接收器没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户,以此来达到一种通讯。

1、广播的类别
* 有序广播(普通广播):对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。这个也是我们使用较多的一种广播类型。
* 无序广播:它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播

2、广播的使用流程
1.  继承BroadcastReceiver实现自定义广播类:这里有两种形式的广播创建:单独类文件、内部类形式。重写onReceive方法进行消息的处理。
2.  注册广播:俗称有静态注册和动态注册。静态注册指在manifest文件中注册的广播,这种注册的广播具有应用程序级别的效果。动态注册就是通过代码进行注册,比如我们在Activity中通过Context.registerReceiver进行注册,这种广播具有组件级别的效果,即当我们调用unregisterReceiver()方法或组件销毁广播就无法被接收处理了。
3.  发送广播:这里发送广播通过Context的sendBroadcast()方法或sendOrderedBroadcast()方法进行发送普通广播或有序广播。


动态注册广播;
新建一个匿名内部类,继承 BroadCastReceiver,实现OnReceiver方法。使用IntentFilter增加一个Action。使用Intent进行设置Action,调用sendBroadcast(intent)。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//        Intent intent=new Intent(this,broadcastReeceiver.class);
//        startService(intent);INte
//        Intent intent=new Intent();
//        intent.setAction("com.dsw.send");
//        intent.putExtra("data", "data");
//        sendBroadcast(intent);
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction("zhangjiqun");
        registerReceiver(new broadCast(),intentFilter );

        Intent intent=new Intent();
        intent.setAction("zhangjiqun");
        sendBroadcast(intent);

    }

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

        }
    }
}

静态注册广播;

新建一个BroadCast类:

public class BroadCast extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"12345",Toast.LENGTH_LONG).show();
    }
}

在manifests注册:

<receiver android:name=".broadCastReceiver.BroadCast">
    <intent-filter>
        <action android:name="zhangjiqun"/>
    </intent-filter>
</receiver>

使用Intent进行启动

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent();
        intent.setAction("zhangjiqun");
        intent.putExtra("data", "data");
        sendBroadcast(intent);

//        IntentFilter intentFilter=new IntentFilter();
//        intentFilter.addAction("zhangjiqun");
//        registerReceiver(new broadCast(),intentFilter );
//        Intent intent=new Intent();
//        intent.setAction("zhangjiqun");
//        sendBroadcast(intent);

    }
}

  有序广播可以在intentFilter中设置<intent-filter android:priority="500">    优先级,进行接收先后的设置,有序广播 有权限中断广播的继续发送。

细心点可以发现,我们在注册BroadcastReceiver的时候,会指定这样一个属性:android:exported="false",这个属性就是指定我们的广播在本进程中进行使用。当我们的广播将这个属性设置为true的时候,则其他应用中就可以发送到广播让我们的这个应用接受到。

BroadcastReceiver的生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报错 。如果需要处理耗时的业务,我们可以开启Service进行处理,谨记一点:广播主要目的是监听获取通知,不要处理繁杂的业务。

猜你喜欢

转载自blog.csdn.net/qq_38998213/article/details/81710782