发送自定义广播

作者: wxyass 分类: Android 发布时间: 2017-03-29 16:48

发送自定义广播

发送标准广播

在发送广播之前,我们还是需要先定义一个广播接收器来准备接收此广播才行,不然发
出去也是白发.

1 新建一个应用项目BroadcastTest1

2 新建一个 MyBroadcastReceiver继承自 BroadcastReceiver.

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

/**
 * 自定义一个广播接收器,
 */
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "收到自己的广播了", 0).show();
    }
}  

3 在 AndroidManifest.xml 中对这个广播接收器进行注册

<receiver android:name="com.yassblog.bootreceiver.MyBroadcastReceiver" >
    <intent-filter>
        <action android:name="com.example.broadcasttest.MY_BROADCAST" />
    </intent-filter>
</receiver>  

可以看到,这里让 MyBroadcastReceiver 接收一条值为com.example.broadcasttest.MY_BROADCAST的广播,因此待会儿在发送广播的时候,我们就需要发出这样的一条广播.

4 修改 MainActivity 中的代码, 并修改布局文件.

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

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 OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new 
                    Intent("com.example.broadcasttest.MY_BROADCAST");
                sendBroadcast(intent);
            }
        });
    }
}  

可以看到,我们在按钮的点击事件里面加入了发送自定义广播的逻辑。首先构建出了一个 Intent 对象,并把要发送的广播的值传入,然后调用了 Context 的 sendBroadcast()方法将广播发送出去,这样所有监听 com.example.broadcasttest.MY_BROADCAST 这条广播的广播接收器就会收到消息。此时发出去的广播就是一条标准广播.

activity_main.xml布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送广播" />

</LinearLayout>  

5 重新运行程序,并点击一下按钮, 查看效果.

另外,由于广播是使用 Intent 进行传递的,因此你还可以在 Intent 中携带一些数据传递给广播接收器。

发送有序广播

广播是一种可以跨进程的通信方式,因此在我们应用程序内发出的广播,其他的应用程序应该也是可以收到的。

为了验证这一点,我们需要再新建一个应用项目BroadcastTest2 。

1 新建 AnotherBroadcastReceiver 继承自 BroadcastReceiver .

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

/**
 * 自定义一个广播接收器,
 */
public class AnotherBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "收到另个应用的广播了", 0).show();
    }
}  

2 在AndroidManifest.xml 中对这个广播接收器进行注册.

<receiver android:name="com.yasscs.bootreceiver.AnotherBroadcastReceiver" >
    <intent-filter>
        <action android:name="com.example.broadcasttest.MY_BROADCAST" />
    </intent-filter>
</receiver>  

可以看到,AnotherBroadcastReceiver 同样接收的是 com.example.broadcasttest.MY_BROADCAST 这条广播.

3 将两个项目运行到手机上,点击项目1中的按钮,会发现收到两次吐司提示. 说明项目1发出的广播不但自己收到了, 项目2也同样收到了.

不过到目前为止,程序里发出的都还是标准广播,现在我们来尝试一下发送有序广播。

1 修改项目1的 MainActivity 代码.

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

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 OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new 
                    Intent("com.example.broadcasttest.MY_BROADCAST");
                // 发送有序广播
                sendOrderedBroadcast(intent,null);
            }
        });
    }
}  

可以看到,发送有序广播只需要改动一行代码,即将 sendBroadcast()方法改成sendOrderedBroadcast()方法。sendOrderedBroadcast()方法接收两个参数,第一个参数仍然是Intent,第二个参数是一个与权限相关的字符串,这里传入 null 就行了。现在重新运行程序,并点击按钮,你会发现,两个应用程序仍然都可以接收到这条广播 .

看上去好像和标准广播没什么区别嘛,不过别忘了,这个时候的广播接收器是有先后顺序的,而且前面的广播接收器还可以将广播截断,以阻止其继续传播。

那么该如何设定广播接收器的先后顺序呢?当然是在注册的时候进行设定的了.

2 修改项目1的 AndroidManifest.xml 中的代码

<receiver android:name="com.yassblog.bootreceiver.MyBroadcastReceiver" >
    <intent-filter android:priority="100" >
        <action android:name="com.example.broadcasttest.MY_BROADCAST" />
    </intent-filter>
</receiver>    

可以看到,我们通过 android:priority 属性给广播接收器设置了优先级,优先级比较高的广播接收器就可以先收到广播。这里将 MyBroadcastReceiver 的优先级设成了 100,以保证它一定会在 AnotherBroadcastReceiver 之前收到广播。

既然已经获得了接收广播的优先权,那么 MyBroadcastReceiver 就可以选择是否允许广播继续传递了。

3 修改项目1的 MyBroadcastReceiver 中的代码

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

/**
 * 自定义一个广播接收器,
 */
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "收到自己的广播了", 0).show();
        // 截断广播
        abortBroadcast();
    }
}  

如果在 onReceive()方法中调用了 abortBroadcast()方法,就表示将这条广播截断,后面的广播接收器将无法再接收到这条广播。现在重新运行程序,并点击一下按钮,你会发现,只有 MyBroadcastReceiver 中的 Toast 信息能够弹出,说明这条广播经过 MyBroadcastReceiver 之后确实是终止传递了。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注