广播接收者

广播接收者

安卓系统:相当于广播电台:提供各种广播事件 电话 电量 sd卡状态等等

广播接收者:相当于一台收音机,我们可以接收到系统广播事件执行相应的代码.即使应用程序进程关闭 也可以接到广播

用法:

新建一个广播接收者

new->other->Broadcast Receiver

也可以自己新建一个class 继承BroadcastReceiver 重写 onReceiver方法

创建好的接收者回有一条抛异常的代码 删掉就好

throw new UnsupportedOperationException("Not yet implement");

系统广播接收方法:

我们试着 监听系统的广播事件,系统启动的广播,实现应用开机启动

2.去清单文件配置

配置是必须的,有个例外最后会提到.

 <receiver
           <!--接收者的名字-->
            android:name=".MyReceiver1"
            <!--是否可以new它的实例-->
            android:enabled="true"
            <!--4.4后特有 其他应用是否可以访问-->
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

其中action后面就是要匹配的系统启动时的广播

需要注意的是这里需要一个加一个权限

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

回到我们自己建的广播接收者里面 在onReceiver方法里写上启动页面的代码

 Intent intent1 = new Intent(context,MainActivity.class);
       //由于这样开启页面没有任务栈,我们需要自己建一个
intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent1);

开机启动功能完成

自定义广播

概念:自定义广播分为无序和有序

  • 无序广播:这种广播不可被终止,内容不可被改变

自定义发送无序广播方法:

我们通过一个按钮来发广播

 public void click(View view) {
        Intent intent = new Intent();
   //通过putExtra携带了一个数据 键是data值是 电视节目播出了
        intent.putExtra("data","电视节目播出了");
        intent.setAction("com.aaaaa.intent");
        sendBroadcast(intent);
        }

我们在清单文件配置稍微有点不同,这里是我们自己定义广播事件

<receiver
            android:name=".MyReceiver1"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
            <!--后面变成了自己定义的广播事件-->
                <action android:name="com.aaaaa.intent" />
            </intent-filter>
        </receiver>

接广播

package p5.itheima.com.app2;

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

public class MyReceiver1 extends BroadcastReceiver {
    public MyReceiver1() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
      /**
      *广播携带数据 通过getStringExtra接收
      */
        String action = intent.getStringExtra("data");
        Toast.makeText(context, action, Toast.LENGTH_SHORT).show();
    }
}

有序广播

开发者可以自己定义的另一种广播,这种广播的特点是一级一级传递可以被一个程序终止 修改数据 也可以通过配置参数监视数据最后传播的状态

 public void click(View view) {
        Intent intent = new Intent();
        intent.setAction("com.itheima.intent");
        sendOrderedBroadcast(intent,null,new FinalReceiver(),new Handler(),1,"凌晨三点半在屋顶一起看日出",null);
        }

sendOrderedBroadcast参数详解:

  • 第一个参数:意图,将intent传入就好
  • 第二个参数:接收权限
  • 第三个参数:广播接收者类型,可以将这广播个视为最终广播.可以检查数据最后传递的状态.
  • 第四个参数:Handler 实例.自己定义一个实例即可
  • 第五个参数:int类型的初始码,一个标识,自己随便定义一个int类型的值
  • 第六个参数:通过String携带的数据.这是有序广播特有的
  • 第七个参数:Bundle,底层一个map,表示是否接收一个额外的数据

有序广播的层级接受方法:

先建好Receive,注意在清单文件里配置

<intent-filter
    android:prioity="100"           
    >
    <action android:name="com.itheima.intent"></action>
</intent-filter>

这个action是 上面写好的action.要保持一致

android:prioity=”100”是优先级属性 范围是+1000到-1000可以决定接受广播的优先度

在新建行的Receive里的onReceive方法里写接收代码

public void onReceive(Context context,Intent intent){
  //这里我们可以取出传递来的数据
    String data = getResultData();
  //通过Toast弹一下证明我们取到了数据
  Toast,makeText(context,data,Toast.LENGTH_SHORT).show();
}

同理我们可以写出很多这样的接受方法 只是修改优先级便可以决定接受顺序.我们可以在接受时修改数据 让后面接收到的数据不同

public void onReceive(Context context,Intent intent){
    String data = getResultData();
  Toast,makeText(context,data,Toast.LENGTH_SHORT).show();
  //通过一个方法修改数据
  setResultData("凌晨三点半在家睡觉");
}

我们也可以终止数据传递

public void onReceive(Context context,Intent intent){
    String data = getResultData();
  //通过这个方法把传递终止
 abortBroadcast();

再创建一个最终的广播接收者 也就是前面参数三定义的FinalReceiver,把它创建出来

//拿到最后的数据
String data = getResultData();

最终广播接收者无需配置优先级!它具有特权,即使数据传递被终止它一样可以拿到

特殊广播接收者

概念:当某个广播事件特别频繁时.我们就不能按常规方式去进行接收.比如屏幕关闭唤醒事件

android.intent.action.SCREEN_OFF

android.intent.action.SCREEN_ON

这时候我们需要用Context.register.Receiver()方法进行动态注册

register.Receiver()两个参数详解

  • 要注册的receiver的实例
ScreenREceiver screenreceiver = new ScreenREceiver();
  • 意图过滤器的实例
 IntenFilte filter = new IntenFilter();

在意图过滤器里面添加我们正常配置需要的action

filter.addAction("android.intent.action.SCREEN_ON");
filter.addAction("android.intent.action.SCREEN_OFF");

我们动态注册的receiver需要手动取消 当我们不需要它的时候需要执行这个方法.参数里写刚刚注册的实例.

unregisterREceiver(screenreceiver);

猜你喜欢

转载自blog.csdn.net/gudan22168/article/details/78504086