发送广播 和 接收广播

顺序广播

发送:sendOrderedBroadcast(Intent, String)

该方法一次向一个接收器发送广播。当每个接收器依次执行时,它可以将结果传播到下一个接收器,或者它可以完全中止广播,这样就不会将结果传递给其他接收器。可以使用匹配意图过滤器的android:priority属性控制接收程序的运行顺序;具有相同优先级的接收程序将以任意顺序运行。

//参数2,设置广播权限(permission)
sendOrderedBroadcast(intent,Manifest.permission.SEND_SMS);

正常广播

发送:sendBroadcast(Intent)

该方法以未定义的顺序向所有接收器发送广播。这称为正常广播。这更有效,但意味着接收器无法读取其他接收器的结果、传播从广播接收到的数据或中止广播。

public class MainActivity extends AppCompatActivity {
    Receiver1 receiver1;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        /**
         * dynamic register
         */
        receiver1 = new Receiver1();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("dynamic");
        //注册广播
        registerReceiver(receiver1,intentFilter);
 
        findViewById(R.id.btn_dynamic).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setAction("dynamic");
                //发送广播
                sendBroadcast(intent);
            }
        });
 
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        /取消注册
        unregisterReceiver(receiver1);
    }
}

本地广播

发送:LocalBroadcastManager.sendBroadcast

该方法将广播发送到与发送方位于同一应用程序中的接收器。如果不需要跨应用程序发送广播,请使用本地广播。该实现效率更高(不需要进程间通信),而且您不必担心与其他应用程序能够接收或发送广播相关的任何安全问题。

LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(MainActivity.this);

localBroadcastManager.sendBroadcast(intent);

接收本地广播也要用 LocalBroadcastManager

        /**
         * dynamic register
         */
        receiver1 = new Receiver1();
        IntentFilter intentFilter = new IntentFilter();
        //这里的action和广播发送处的action是对应的
        intentFilter.addAction("dynamic");

        LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(MainActivity.this);
        localBroadcastManager.registerReceiver(receiver1,intentFilter);

        /**
         * 在恰当的地方取消注册
         */
        localBroadcastManager.unregisterReceiver(receiver1);

发送带权限的广播

以正常广播为例

public class MainActivity extends AppCompatActivity {
    Receiver1 receiver1;

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

        /**
         * dynamic register
         */
        receiver1 = new Receiver1();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("dynamic");

        //注册广播时,带上相应的权限
        registerReceiver(receiver1,intentFilter,Manifest.permission.SEND_SMS,null);

        findViewById(R.id.btn_dynamic).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //广播信息的载体是intent对象
                Intent intent = new Intent();
                //intent的action标识广播的活动/事件
                intent.setAction("dynamic");

                //发送带权限的广播
                sendBroadcast(intent, Manifest.permission.SEND_SMS);
            }
        });

    }

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

或者静态注册broadcast receiver,在<manifest> - <application>中添加

<receiver android:name=".Receiver1"
          android:permission="android.permission.SEND_SMS">
    <intent-filter>
        <action android:name="dynamic"/>
    </intent-filter>
</receiver>

一定要在<manifest>中请求相应权限

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

然后用户授权,才有效

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值