Android Broadcast Receiver 广播接收者基本用法和跨进程通信

一、基本用法

创建一个广播接收器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.zhangyu.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MyReceiver extends BroadcastReceiver {
    private static final String TAG = "MyReceiver";
    public static final String ACTION = "com.zhangyu.broadcasttest.intent.action.MyReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        String key = intent.getStringExtra("key");
        Log.e(TAG, "onReceive: " + key);
    }
}

静态注册

1
2
3
4
<receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true"></receiver>

对于静态注册中的,发送广播

1
2
3
4
5
    private void sendBroadcast() {
        Intent intent = new Intent(this, MyReceiver.class);
        intent.putExtra("key", "zhangyu");
        sendBroadcast(intent);
    }

动态注册,和该情况下的发送广播

1
2
3
4
5
6
7
8
9
10
11
12
13
    private void unregisterBroadcast() {
        unregisterReceiver(myReceiver);
    }

    private void registerBroadcast() {
        registerReceiver(myReceiver, new IntentFilter(MyReceiver.ACTION));
    }

    private void sendBroadcast() {
        Intent intent = new Intent(MyReceiver.ACTION);
        intent.putExtra("key", "zhangyu");
        sendBroadcast(intent);
    }

二、跨进程通信

权限,两个程序都需要加入该权限。自定义的一个权限

1
2
    <uses-permission android:name="com.zhangyu.receivebroadcast.intent.permission.MyReceiver" />
    <permission android:name="com.zhangyu.receivebroadcast.intent.permission.MyReceiver"/>

b程序中的广播接收者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.zhangyu.receivebroadcast;

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

public class MyReceiver extends BroadcastReceiver {
    private static final String TAG = "MyReceiver";
    public static final String BROADCAST_PERMISSION = "com.zhangyu.receivebroadcast.intent.permission.MyReceiver";
    public static final String BROADCAST_ACTION = "com.zhangyu.receivebroadcast.intent.action.MyReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        //intent.getAction():获取发送过来的action)(从A发送过来的)
        if (intent.getAction().equals(BROADCAST_ACTION)) {
            Log.e(TAG, "onReceive: ");
            Toast.makeText(context, "接到一个广播!!!", Toast.LENGTH_LONG).show();
        }
    }
}

b程序中的动态注册

1
2
3
4
5
6
7
8
9
10
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 注册广播接收
        BroadcastReceiver receiveBroadCast = new MyReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(MyReceiver.BROADCAST_ACTION); // 只有持有相同的action的接受者才能接收此广播
        registerReceiver(receiveBroadCast, filter, MyReceiver.BROADCAST_PERMISSION, null);
    }

a程序中的发送

1
2
3
4
5
    public void onClick(View view) {
        Log.e(TAG, "onClick");
        Intent intent = new Intent("com.zhangyu.receivebroadcast.intent.action.MyReceiver");
        sendBroadcast(intent,"com.zhangyu.receivebroadcast.intent.permission.MyReceiver");
    }

参考文献

三、获取WiFi状态

广播接收者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.zhangyu.wifireceivertest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.WifiManager;
import android.widget.Toast;

public class WifiReceiver extends BroadcastReceiver {

    public static String WIFI_STATE_CHANGED = WifiManager.WIFI_STATE_CHANGED_ACTION;

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (WIFI_STATE_CHANGED.equals(action)) {
            // wifi status
            int wifistate = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED);
            if (wifistate == WifiManager.WIFI_STATE_ENABLED) {
                // sutatus on
                Toast.makeText(context, "wifi on", Toast.LENGTH_SHORT).show();
            } else if (wifistate == WifiManager.WIFI_STATE_DISABLED) {
                // sutatus off
                Toast.makeText(context, "wifi off", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

动态注册

1
2
3
4
5
6
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        registerReceiver(new WifiReceiver(), new IntentFilter(WifiReceiver.WIFI_STATE_CHANGED));
    }