BroadcastReceiver 本质上就是一种全局的监听器,用于监听系统全局的广播消息
之前介绍的各种 OnClickListener 只是程序级别的监听器,这些监听器运行在制定程序中,当程序退出时,这些监听器也就关闭了,而BroadcastReceiver属于系统级别的监听器,拥有自己的进程,只要存在与之匹配的Intent被广播出来,BroadcastReceiver总会被激发
BroadcastReceiver本质上属于一个监听器,因此其实现方法只要重写BroadcastReceiver的onReceive方法即可
一旦实现了BroadcastReceiver,就应该知道那个该BroadcastReceiver能匹配的Intent,可在AndroidManifest.xml中配置,配置方法如下:
<receiver android:name=".MyReceiver">
<intent-filter >
<action android:name="llp"/>
</intent-filter>
</receiver>每次系统Broadcast 事件发生后,系统就会创建对应的BroadcastReceiver实例,并自动触发它的onReceive()方法,onReceive()方法执行完后,BroadcastReceiver实例就会被销毁,若onReceive()方法不能再10s内执行完成,Android就会认为该线程无响应
Broadcast 使用实例代码如下:
主文件:
package com.example.androidtest;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button send = (Button)findViewById(R.id.read);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
//这里要跟AndroidMainfest里面的 action 的 name 一样
//action name 最好包含包名
intent.setAction("llp");
intent.putExtra("msg", "simple message");
sendBroadcast(intent);
}
});
}
}新建MyReceive.java 文件复写 OnReceive() 方法:
package com.example.androidtest;
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) {
// TODO Auto-generated method stub
Toast.makeText(context,
"接收到的Intent的Action为:"+intent.getAction()+"\n消息内容为:"+intent.getStringExtra("msg"), 5000).show();
}
}两种Broadcast介绍:
//优先接收者将将数据存入 BroadCast 中
Bundle bundle = new Bundle();
bundle.putString("first", "第一个BroadCastReceive 存入的消息");
setResultExtras(bundle);
//终止BroadCast Intent 的传播
// abortBroadcast();
//下一个接受者获取数据
Bundle bundle = getResultExtras(true);
String first = bundle.getString("first");同时必须在 AndroidManifest.xml 文件中申明 receive 的优先级,方法如下:
<receiver
android:name=".MyReceiver">
<!-- 注明优先级为20 -->
<intent-filter android:priority="20" >
<action android:name="llp"/>
</intent-filter>
</receiver>
<receiver
android:name=".MyReceiver2">
<!-- 注明优先级为0 ,范围为:-1000:1000 -->
<intent-filter android:priority="0">
<action android:name="llp"/>
</intent-filter>
</receiver>最后给出完整java文件代码如下:
//发送广播代码
package com.example.androidtest;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button send = (Button)findViewById(R.id.read);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setAction("llp");
intent.putExtra("msg", "simple message");
//发送有序广播
sendOrderedBroadcast(intent, null);
}
});
}
}高优先级接收者代码:
/高优先级接受者
package com.example.androidtest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Toast.makeText(context,
"接收到的Intent的Action为:"+intent.getAction()+"\n消息内容为:"+intent.getStringExtra("msg"), 5000).show();
Bundle bundle = new Bundle();
bundle.putString("first", "第一个 BroadCastReceive 存入的消息");
//处理消息并传递给下一个接收者
setResultExtras(bundle);
abortBroadcast();
}
}低优先级接收者代码:
//低优先级接受者
package com.example.androidtest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
public class MyReceiver2 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//获取数据
Bundle bundle = getResultExtras(true);
String first = bundle.getString("first");
Toast.makeText(context, "第一个BroadCastRecver 存入的消息为:"+first, 5000).show();
}
}
973




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



