当前位置:网站首页>四大组件之一BroadCast(其一)

四大组件之一BroadCast(其一)

2022-08-11 05:22:00 hqhe260

android的四大组件:

Activity、Service、BroadCast(广播)、ContentProvider

BroadCast Receiver

  • 四大组件之一,必须在清单(androidManifest.xml)文件中进行注册

  • 是在组件之间传播数据(Intent)的一种机制

  • APP哪块用到了广播?

    • 电话

    • 短信

    • 电量

    • WIFI是否连接

广播具有以下特性:

1.广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁
2.广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框
3.最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉
4.耗时的较长的工作最好放在服务中完成
 

Android中出现的第一个错误?

在组件中进行耗时操作,就会报application no response (ANR)

广播接收者一种有几种?

标准广播

动态注册 使用java代码注册

静态注册 直接在androidManifest.xml注册

有序广播

.广播的分类

(1)按照发送的方式分类

  • 标准广播
    是一种异步的方式来进行传播的,广播发出去之后,所有的广播接收者几乎是同一时间收到消息的。他们之间没有先后顺序可言,而且这种广播是没法被截断的。
  • 有序广播
    是一种同步执行的广播,在广播发出去之后,同一时刻只有一个广播接收器可以收到消息。当广播中的逻辑执行完成后,广播才会继续传播。

(2)按照注册的方式分类

  • 动态注册广播
    顾名思义,就是在代码中注册的。
  • 静态注册广播
    动态注册要求程序必须在运行时才能进行,有一定的局限性,如果我们需要在程序还没启动的时候就可以接收到注册的广播,就需要静态注册了。主要是在AndroidManifest中进行注册。

实现简单的静态注册

  1. 创建广播接收者

     

  2. 在AndroidManifest.xml中对广播接收者进行注册

    <receiver
        android:name=".MyReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="hopu">
    
            </action>
        </intent-filter>
    
    </receiver>
  3. 发送广播

      Intent intent=new Intent();
    intent.setPackage(getPackageName());
      intent.setAction("hopu");
      intent.putExtra("info","你好啊你好啊");
      sendBroadcast(intent);

实现简单的动态注册

btn_senddymnic=findViewById(R.id.btn_senddymnic);
btn_senddymnic.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent=new Intent();
        intent.setAction("hopu999");
        intent.putExtra("info","动态是发送到发");
        sendBroadcast(intent);
    }
});

  myDymnicReceiver=new MyDymnicReceiver();
 IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("hopu999");
registerReceiver(myDymnicReceiver,intentFilter);
class MyDymnicReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("我是动态的",intent.getStringExtra("info"));
    }
}

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

原网站

版权声明
本文为[hqhe260]所创,转载请带上原文链接,感谢
https://blog.csdn.net/heqiang260/article/details/125951820