sendStickyBroadCast函数的使用

案例模型是:我们要通过Activity1来发送一个广播,但是接收广播的是Activity2(此时的Activity2还没有启动、即还没有调用onCreate方法)

而且Activity2里面的广播也还没初始化,那就意味着我们发送的广播不能被响应、直到Activity2启动后,注册了广播,初始化了广播Receiver以后才能接收到广播。

这样一个模型就需要使用sendStickyBroadCast方法来实现了。我们先看看Google的官方解释:


大概意思就是:你发送的广播是sticky,意味着你发送的的Intent对象会一直存在直到广播接收到这个intent为止,

所以其他的通过registerReceiver()返回的值可以快速获取数据,在其他方面,这个行动都跟sendBroadcas()一样。

还有就是你必须声明Broadcast STICKY的允许权限,不然的话会抛出SecurityException

 

下面看具体的代码:

目录结构:


 

package com.example.broadcasttest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
	private Button btn1, btn2;
	int count = 0;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btn1 = (Button) findViewById(R.id.button1);
		btn2 = (Button) findViewById(R.id.button2);

		btn1.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				count++;
				btn1.setText("发送广播给Activity2 " + count);
				Intent intent = new Intent();
				intent.putExtra("data", "你在activity1中点击了" + count + "次按钮");
				intent.setAction("ActionPiP");
				sendStickyBroadcast(intent);
			}
		});

		btn2.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent = new Intent();
				intent.setClass(MainActivity.this, SecondActivity.class);
				startActivity(intent);
			}
		});
	}
}
package com.example.broadcasttest;

import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;

public class SecondActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);

		IntentFilter filter = new IntentFilter();
		filter.addAction("ActionPiP");
		BCReceiver receiver = new BCReceiver();
		registerReceiver(receiver, filter);
	}
}

 

package com.example.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class BCReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		String s = intent.getStringExtra("data");
		Log.v("Show_V", s);
	}
}

 



 


 

程序运行图片如上。通过点击了5次上面的发送广播给Activity2的按钮,然后再点击跳转到Activity2的按钮。我们知道在Activity1中,我们发送的广播信息并没有被Receiver收到,因为我们的广播是在Activity2中注册的,但是有一点可以看出来,那就是我们点击了5次按钮,说明我了我们发送了五次广播,但是在跳转到Activity2中,只是显示了一次,即我们发送的第五次广播消息,前面的四次消息都没有,从中我们可以看出这是被覆盖了的原因,这次的广播是注册监听是通过IntentFilter来实现的,

 

我们也可以在manifest文件中对Receiver进行声明,但是我们需要注意那样的声明与我们上面用IntentFilter的方法注册声明有本质的不同,我们上面intentfilter的声明是在Activity2中声明注册的,如果我们在manifest文件中 直接声明,那样在程序启动时,这个BCReceiver组件就已经注册成功了,那样的话我们在点击发送广播按钮时,BCReceiver就已经可以监听到这样的广播消息了,但是在Activity2中才注册监听的消息,那样在发送消息的时候,我们的消息发送出去了,但是并没有Receiver来接听,但是由于我们的消息是Sticky类型的,所以具备一定的特性,也就是直到消息被接收为止。

 


 

posted @ 2013-04-14 22:43  Mr轨迹  阅读(814)  评论(0编辑  收藏  举报