静态广播、动态广播以及黏性广播的无序显示

今天玩了下android中的广播,当然了,只是很浅的东西,毕竟还是菜鸟中,嘿嘿!

首先,我们来认识下静态广播与动态广播的区别:

  1. 静态广播是在清单文件中配置属性,而动态广播是用java代码实现;
  2. 动态广播在无序广播中的优先级大于静态广播;
  3. 动态广播在退出后,不会接收到广播。

下面,我模拟了一个发送广播的代码:
xml代码:

<EditText
        android:id="@+id/et_main_sender"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入广播内容:" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送"
        android:onClick="send"
        />

java代码:
`private EditText et_main_sender;
private Intent intent;

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

    et_main_sender = (EditText) findViewById(R.id.et_main_sender);

    intent = new Intent();

    //给广播设置名称
    intent.setAction("com.android_sender.893");
}

public void send(View view){
    //获取编辑框的内容
    String context=et_main_sender.getText().toString();

    //将内容放入intent中
    intent.putExtra("context",context);

    //发送广播(无序广播)
    sendBroadcast(intent);
}`

以上就是一个简易的发送广播的功能,当在编辑框输入广播内容,点击发送,广播就发送到intent中去了。

下面我们来接收,这是新建的一个module,并新建一个类,使它继承BroadcastReceiver:
java代码:
public class MyReceived01 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//判断intent中是否有名称为com.android_sender.893的广播
if("com.android_sender.893".equals(intent.getAction())){
String data=intent.getStringExtra("context");
Log.i("test","广播1号接收到:"+data);
}
}
}

不过,这是静态的广播,还需要在清单文件中配置一下:

<receiver android:name=".MyReceived01">
            <intent-filter>
                <action android:name="com.android_bcsender.893"></action>
            </intent-filter>
        </receiver>

那么,下面我们再来看看动态广播:
动态广播,就是指在Activity中用java代码实现接收广播:

public class MainActivity extends AppCompatActivity {

    private MyRecevier01 myRecevier01;
    private IntentFilter intentFilter;

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

        //实例化MyRecevier01
        myRecevier01 = new MyRecevier01();

        //实例化interFilter
        intentFilter = new IntentFilter();
        //给intentFilter添加一个行为
        intentFilter.addAction("com.android_bcsender.893");
    }

    @Override
    protected void onResume() {
        super.onResume();
        //动态注册广播   (静态注册是在清单文件中配置)
        registerReceiver(myRecevier01,intentFilter);
    }

    //必须要写的
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //注销动态广播 
        unregisterReceiver(myRecevier01);
    }
}

当退出当前程序时,动态广播需要注销掉!!!

最后,我们再来看看黏性广播:
在写黏性广播时,一定要注意,需要在发送广播的清单文件中给予
权限:<!--给黏性广播设置权限-->
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>

然后在发送广播的Activity的send方法中将//发送广播
sendBroadcast(intent);
替换成//发送黏性广播
sendStickyBroadcast(intent);

下面我还模拟了一个系统广播,如果同行们想自己再去捣鼓其他的系统广播,可以看看android系统广播大全

首先,在清单文件中配置一个receiver:<receiver android:name=".MyPhoneState">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>

然后新建一个类继承BroadcastReceiver:
`public class MyPhoneState extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(“android.intent.action.PHONE_STATE”.equals(intent.getAction())){
String number=intent.getStringExtra(“incoming_number”);
Log.i(“test”,”来电话了!”);

        //获取电话状态
        //需要用到电话管理者
        TelephonyManager tm=  (TelephonyManager) context.getSystemService(context.TELEPHONY_SERVICE);
        int state=tm.getCallState();
        switch (state) {
            case TelephonyManager.CALL_STATE_RINGING:
                Log.i("test","还未接电话");
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                Log.i("test","正在接电话");
                break;
            case TelephonyManager.CALL_STATE_IDLE:
                Log.i("test","已挂断电话");
                break;
        }
    }
}

}`

那么,以上就是我今天所学的,如果有哪些不妥的地方,一定要在下方评论区,或者私信给我,谢谢亲们!让我们一起进步吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值