Android的Broadcast应用说明一例
程序A的Receiver:
receiver
=
new
BroadcastReceiver()
{
@Override
public void onReceive(Context ctx, Intent intent) {
Log.i("TestActivity", "===============Broadcast Received:" + intent.getAction());
if (intent.getAction().equals(RESPONSE_ACTION)) {
Uri uri = intent.getData();
String location = "";
if (uri != null) {
Log.i("TestActivity",
"=======================parameter location:"
+ uri.getQueryParameter("location"));
Log.i("TestActivity", "======================= host:"
+ uri.getHost());
Log.i("TestActivity", "======================= path:"
+ uri.getPath());
location = uri.getQueryParameter("location");
FileInputStream fis = null;
ByteArrayOutputStream bos = null;
File file = new File(location);
try {
fis = new FileInputStream(file);
bos = new ByteArrayOutputStream();
byte[] data = new byte[512];
int count = -1;
while ((count = fis.read(data)) != -1) {
bos.write(data, 0, count);
}
String xml = new String(bos.toByteArray());
Log.i("TestActivity", "xml1=" + xml);
Toast.makeText(TestActivity.this, xml, Toast.LENGTH_SHORT).show();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (fis != null)
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (bos != null)
try {
bos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
} ;
IntentFilter filter = new IntentFilter();
filter.addAction(RESPONSE_ACTION);
filter.addCategory(Intent.CATEGORY_DEFAULT);
filter.addDataScheme( "http " );
registerReceiver(receiver, filter);
程序A的发送BC:
@Override
public void onReceive(Context ctx, Intent intent) {
Log.i("TestActivity", "===============Broadcast Received:" + intent.getAction());
if (intent.getAction().equals(RESPONSE_ACTION)) {
Uri uri = intent.getData();
String location = "";
if (uri != null) {
Log.i("TestActivity",
"=======================parameter location:"
+ uri.getQueryParameter("location"));
Log.i("TestActivity", "======================= host:"
+ uri.getHost());
Log.i("TestActivity", "======================= path:"
+ uri.getPath());
location = uri.getQueryParameter("location");
FileInputStream fis = null;
ByteArrayOutputStream bos = null;
File file = new File(location);
try {
fis = new FileInputStream(file);
bos = new ByteArrayOutputStream();
byte[] data = new byte[512];
int count = -1;
while ((count = fis.read(data)) != -1) {
bos.write(data, 0, count);
}
String xml = new String(bos.toByteArray());
Log.i("TestActivity", "xml1=" + xml);
Toast.makeText(TestActivity.this, xml, Toast.LENGTH_SHORT).show();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (fis != null)
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (bos != null)
try {
bos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
} ;
IntentFilter filter = new IntentFilter();
filter.addAction(RESPONSE_ACTION);
filter.addCategory(Intent.CATEGORY_DEFAULT);
filter.addDataScheme( "http " );
registerReceiver(receiver, filter);
btn.setOnClickListener(
new
OnClickListener()
{
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Uri uri = Uri.parse("http://www.xx.com/getDetails?id=123");
Intent in = new Intent();
in.setAction(REQUEST_ACTION);
in.addCategory(Intent.CATEGORY_DEFAULT);
in.setData(uri);
TestActivity.this.sendBroadcast(in);
}
} );
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Uri uri = Uri.parse("http://www.xx.com/getDetails?id=123");
Intent in = new Intent();
in.setAction(REQUEST_ACTION);
in.addCategory(Intent.CATEGORY_DEFAULT);
in.setData(uri);
TestActivity.this.sendBroadcast(in);
}
} );
程序B的Receiver:
@Override
public void onReceive(Context context, Intent intent) {
if(intent != null)
{
Uri uri = intent.getData();
if(uri != null)
{
Log.i("BGServiceReceiver", "=======================" + uri.getQueryParameter("id"));
intent.setClassName("com.backgroundservice",
"com.backgroundservice.TestBackgroundService");
context.startService(intent);
}
}
// try {
// Thread.sleep(5000);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
配置:
public void onReceive(Context context, Intent intent) {
if(intent != null)
{
Uri uri = intent.getData();
if(uri != null)
{
Log.i("BGServiceReceiver", "=======================" + uri.getQueryParameter("id"));
intent.setClassName("com.backgroundservice",
"com.backgroundservice.TestBackgroundService");
context.startService(intent);
}
}
// try {
// Thread.sleep(5000);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
<
receiver
android:name
="ServiceReceiver"
>
< intent-filter >
< action android:name ="android.intent.action.STORE_REQUEST" ></ action >
< category android:name ="android.intent.category.DEFAULT" ></ category >
< data android:scheme ="http" ></ data >
</ intent-filter >
</ receiver >
< intent-filter >
< action android:name ="android.intent.action.STORE_REQUEST" ></ action >
< category android:name ="android.intent.category.DEFAULT" ></ category >
< data android:scheme ="http" ></ data >
</ intent-filter >
</ receiver >
程序B的发送BC:
Intent in
=
new
Intent();
in.setAction(RESPONSE_ACTION);
in.addCategory(Intent.CATEGORY_DEFAULT);
in.setData(Uri.parse( " http://www.xx.com/setList?location=/sdcard/xx.xml " ));
this .sendBroadcast(in);
in.setAction(RESPONSE_ACTION);
in.addCategory(Intent.CATEGORY_DEFAULT);
in.setData(Uri.parse( " http://www.xx.com/setList?location=/sdcard/xx.xml " ));
this .sendBroadcast(in);
如果想让目标Activity或者Service接收到相应的Broadcast,就需要完全匹配目标Activity或者Service的IntentFilter,否则目标Filter无法接收到相应的Broadcast。注意:IntentFilter设置的时候都要默认带上CATEGORY_DEFAULT,否则可能会造成潜在问题。
文档中的说明如下:
In principle, therefore, an Intent object with no categories should always pass this test, regardless of what's in the filter. That's mostly true. However, with one exception, Android treats all implicit intents passed to startActivity() as if they contained at least one category: "
android.intent.category.DEFAULT
" (the
CATEGORY_DEFAULT
constant). Therefore, activities that are willing to receive implicit intents must include "
android.intent.category.DEFAULT
" in their intent filters.
---------------------------------------------------------
专注移动开发
Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian