zoukankan      html  css  js  c++  java
  • 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类型的,所以具备一定的特性,也就是直到消息被接收为止。


  • 相关阅读:
    响应式设计的 5 个 CSS 实用技巧
    iframe的高度自适应的方法
    HDOJ1285 比赛排名(拓扑排序)
    GENIA项目GENIA语料库
    HDOJ1102 修路问题(最小生成树Prim)
    二叉树的一些操作
    GENIA项目综述论文(E99)
    GENIA项目主页
    读《统计自然语言处理》有笔记——语料库与知识词汇库
    HDOJ2535 ( Vote ) 【水题】
  • 原文地址:https://www.cnblogs.com/vokie/p/3602090.html
Copyright © 2011-2022 走看看