Android广播之发送自定义广播+本地广播(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzhworld/article/details/70233926

#一、发送标准广播
在上一篇文章介绍了如何接收广播,这一篇准备介绍如何发送。
我们要发送首先得有一个广播接收器才能看到我们所发送的,不然发了也没用,所以先定义一个静态接收器。
##1、静态接收器代码

//定义一个接受的
public class BootCompleteReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Boot Complete", Toast.LENGTH_SHORT).show();
    }
}

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

##2、AndroidMainfest.xml的设置

<application
        ...
        <receiver android:name=".BootCompleteReceiver">
            <intent-filter>
                <action android:name="android.example.broadcasttest.MY_BROADCAST"/>
            </intent-filter>
        </receiver>
    </application>

##3、标准广播代码

public class MainActivity extends Activity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button =(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("android.example.broadcasttest.MY_BROADCAST");
                sendBroadcast(intent);
            }
        });
    }
}
我们注意到android.example.broadcasttest.MY_BROADCAST在接收器里接收的是这一个量,因此在发送的时候也应该发送这一个才能接收得到

#二、有序广播
##1、有序广播和标准广播程序上只需改动一行代码
将onCreate中的sendBroadcast改为

sendOrderBroadcast(intent,null);

这样改动即可,但是我们怎么看出有序有什么区别呢,所以我们需要创建另一个标准广播的app,详见上面,思路是在有序广播发送之后,两个app都能收的到,但是我们需要突出有序,所以在标准广播中改动

<application
        ...
        <receiver android:name=".BootCompleteReceiver">
            <intent-filter android:priority=“100”>
                <action android:name="android.example.broadcasttest.MY_BROADCAST"/>
            </intent-filter>
        </receiver>
    </application>

注意突出的部分,就是将标准广播的优先权提高,然后在标准广播的接收器代码中

##2、广播终止下传

//定义一个接受器
public class BootCompleteReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Boot Complete", Toast.LENGTH_SHORT).show();
        abortBroadcast();//在此处终止广播的继续下传
    }
}

意思即广播传到标准广播的接收器中就终止传递了,所以有序广播的接收器就就接收不到了

#三、本地广播
使用本地广播的目的是防止发出的广播被截断或者一直收到垃圾广播,本地广播的使用只能在本程序中,因为只能在本程序中,因而只能使用动态注册监听
解释可详见Android广播(一)

public class MainActivity extends Activity {
    private IntentFilter mIntentFilter;
    private LocalReceiver mLocalReceiver;
    private LocalBroadcastManager mLocalBroadcastManager;
    @Override
    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mLocalBroadcastManager =LocalBroadcastManager.getInstance(this);
//按钮的监视
        Button button =(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("android.example.broadcasttest.LOCAL_BROADCAST");
                mLocalBroadcastManager.sendBroadcast(intent);
            }
        });
        mIntentFilter = new IntentFilter();
        mIntentFilter.addAction("android.example.broadcasttest.LOCAL_BROADCAST");
        mLocalReceiver = new LocalReceiver();
        mLocalBroadcastManager.registerReceiver(mLocalReceiver,mIntentFilter);
    }

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

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

猜你喜欢

转载自blog.csdn.net/wzhworld/article/details/70233926