Android 广播接收器 BroadcastReceiver 注册、注销、优先级、拦截



BroadcastReceiver也就是广播接收者的意思,顾名思义,它就是用来接收来自系统和应用中的广播。

Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。

Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。而作为应用开发者,就需要数练掌握Android系统提供的一个开发利器,那就是BroadcastReceiver。下面我们就对BroadcastReceiver逐一地分析和演练,了解和掌握它的各种功能和用法。

首先,我们来演示一下创建一个BroadcastReceiver,并让这个BroadcastReceiver能够根据我们的需要来运行。

要创建自己的BroadcastReceiver对象,我们需要继承android.content.BroadcastReceiver,并实现其onReceive方法。下面我们就创建一个名为MyReceiver广播接收者:

BroadcastReceiver逐一地分析和演练,了解和掌握它的各种功能和用法。

首先,我们来演示一下创建一个BroadcastReceiver,并让这个BroadcastReceiver能够根据我们的需要来运行。

要创建自己的BroadcastReceiver对象,我们需要继承android.content.BroadcastReceiver,并实现其onReceive方法。

 

创建一个新工程LearnBroadcastReceiver,一个空Activity

广播接收器MyReceiver

用于显示Intent调用

 

MyReceiver1

隐式Intent

拦截广播

MyReceiver2

隐式Intent

实现主动注册也注销,拦截广播

创建一个MyReceiver, MyReceiver1, MyReceiver2 广播接收类扩展至
 
public class MyReceiver extends BroadcastReceiver {

    public MyReceiver() {

    }

  

    @Override

    public void onReceive(Context context, Intent intent) {

        System.out.println("0个广播接收器接收到消息是:====="+intent.getStringExtra("data"));

  

    }

}

 

public class MyReceiver1 extends BroadcastReceiver {

    public MyReceiver1() {

    }

  

    @Override

    public void onReceive(Context context, Intent intent) {

        System.out.println("1个广播接收器接收到消息是:"+intent.getStringExtra("data"));

        if (intent.getStringExtra("isLanJie").equals("TRUE")) {

            abortBroadcast();  //拦截广播,不让优先级别低的接收该到消息

        }

  

        }

}

 

public class MyReceiver2 extends BroadcastReceiver {

    public static final String ACTION="com.czg.com.learnbroadcastreceiver.intent.action.MyReceiver2";

    public MyReceiver2() {

  

    }

  

    @Override

    public void onReceive(Context context, Intent intent) {

        System.out.println("2个广播接收器接收到消息是:" + intent.getStringExtra("data"));

        if (intent.getStringExtra("isLanJie").equals("TRUE")){

            abortBroadcast();  //拦截广播,不让优先级别低的接收该到消息

  

        }

  

    }

}

 

修改androidManifest.xml中广播接收器

<receiver

    android:name=".MyReceiver"

    android:enabled="true"

    android:exported="true" >

  

</receiver>

  

  <!--<receiver android:name=".MyReceiver2" >-->

    <!--<intent-filter>-->

        <!--<action android:name="com.czg.com.learnbroadcastreceiver.intent.action.MyReceiver2" />-->

    <!--</intent-filter>-->

<!--</receiver>-->

  

  <receiver

    android:name=".MyReceiver1"

    android:enabled="true"

    android:exported="true" >

    <intent-filter android:priority="1">

        <action android:name="com.czg.com.learnbroadcastreceiver.intent.action.MyReceiver2" />

    </intent-filter>

</receiver>

 

 

