赞
踩
在Android中,有一些操作完成以后,会发送广播,Android系统内部产生这些事件后广播这些事件,至于广播接收对象是否关心这些事件,以及它们如何处理这些事件,都由广播接收对象自己决定。
完全异步执行的广播,发出广播后,所有的广播接收器几乎会在同一时刻收到这条广播通知。
//点击按钮发送广播
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//第一步:将需要广播的消息封装到Intent中
Intent intent = new Intent();
intent.putExtra("name","张三");
//第二步:自定义广播频段,表示该条广播会在那个频段下发出
intent.setAction("my.broadcast.key");
//第三步:调用Context的sendBroadcast()方法将广播发送出去;
sendBroadcast(intent);
}
});
同步执行的一种广播,同一时刻只有一个广播接收器能收到,这个广播接受者的逻辑执行完后,才会传递到下一广播接受者。
//点击按钮发送广播
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//第一步:将需要广播的消息封装到Intent中
Intent intent = new Intent();
intent.putExtra("name","张三");
//第二步:自定义广播频段,表示该条广播会在那个频段下发出
intent.setAction("my.broadcast.key");
//第三步:调用Context的sendOrderedBroadcast()方法将广播发送出去;
//第二个参数是权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。
sendOrderedBroadcast(intent,null);
}
});
/*
1.优先接收到广播的Broadcastreceiver广播接收者可以通过setResultExtras(Bundle)方法将一个Bundle对象设置为结果集对象,传给下一个接收者。
2.下一个接收者通过getResultExtras()可以获取上一个接收者存入的数据
3.中断广播,拦截一条广播不往下发送abortBroadcast()
*/
为了监听这些广播事件,Android提供了一个BroadcastReceiver全局监听器组件,该组件可以监听来自系统或应用程序的广播。
当系统或其他应用程序发送广播时,所有已经注册的 BroadcastReceiver 的应用程序就会检查注册时的IntentFilter里的Action是否与发送广播时的Intent的Action相匹配,若匹配则会调用BroadcastReceiver的onReceive()方法进行处理,所以主要工作是对BroadcastReceiver里的onReceive()方法的实现。
第一步:创建一个类继承BroadcastReceiver,实现onReceive()方法
package com.example.myapplication;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
//检测到广播后会自动回调onReceive方法
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "检测到广播", Toast.LENGTH_LONG).show();
}
}
第二步:注册BroadcastReceiver
//1.构建IntentFilter标签,设置其Action属性
IntentFilter filter = new IntentFilter();
//2.Action属性指定接收来自哪个频段的广播
filter.addAction("my.broadcast.key");
//3.将IntentFilter装入广播接收器中
MyReceiver receiver = new MyReceiver();
//4.注册广播接收器
registerReceiver(receiver, filter);
<!--广播接收器的全限定类名-->
<receiver android:name="com.example.myapplication.MyReceiver"
android:exported="true">
<!--过滤机制-->
<intent-filter>
<action android:name="my.broadcast.key"/>
</intent-filter>
</receiver>
每次广播事件发生后,系统就会创建对应的BroadcastReceiver实例对象,并自动触发它的onReceive()方法,onReceive()方法执行完后,BroadcastReceiver的实例对象就会被销毁。
前面接触的广播都是全局广播,这同样意味着我们APP发出的广播,其他APP都会接收到,但是部分广播我们不希望其他APP捕获。
Android中给我们提供了本地广播 LocalBroadcastManager 的机制,使用该机制发出的广播只会在APP内部传播,而且广播接收者也只能收到本应用发出的广播。
发送广播的具体步骤同(二)
第一步:获取LocalBroadcastManager的实例对象
LocalBroadcastManager localBManager = LocalBroadcastManager.getInstance( this ) ;
第二步:调用LocalBroadcastManager对象的sendBroadcast()发送广播
localBroadcastManager.sendBroadcast(intent);
接收广播的具体步骤同(三)
第一步:获取LocalBroadcastManager的实例对象
LocalBroadcastManager localBManager = LocalBroadcastManager.getInstance( this ) ;
第二步:通过LocalBroadcastManager对象的registerReceiver()注册广播
localBManager. registerReceiver(localReceiver, intentFilter);
注:其实这部分内容我也没有太深入的理解,主要是根据这个简单的案例写的文章。
package com.example.myapplication;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "检测到广播,广播内存有数据:"+intent.getStringExtra("name"), Toast.LENGTH_LONG).show();
}
}
package com.example.myapplication;
import android.content.IntentFilter;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.content.Intent;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = findViewById(R.id.btn);
//点击按钮发送广播
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//第一步:将需要广播的消息封装到Intent中
Intent intent = new Intent();
intent.putExtra("name","张三");
//第二步:自定义广播频段,表示该条广播会在那个频段下发出
intent.setAction("my.broadcast.key");
//第三步:调用Context的sendOrderedBroadcast()方法将广播发送出去;
//第二个参数是权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。
sendBroadcast(intent);
}
});
//构建IntentFilter标签,设置其Action属性
IntentFilter filter = new IntentFilter();
//Action属性指定接收来自哪个频段的广播
filter.addAction("my.broadcast.key");
//将IntentFilter装入广播接收器中
MyReceiver receiver = new MyReceiver();
//注册广播接收器
registerReceiver(receiver, filter);
}
}
点击按钮发送全局标准广播,并被本应用捕获。
package com.example.t.androidproject.yati;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyLocalBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("clh", "onReceive: 收到了本地广播");
}
}
package com.example.t.androidproject.yati;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
public class LocalBroadCastActivity extends AppCompatActivity {
private MyLocalBroadcastReceiver mlbr = new MyLocalBroadcastReceiver();
LocalBroadcastManager lbm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实例化
lbm = LocalBroadcastManager.getInstance(this);
//注册广播接收器
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("local_broad_cast");
lbm.registerReceiver(mlbr, intentFilter);
Button btn = findViewById(R.id.btn_local);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("local_broad_cast");
lbm.sendBroadcast(intent);
}
});
}
//解除注册
@Override
protected void onDestroy() {
super.onDestroy();
lbm.unregisterReceiver(mlbr);
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。