zoukankan      html  css  js  c++  java
  • Android组件之BroadCast简单实践

    作为Android的四大组件之一,没有理由不介绍一下BroadCast,BroadCast中文简单翻译就是广播,前阵子浙江某大学的啦啦操,广场舞的大妈,其中大妈和学生从喇叭和音响上听到的声音就是事件源,接收者就是这些大妈和学生,程序源自实践,Android中BroadCast,有事件广播者也有事件接收者,Broadcast是一种广泛运用的在应用程序之间传输信息的机制,BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件,也就是接收者。讲完了基本的概念,可以开始基本的实践:

    自定义广播的两种实现方式

    两种实现方式,一种是静态,一种是动态,先看下静态的实现过程:

    定义一个BookBroadCast接收者(有几个判断添加是系统广播需要的):

    public class BookBroadCast extends BroadcastReceiver {
    
    	private String tag = "BookBroadCast";
    
    	@Override
    	public void onReceive(Context context, Intent intent) {
    		// TODO Auto-generated method stub
    		String actionString = intent.getAction();
    		String name = intent.getStringExtra("Name");
    		if (actionString.equals(Intent.ACTION_TIME_CHANGED)) {
    			Log.i(tag, "Name:" + name + "--Action:" + actionString
    					+ "--哥们,时间改变了~");
    		} else if (actionString.equals(Intent.ACTION_BATTERY_CHANGED)) {
    			Log.i(tag, "Name:" + name + "--Action:" + actionString
    					+ "--哥们,电量变了~");
    		} else {
    			Log.i(tag, "Name:" + name + "--Action:" + actionString);
    		}
    	}
    
    }

      看下App页面:

    静态广播对应第一个按钮,点击事件:

    	Intent intent = new Intent("com.google.broadcast.BookBroadCast.static");
    			intent.putExtra("Name", "静态广播");
    			sendBroadcast(intent);

      静态广播需要在AndroidManifest.xml中注册一下:

       <receiver android:name="com.google.broadcast.BookBroadCast">
                <intent-filter >
                    <action android:name="com.google.broadcast.BookBroadCast.static"/>
                       <action android:name="android.intent.action.TIME_SET"/>
                </intent-filter>
            </receiver>
        
    

      结果如下:

    动态调用就是不需要在AndroidManifest.xml注册,在程序中动态生成filter设置action,在activity中的onStart注册,onStop终止:

    	@Override
    	protected void onStop() {
    		// TODO Auto-generated method stub
    		super.onStop();
    		unregisterReceiver(bookReceiver);
    	}
    
    	@Override
    	protected void onStart() {
    		// TODO Auto-generated method stub
    		super.onStart();
    		IntentFilter intentFilter = new IntentFilter();
    		intentFilter.addAction("com.google.broadcast.BookBroadCast.dymanic");
    		bookReceiver = new BookBroadCast();
    		registerReceiver(bookReceiver, intentFilter);
    
    	}
    

      动态调用事件,对应第二个按钮:

    	Intent dintent = new Intent("com.google.broadcast.BookBroadCast.dymanic");
    			dintent.putExtra("Name", "动态广播");
    			sendBroadcast(dintent);
    

      结果如下:

    两种系统广播调用方式

    关于系统广播的各种事件网上一找一堆,我就没必要贴在这里了,先来实现第三个和第四个按钮的事件,第三个是系统事件的改变,第四个是电池电量的改变:

    第三个action的常量的和Intent枚举出来的名称有出入:

        <action android:name="android.intent.action.TIME_SET"/>

      调用的时候是这样的:

    	Intent sintent = new Intent(Intent.ACTION_TIME_CHANGED);
    			sintent.putExtra("Name", "不被保护系统广播");
    			sendBroadcast(sintent);
    

      结果如下:

    这个其实都没有什么大的问题,然后按照静态注册方式没法搞定第四个电池电量的问题,先来看第四个是如何实现的:

    	IntentFilter systemintentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    			systembookReceiver = new BookBroadCast();
    			registerReceiver(systembookReceiver, systemintentFilter);
    

     首先可以看出不是静态注册的,需要动态注册,然后不需要调用sendBroadcast,结果如下:

    这个问题解决都弄了一个多小时,最终的Google的API找到对应的解释:

    地址:http://developer.android.com/reference/android/content/Intent.html#ACTION_TIME_TICK

    遇到问题发现Google才是最可靠的,也搜了不少中文文章,就不信没人遇到坑,哎,周六看博客的都是爱学习的孩子,周末愉快~

  • 相关阅读:
    [hihocoder-1974] 智能分包 状态压缩dp
    2018北京ICPC D. Frog and Portal 斐波那契数 构造
    [hdu-6621]K-th Closest Distance 主席树 线段树 2019 多校4
    [POJ 2104]K-th Number 主席树 可持久化线段树 入门
    [hdu-6623]Minimal Power of Prime
    [hdu-6608] Fansblog 威尔逊定理 质数的密度分布 2019 多校 3
    [codeforces1000F] One Occurrence
    [python] 机器学习 卷积神经网络 用迁移学习实现人脸识别
    [python] 安装TensorFlow问题 解决Cannot uninstall 'wrapt'. It is a distutils installed project
    浅谈getResource方法
  • 原文地址:https://www.cnblogs.com/xiaofeixiang/p/4083288.html
Copyright © 2011-2022 走看看