Android系列之自定义有序广播

时间:2021-02-02 15:26:48

有序广播最主要的优先级,优先级高的先收到,优先级低的后收到,在这里我就不写两个接收者比较了,大家可以自己多写一个去比较看看,在代码里面我会顺便多给大家多讲一些小知识,所以,请认真看哦,我写在注释里面的了,其余的话不多说,直接粗暴直爽的上代码吧!


发送者的xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.zking.laci.android21_broadcast.MainActivity"
android:orientation="vertical"
>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_broadcast_main"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送"
android:onClick="send"
/>

</LinearLayout>

发送者的java类:

package com.zking.laci.android21_broadcast;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

private EditText et_broadcast_main;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_broadcast_main = (EditText) findViewById(R.id.et_broadcast_main);
}

public void send(View view){
String content=et_broadcast_main.getText().toString();
Intent i=new Intent();
//设置广播的名字
i.setAction("com.zking.laci.android21_broadcast.FM90.5");
//设置广播内容
i.putExtra("content",content);
//有序广播
sendOrderedBroadcast(i,null);
}

}

接收者必须要重新创一个项目才可以哟。

接收者的xml不用去动,因为我们是Log去打印测试的,我们使用的动态广播,所以之前在AndroidManifest.xml写的代码就不能用了,所以直接去有activitie相对应的类写代码:

package com.zking.laci.android21_reveice02;

import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

private MyReceive02 myReceive02;
private IntentFilter intentFilter;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myReceive02 = new MyReceive02();
intentFilter = new IntentFilter();
//设置相对应的广播名字
intentFilter.addAction("com.zking.laci.android21_broadcast.FM90.5");
//设置优先值 不同的优先值 不同的接收时间上的差距效果 优先值最大的最快收到 优先值-1000到1000
intentFilter.setPriority(1000);
}
/**
* 动态
*/

@Override
protected void onResume() {
super.onResume();
//注册广播
//必须取消注册
registerReceiver(myReceive02,intentFilter);

}

@Override
protected void onDestroy() {
super.onDestroy();
//动态广播必须销毁
unregisterReceiver(myReceive02);
}
}

然后我们再去新创个接收者的类:

package com.zking.laci.android21_reveice02;

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

/**
* Created by Laci on 2017/7/11.
*/

public class MyReceive02 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//收消息
//得到广播的名字
String name=intent.getAction();
if(name.equals("com.zking.laci.android21_broadcast.FM90.5")){
//得到广播的内容
String content=intent.getStringExtra("content");

Log.i("test","我是1号接收者"+content);

/**
* 怎么给下一个接受者改变广播的内容
*/
Bundle bundle=new Bundle();
bundle.putString("newcontent","No"+content);
setResultExtras(bundle);

/**
* 下一个接受者就不可以仅仅是intent.getStringExtra("content");
* 去获得内容了,新的写法是:
* 1.确定收消息
* Bundle bundle=getResultExtras(true);
* 2.根据bundle的键去获得内容就可以了
* String content=bundle.getString("newcontent");
*/

/**
* 阻止广播传播,大家可以试试(例如我等会下一个博客要讲的模仿短信黑名单的效果)
*/
//abortBroadcast();




}
}
}

之后自己多写几个接收者去测试就可以看到明显的效果了!