在MainActivity.java 中声明并且写入点击监听事件
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//发送广播
Intent intent = new Intent();
intent.setPackage("com.zhanghaopeng.day0402demo1");
intent.setAction("HAO_PENG");
sendBroadcast(intent);
}
});
}
}
小提示:通俗的来讲 静态注册中只有接收广播的一方需要在AndroidManifest.xml中进行广播注册(谁接收,谁用呗~)
创建BroadcastReceiver(广播)public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"已接收静态广播",Toast.LENGTH_SHORT).show();
}
}
小提示:为了代码简单化,这里就简单的使用Toast来提示。
创建广播的方法:
第一种就是像创建java类一样,在类名后继承BroadcastReceiver类,并实现它的方法
但是这样创建在AndroidManifest.xml中并不会自动地去注册,而需要自己手动地去添加注册广播(代码如下)
第二种方法则是右击新建广播类即可(会自动注册)
四:这样一个简单的静态注册就写完了(是不是挺简单)
简单的提示一下:
安卓8.0后静态注册的广播无法接收需要添加Intent.setComponent();
在安卓9.0后对静态注册又进行了一丢丢的改动
在发送端中需要指定app所在的包名(代码如下)
intent.setPackage("com.zhanghaopeng.day0402demo1");
动态注册
上面讲了那么多的静态注册,相信大家对广播有些认识了
下面我们就来讲第二点:广播的动态注册
小提示:动态和静态的注册通俗理解可以认为(静态需要在xml中进行注册,动态则只需要在java代码中进行注册)
在MainActivity.java 中声明并且写入点击监听事件
public class MainActivity extends AppCompatActivity {
private MyReceiver broad = new MyReceiver();
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter filter = new IntentFilter("HAO_PENG1");
registerReceiver(broad, filter);
findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("HAO_PENG1");
intent.putExtra("key","动态传输数据");
sendBroadcast(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(broad);
}
}
小提示:在MainActivity.java中我来通俗给大家捋捋
动态注册和静态注册不同,在上面中我们提过动态注册是写在java代码中,所以下面便是动态注册的代码:
MyReceiver broad = new MyReceiver();//声明自己创建的广播
IntentFilter filter = new IntentFilter("HAO_PENG1");//类似于筛选器
registerReceiver(broad, filter);//注册广播
创建BroadcastReceiver(广播)
public class MyReceiver extends BroadcastReceiver {
private DaiLi daiLi;
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,intent.getStringExtra("key"),Toast.LENGTH_SHORT).show();
}
到这一步,动态注册也就完成了。
现在我们来总结一下:
动态注册:当Activity销毁的时候,广播就失效了。(收到生命周期的影响)
静态注册:即使Activity销毁了,仍然可以收到广播。
对动静态注册的了解过后,终于来到最后一步了(不同app之间的广播传递)
这里呢我也就再次对动,静态注册的使用方法分别举例
小提示:首先大家创建两个工程,方便一个发送,一个接收
发送方: 在activity_main.xml 中添加一个button,用来发送广播的点击事件
在MainActivity.java 中声明并且写入点击监听事件
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//发送广播
Intent intent = new Intent();
intent.setPackage("com.zhanghaopeng.day0402demo1");
intent.setAction("HAO_PENG");
intent.putExtra("key","静态传输数据");
sendBroadcast(intent);
}
});
}
}
小提示:为了可以更好的检验广播是否传递数据这里传递了一些字符串。
在上面中我们提过发送方并不需要注册广播,所以这里我们跳过。
创建BroadcastReceiver(广播)
public class AnBroadCast extends BroadcastReceiver {
private DaiLi daiLi;
@Override
public void onReceive(final Context context, Intent intent) {
//接收广播
if (intent.getAction().equals("HAO_PENG")) {
daiLi.get(intent.getStringExtra("key"));
}
}
public void chuanDi(DaiLi d) {
daiLi = d;
}
interface DaiLi {
void get(String s);
}
}
小提示:为了逻辑清晰,所以我们这里就先创建广播。
然后来对其中的代码进行通俗的理解
if (intent.getAction().equals("HAO_PENG")) {
daiLi.get(intent.getStringExtra("key"));
//发送方中我们使用的是setAction("HAO_PENG"),那么这就好理解了
//get到我们发送的值与"HAO_PENG"进行比对,如果正确则执行下面代码
}
public void chuanDi(DaiLi d) {
daiLi = d;
//这里的意思将形参中的DaiLi接口类型的d赋给daiLi(这里的daiLi在上面已经声明的接口实例)
}
interface DaiLi {//创建的一个内部接口
void get(String s);//这个为了在MainActivity.java中获取布局id
}
在MainActivity.java 中实现广播类中的内部接口并实现其方法
public class MainActivity extends AppCompatActivity implements MyReceier.DaiLi{
private MyReceier myReceier = new MyReceier();
private TextView tv1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myReceier.chuanDi(this);//将当前的布局传递
tv1 = findViewById(R.id.tv1);
}
@Override
public void get(String s) {
tv1.setText(s);//将发送方发送的字符串在tv1中显示
}
}
小提示:由于是在接收方,我们需要在AndroidManifest.xml查看是否注册广播,如果没有注册则需要手动注册(代码如下)
到这里,我们的静态注册(跨平台接收广播)的代码已经完成了
动态注册(跨平台)小提示:首先大家创建两个工程,方便一个发送,一个接收
发送方: 在activity_main.xml 中添加一个button,用来发送广播的点击事件
在MainActivity.java 中动态注册广播并发送
public class MainActivity extends AppCompatActivity implements public class MainActivity extends AppCompatActivity {
private MyReceiver broad = new MyReceiver();
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter filter = new IntentFilter("HAO_PENG1");
registerReceiver(broad, filter);
findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("HAO_PENG1");
intent.putExtra("key","动态传输数据");
sendBroadcast(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(broad);
}
}
小提示:如果这里有些思路混淆,可以在上面的动态注册代码中再理解一边,这里就不再多解释勒~
接收方: 在activity_main.xml 中添加一个TextView,用来接收发送方传来的值
创建BroadcastReceiver(广播)
public class MyReceiver extends BroadcastReceiver {
private DaiLi daiLi;
@Override
public void onReceive(Context context, Intent intent) {
daiLi.xieRu(intent.getStringExtra("key"));
}
public void chuanDi(DaiLi d) {
daiLi = d;
}
public interface DaiLi {
void xieRu(String s);
}
}
小提示:这里代码与上面的静态注册神似,也就不再多详细解释勒(嘿嘿~)
在MainActivity.java 中实现广播类中的内部接口并实现其方法public class MainActivity extends AppCompatActivity implements MyReceier.DaiLi{
private MyReceier myReceier = new MyReceier();
private TextView tv1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter filter = new IntentFilter("HAO_PENG1");
registerReceiver(myReceier, filter);
myReceier.chuanDi(this);
tv1 = findViewById(R.id.tv1);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceier);
}
@Override
public void get(String s) {
tv1.setText(s);
}
}
真机演示:到这里关于Android静态,动态注册与跨平台接收广播都简单的过了一遍,
由于本身也是白板一个,如果有哪里写的有错误,或者哪里写的不够好。希望可以谅解,并在下方留言问题的错误所在(狗头保命)
在这感谢庭博老师耐心教导
作者:反向学习