在创建完我们的MyReceiver2之后,还不能够使它进入工作状态,我们需要为它注册一个指定的广播地址。没有注册广播地址的BroadcastReceiver就像一个缺少选台按钮的收音机,虽然功能俱备,但也无法收到电台的信号。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    Button bSend;

    private  MyReceiver2 myReceiver2=null;

  

  

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

  

        bSend=(Button) findViewById(R.id.btnSendMsg);

        bSend.setOnClickListener(this);

        findViewById(R.id.btnReg).setOnClickListener(this);

        findViewById(R.id.btnUnReg).setOnClickListener(this);

        findViewById(R.id.btnsendYinShi).setOnClickListener(this);

    }

  

    @Override

    public void onClick(View v) {

        switch (v.getId()){

            case R.id.btnSendMsg:

                //发送消息

                Intent intent=new Intent(this,MyReceiver.class);

                intent.putExtra("data", "消息来自czg");

                sendBroadcast(intent);

                break;

  

            case R.id.btnsendYinShi:

                //没有自动注册的广播接收器自能用隐式的Intent进行创建(没有告诉要发送给哪个接收器,所有的接收器都可以接受到,优先级比较高的接收器可以根据需要拦截后面接收的的接收)

                Intent intent2=new Intent(MyReceiver2.ACTION);

                intent2.putExtra("data","消息来自czg");

                CheckBox cb= (CheckBox) findViewById(R.id.checkBox);

                if (cb.isChecked()==true){

                    intent2.putExtra("isLanJie","TRUE");

                }else {

                    intent2.putExtra("isLanJie","FALSE");

                }

  

                //sendBroadcast(intent2);

                sendOrderedBroadcast(intent2, null); //发送可以被拦截的广播,第二个参数可以指定权限

                break;

            case R.id.btnReg:  //注册

                if (myReceiver2==null){

                    myReceiver2=new MyReceiver2();

                    registerReceiver(myReceiver2,new IntentFilter(MyReceiver2.ACTION));

  

                }

                break;

            case R.id.btnUnReg:  //注销

                if (myReceiver2!=null){

                    unregisterReceiver(myReceiver2);

                    myReceiver2=null;

  

                }

                break;

        }

    }

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
@SuppressLint("NewApi") public class MainActivity extends Activity { SmsReceiver myReceiver; Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { test(); } }); } public void test(){ Cursor cursor = null; String defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(this); Intent intent = new Intent(Sms.Intents.ACTION_CHANGE_DEFAULT); intent.putExtra(Sms.Intents.EXTRA_PACKAGE_NAME, this.getPackageName()); startActivity(intent); try { cursor = getContentResolver().query(Uri.parse("content://sms/inbox"), new String[] { "_id", "address", "read" }, "read = ? ", new String[] {"0" }, "date desc"); if (cursor != null) { ContentValues values = new ContentValues(); values.put("read", "1"); for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { Log.v("cky", "" + cursor.getInt(cursor.getColumnIndex("_id")) + " , " + cursor.getString(cursor.getColumnIndex("address"))); int res = getContentResolver().update(Uri.parse("content://sms/inbox"), values, "_id=?", new String[] { "" + cursor.getInt(cursor.getColumnIndex("_id")) }); Log.i("cky","geng xin = "+res); } } intent = new Intent(Sms.Intents.ACTION_CHANGE_DEFAULT); intent.putExtra(Sms.Intents.EXTRA_PACKAGE_NAME, defaultSmsApp); startActivity(intent); } catch (Exception e) { e.printStackTrace(); } finally { if (cursor != null) { cursor.close(); cursor = null; } } } }
Android Studio 中注册广播接收器BroadcastReceiver)需要以下步骤: 1. 创建一个继承自 BroadcastReceiver 的类,这个类将处理接收到的广播消息。例如,你可以创建一个名为 MyBroadcastReceiver 的类。 ```java public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 在这里处理接收到的广播消息 } } ``` 2. 在 AndroidManifest.xml 文件中声明广播接收器。在 `<application>` 标签内部添加如下代码: ```xml <receiver android:name=".MyBroadcastReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.ACTION_NAME" /> <!-- 添加其他需要匹配的 action --> </intent-filter> </receiver> ``` 其中,`android:name` 属性指定了广播接收器的类名,`.MyBroadcastReceiver` 表示当前包名下的 MyBroadcastReceiver 类。`android:enabled` 和 `android:exported` 属性分别用于启用和导出广播接收器。 3. 在你需要发送广播的地方,创建一个 Intent 对象,并使用 `sendBroadcast()` 方法发送广播。 ```java Intent intent = new Intent(); intent.setAction("android.intent.action.ACTION_NAME"); // 添加其他需要传递的数据 sendBroadcast(intent); ``` 其中,`"android.intent.action.ACTION_NAME"` 是你自定义的广播 action,用于匹配注册广播接收器。 这样,当发送广播 action 与注册广播接收器的 action 匹配时,MyBroadcastReceiver 类中的 `onReceive()` 方法将被调用,你可以在该方法中处理接收到的广播消息。记得在不需要接收广播时,及时取消注册广播接收器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牵手生活

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值