案例模型是:我们要通过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类型的,所以具备一定的特性,也就是直到消息被接收为止。