Android 系统中的四大组件之一的 BroadcastReceiver ,这种组件本质上就是一种全局监听器,用于监听全局的广播消息.由于BroadcastReceiver 是一种全局监听器,因此它可以实现不同组件之间的通信.例如我们想实现客户端程序和 startService()方法启动的 service 之间进行通信,就可以借助于 BroadcastReceiver 来实现.
BroadcastReceiver 用于接收程序(包括用户开发的程序和系统程序)所发出的Broadcast Intent.
程序启动 BroadcastReceiver 也是要2步:
- 创建需要启动 BroadcastReceiver 的Intent.
- 调用 Context 的sendBroadcast( )或者sendOrderedBroadcast( )方法来启动指定的BroadcastReceiver .
当应用程序发出一个 Broadcast Intent 之后,所有匹配该Intent的BroadcastReceiver 都有可能被启动.
BroadcastReceiver ,本质上就是一种全局监听器—– 它专门负责监听各应用程序所发出的Broadcast.
由于 BroadcastReceiver 本质上属于一个监听器,因此实现BroadcastReceiver 的方法也很简单,只要重写 onReceive(Context context, Intent intent) 方法即可.
一旦实现了 BroadcastReceiver,接下来就应该实现指定该BroadcastReceiver能 匹配的 Intent,此时有2种方式.
- 使用代码进行指定,调用 BroadcastReceiver的 Context的 registerReceiver(BroadcastReceiver receiver, IntentFilter filter)方法指定.例如代码如下:
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVER");
CustomeReceiver receiver = new CustomeReceiver();
registerReceiver(receiver,filter);
2. 在 AndroidManifest.xml清单文件中配置 : 代码如下<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVER"/>
</intent-filter>
每次系统 broadcast 事件发生后,系统就会创建对应的 BroadcastReceiver 的实例,并自动触发它的 onReceive()方法 , onReceive()方法执行完成后, BroadcastReceiver 的实例就会被销毁.
如果 BroadcastReceiver 的 onReceive()方法不能再10秒内执行完成,则 Android会认为该程序无响应,所以不要在 BroadcastReceiver 的 onReceive()方法里执行一些耗时操作,否则会弹出 ANR 的对话框.如果确实需要根据 Broadcast 来完成一些耗时的操作,则可以考虑通过Intent启动一个 Service来完成该操作.不应考虑使用新线程去完成耗时操作.因为 BroadcastReceiver 本身的生命周期就很短,可能出现的情况是子线程还没结束,BroadcastReceiver 就已经退出了.
package com.test.broadcastreceiverdemo;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
/**
* 简单的 广播接收者
*/
public class BroadcastTestActivity extends AppCompatActivity {
Button send;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast_test);
send = (Button) findViewById(R.id.button);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建 intent 对象
Intent intent = new Intent();
//设置Intent 的action 属性
intent.setAction("com.test.broadcastreceive.DEMO_BROADCAST");
//设置数据
intent.putExtra("msg", "简单消息");
//发送广播
sendBroadcast(intent);
}
});
}
}
自定义广播接收者
package com.test.broadcastreceiverdemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
/**
* 自定义广播接收者
*/
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Toast.makeText(context, "接收到的Intent 的action 为: " + intent.getAction() +
"\n 消息内容为: " + intent.getStringExtra("msg"), Toast.LENGTH_SHORT).show();
}
}
记得配置清单文件
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<!--指定该BroadcastReceiver 所相应的Intent的 action-->
<action android:name="com.test.broadcastreceive.DEMO_BROADCAST"/>
</intent-filter>
</receiver>
3947




被折叠的 条评论
为什么被折叠?



