22、Android -- Receiver(接收广播) 基础学习

说明

广播分为系统广播、自定义广播

系统广播包含网络开启广播、开机广播等系统自带的
自定义广播:顾名思义就是自己定义的广播

接收广播

接收广播:分为静态接收广播、动态接收广播;

静态接收广播

1、新建广播接收类
java/com/pha/three/receiver/StaticBroadcastReceiver.java

package com.pha.three.receiver;

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

import com.pha.three.face.ReceiverFlag;

public class StaticBroadcastReceiver extends BroadcastReceiver {
    private static final String TAG = StaticBroadcastReceiver.class.getSimpleName();

    @Override
    public void onReceive(Context context, Intent intent) {
        if(ReceiverFlag.Static_Receiver_Name.equals(intent.getAction()))
        Toast.makeText(context, "我已经接收信息", Toast.LENGTH_SHORT).show();
    }
}

其中 ReceiverFlag.Static_Receiver_Name 是一个广播标识,我单独放到一个文件中,当然也可以放一起
java/com/pha/three/face/ReceiverFlag.java

package com.pha.three.face;
import android.nfc.Tag;
public interface ReceiverFlag {

    // 静态广播接收者标识
    String Static_Receiver_Name ="com.pha.three.face.ReceiverFlag";
    // 动态广播接收者标识
    String Trends_Receiver_Name ="com.pha.three.face.ReceiverFlag.Trends";
}

2、静态注册接收广播
在AndroidManifest.xml中注册,其代码:

		<receiver android:name=".receiver.StaticBroadcastReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="com.pha.three.face.ReceiverFlag"></action>
            </intent-filter>
        </receiver>

其中注意点 :

  • 注册用receiver 。
  • android:exported的值尽量为true 。如果为false,本app可能获取,但是其他app会获取不到
  • android:name 这是区分广播的标识。就是 1中的 Static_Receiver_Name 值

3、发送广播
当前app发送广播 。目前这个是按钮点击触发,如果是系统广播,对应的操作就会触发。比如,连接网络,就可以处方网络广播。不需要按钮点击等操作

 	// 广播发送
    private void StartStaticBroadcast() {
        Intent intent=new Intent();
        intent.setAction(ReceiverFlag.Static_Receiver_Name);
        sendBroadcast(intent);
    }

动态接收广播

1、新建广播接收类
这完全可以用静态的广播。练习中为了区分,特意新建一个广播。
对比可以看出来是一样:继承 BroadcastReceiver ,并重写onReceive

java/com/pha/three/receiver/TrendsBroadcastReceiver.java

package com.pha.three.receiver;

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

public class TrendsBroadcastReceiver extends BroadcastReceiver {
    private static final String TAG = TrendsBroadcastReceiver.class.getSimpleName();

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e(TAG, "我已经接收信息TrendsBroadcastReceiver" );
    }
}

2、动态注册接收广播

 	// 动态接收广播
    private void RegisterBroadcast() {
        TrendsBroadcastReceiver trendsBroadcastReceiver = new TrendsBroadcastReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(ReceiverFlag.Trends_Receiver_Name);
        registerReceiver(trendsBroadcastReceiver,filter);

    }

3、发送广播
当前app发送广播 。目前这个是按钮点击触发,如果是系统广播,对应的操作就会触发。比如,连接网络,就可以处方网络广播。不需要按钮点击等操作

 	// 广播发送
    private void StartStaticBroadcast() {
        Intent intent=new Intent();
        intent.setAction(ReceiverFlag.Trends_Receiver_Name);
        sendBroadcast(intent);
    }

最终代码:java/com/pha/three/MainActivity2.java

package com.pha.three;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;

import com.pha.three.face.ReceiverFlag;
import com.pha.three.receiver.TrendsBroadcastReceiver;


public class MainActivity2 extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        findViewById(R.id.btn_main2_one).setOnClickListener(this);
        findViewById(R.id.btn_main2_two).setOnClickListener(this);
        RegisterBroadcast();
    }

    // 动态接收广播
    private void RegisterBroadcast() {
        TrendsBroadcastReceiver trendsBroadcastReceiver = new TrendsBroadcastReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(ReceiverFlag.Trends_Receiver_Name);
        registerReceiver(trendsBroadcastReceiver,filter);

    }
    // 广播发送-对应 动态接收广播
    private void StartTrendsBroadcast() {
        Intent intent=new Intent();
        intent.setAction(ReceiverFlag.Trends_Receiver_Name);
        sendBroadcast(intent);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_main2_one:
                StartStaticBroadcast();
                break;
            case R.id.btn_main2_two:
                StartTrendsBroadcast();
                break;
            default:
                break;
        }
    }

    // 广播发送
    private void StartStaticBroadcast() {
        Intent intent=new Intent();
        intent.setAction(ReceiverFlag.Static_Receiver_Name);
        sendBroadcast(intent);
    }

}

广播发送

其实上面的广播接收中包含了广播发送,不过是在同一个app中
下面说下跨app的发送
以静态接收为例

在广播接收的基础上,再新建一个项目SendBroadcast。
layout布局就不列举了,就是一个按钮
java/com/pha/sendbroadcast/MainActivity.java

package com.pha.sendbroadcast;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

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

    public void SendBroadcast(View view) {
        Intent intent = new Intent();
        intent.setAction("com.pha.three.face.ReceiverFlag");
        //intent.setClassName("com.pha.three","com.pha.three.receiver.StaticBroadcastReceiver");
        sendBroadcast(intent);
    }
}

注意事项:
广播接收的app中,AndroidManifest.xml注册组件的时候,android:exported一定要为true
如果还接收不到的话,发送广播是可以添加intent.setClassName(包名,类名)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值