Android:BroadcastReceiver

Broadcast分类
java

注册方式:android

  • 动态广播安全

    • 在代码中注册receiverapp

    • 必定要手动在onDestroy()时调用unregisterReveiver()来取消注册ide

  • 静态广播this

    • 在AndroidManifest.xml中注册receiver(主要是设定action)spa

动态广播:.net

1. 在代码中设置receiver、监听的广播类型并进行注册:code

 public class MainActivity extends Activity {
    private NetworkChangeReceiver receiver;

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

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");

        receiver = new NetworkChangeReceiver();
        registerReceiver(receiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        unregisterReceiver(receiver);//remember to unregister manually
        super.onDestroy();
    }
}

2. 定义receiver的行为:继承BroadcastReceiver并在覆写onReceiver()时定义好接收到广播时处理的逻辑:
orm

 public class NetworkChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = manager.getActiveNetworkInfo();
        if(networkInfo != null && networkInfo.isAvailable())
            Toast.makeText(context, "Network is available.", Toast.LENGTH_SHORT).show();
        else
            Toast.makeText(context, "Network is unavailable.", Toast.LENGTH_SHORT).show();
    }
}

3. 在AndroidManifest.xml中定义必要的权限,主要<uses-permission>标签位于<manifest>的下一级,即与<application>同级:

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

 

静态广播(以开机启动的广播为例)

1. 定义receiver的行为:

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

2. 在AndroidManifest.xml中定义receiver(与<activity>同级,<application>的子元素):

<receiver android:name=".MyBroadcast">
    <intent-filter android:priority="100">
        <action android:name="com.scv.lawrence.MY_BROADCAST"/>
    </intent-filter>
</receiver>

3. 在AndroidManifest.xml中添加相应权限(<application>同级,<manifest>的子元素):

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

 

接收顺序:

  • 标准(Normal broadcast)

    • 默认的广播方式,即broadcast发出后,全部receiver几乎在同时接收到。

  • 有序(Ordered broadcast)

    • receiver根据设定的优先级(priority)来决定broadcast的传递顺序,较高优先级的receiver能够选择拦截该broadcast阻止其向后传播

  • 两者区别

    • 发送广播时,标准广播调用的是sendBroadcast(),有序广播调用的是sendOrderedBroadcast()

    • 接收广播时(在AndroidManifest.xml中注册receiver),标准广播不用在<intent-filter>中设置android:priority属性,有序广播则须要设定一个整数,数值越大priority越高

在代码中发送自定义的标准/无序广播:

Button sendBroadcast = (Button) findViewById(R.id.broadcast);
sendBroadcast.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent("com.scv.lawrence.MY_BROADCAST");
        sendBroadcast(intent);
//      sendOrderedBroadcast(intent, null);
    }
});

 在AndroidManifest.xml中定义(父元素为<application>,即与<activity>同级):

<receiver android:name=".MyBroadcast">
    <intent-filter android:priority="100">
        <action android:name="com.scv.lawrence.MY_BROADCAST"/>
    </intent-filter>
</receiver>

  

广播范围:

  • 全局广播

    • 非LocalBroadcastManager进行发送或接收的广播即为全局广播

  • 本地广播

    • 发送/接收的broadcast只限于当前app范围内,安全性比全局高

    • 与全局广播的区别在于本地广播依靠LocalBroadcastManager进行注册、发送及注销receiver

 本地广播:

1. 定义接收到广播的行为:

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

 

2. 和动态广播差很少,区别主要在使用LocalBroadcastManager的实例来进行操做:

public class MainActivity extends Activity {
    private LocalBroadcastManager localBroadcastManager;
    private LocalBroadcastReceiver localReceiver;

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

        //Local Broadcast
        localBroadcastManager = LocalBroadcastManager.getInstance(MainActivity.this);

        final Button localBroadcast = (Button) findViewById(R.id.local_broadcast);
        localBroadcast.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.scv.lawrence.LOCAL_BROADCAST");
                localBroadcastManager.sendBroadcast(intent);
            }
        });

        IntentFilter localIntentFilter = new IntentFilter();
        localIntentFilter.addAction("com.scv.lawrence.LOCAL_BROADCAST");

        localReceiver = new LocalBroadcastReceiver();
        localBroadcastManager.registerReceiver(localReceiver, localIntentFilter);
    }

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

 

3. 在AndroidManifest.xml中配置permission. (若有必要)


参考: 《第一行代码:Android》 郭霖(著) 

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息