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