温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Android学习笔记-广播机制

发布时间:2020-07-18 13:07:15 来源:网络 阅读:1053 作者:umgsai 栏目:移动开发

Android广播类似QT中的信号和槽~~~

Android学习笔记-广播机制

发送方只负责发送广播,不关心接收方是否接收到了信号,也不关心接收方如何处理信号。

界面文件activity_main.xml

   <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Button
        android:id="@+id/send1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/textView1"
        android:text="send 1" />
    
    <Button
        android:id="@+id/send2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/send1"
        android:text="send 2" />

MainActivity.java

public class MainActivity extends Activity {
	public static final String ACTION_1 = "send1~~~";
	public static final String ACTION_2 = "send2~~~~~~";
	private BroadcastReceiver receiver;
	private TextView textView = null;
	private Button button1 = null;
	private Button button2 = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		textView = (TextView) findViewById(R.id.textView1);
		textView.setText("");
		button1 = (Button) findViewById(R.id.send1);
		button2 = (Button) findViewById(R.id.send2);

		initView();
		receiver = new BroadcastReceiver() {

			@Override
			public void onReceive(Context context, Intent intent) {
				String action = intent.getAction();
				String data = intent.getExtras().getString("data");
				if (action.equals(ACTION_1)) {
					textView.setText("");
					textView.setText("接收到:\n" + ACTION_1 + "\n1内容是:" + data);
				} else if (action.equals(ACTION_2)) {
					textView.setText("");
					textView.setText("接收到:\n" + ACTION_2 + "\n2内容是:" + data);
				}
			}

		};
		IntentFilter filter = new IntentFilter();
		filter.addAction(ACTION_1);
		filter.addAction(ACTION_2);
		registerReceiver(receiver, filter);
	}

	public void initView() {
		OnClickListener onClickListener = new OnClickListener() {

			@Override
			public void onClick(View v) {
				int id = v.getId();
				switch (id) {
				case R.id.send1:
					Intent intent1 = new Intent(ACTION_1);
					intent1.putExtra("data", "action_01");
					sendBroadcast(intent1);
					break;
				case R.id.send2:
					Intent intent2 = new Intent(ACTION_2);
					intent2.putExtra("data", "action_02");
					sendBroadcast(intent2);
					break;
				default:
					break;
				}
			}
		};
		button1.setOnClickListener(onClickListener);
		button2.setOnClickListener(onClickListener);
	}

	@Override
	protected void onStop() {
		super.onStop();
		unregisterReceiver(receiver);//解除注册
	}
}




下面的例子是Mars视频中的例子

自定义接收器TestRecevier.java

public class TestRecevier extends BroadcastReceiver{

	public TestRecevier() {
		System.out.println("调用TestRecevier构造函数");
	}
	
	@Override
	public void onReceive(Context context, Intent intent) {
		System.out.println("onReceive");	
	}

}


在AndroidManifest.xml文件中注册接收器

        <!-- 定义一个广播接收器,在其中配置只接收什么类型的广播 -->
        <receiver android:name=".TestRecevier">
            <intent-filter >
            <!--接收到这个类型的Action时才触发接收器-->
                <action android:name="android.intent.action.EDIT"/>
            </intent-filter>
        </receiver>

MainActivity.java

public class MainActivity extends Activity {

	private Button sendButton;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		sendButton = (Button) findViewById(R.id.sendButton);
		sendButton.setOnClickListener(new BroadcastListener());
	}

	class BroadcastListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			System.out.println("~~~~~~~~~~~");
			//TestRecevier testRecevier = new TestRecevier();
			Intent intent = new Intent();
			intent.setAction(Intent.ACTION_EDIT);
			//发送广播
			MainActivity.this.sendBroadcast(intent);
		}
		
	}
}

点击按钮之后的输入如下

11-24 13:53:33.288: I/System.out(24849): ~~~~~~~~~~~

11-24 13:53:33.288: I/System.out(24849): 调用TestRecevier构造函数

11-24 13:53:33.288: I/System.out(24849): onReceive




BroadcastRecevier用于监听被广播的时间(Intent)。为了达到这个目的,BroadcastRecevier必须进行注册,两种注册方式:

  1. 在应用程序的代码中进行注册

  2. 在AndroidManifest.xml当中进行注册

如果一个BroadcastRecevier用于更新UI,通常会使用第一种方式进行注册,在Activity启动的时候进行注册,在Activity不可见以后取消注册。


例:监听接收短信,并且在控制台输出短信内容

MainActivity.java

public class MainActivity extends Activity {
	private Button registerButton = null;
	private Button unregisterButton = null;
	private SMSReceiver smsReceiver = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		 registerButton = (Button)findViewById(R.id.register);
	        registerButton.setOnClickListener(new RegisterReceiverListener());
	        unregisterButton = (Button)findViewById(R.id.unregister);
	        unregisterButton.setOnClickListener(new UnRegisterReceiverListener());
	}

	   class RegisterReceiverListener implements OnClickListener{

			@Override
			public void onClick(View v) {
				System.out.println("开始监听");
				//生成一个BroiadcastReceiver对象
				smsReceiver = new SMSReceiver();
				//生成一个IntentFilter对象
				IntentFilter filter = new IntentFilter();
				//为IntentFilter添加一个Action
				filter.addAction("android.provider.Telephony.SMS_RECEIVED");
				//将BroadcastReceiver对象注册到系统当中
				MainActivity.this.registerReceiver(smsReceiver, filter);
			}
	    	
	    }
	    
	    class UnRegisterReceiverListener implements OnClickListener{

			@Override
			public void onClick(View v) {
				//解除BroadcastReceiver对象的注册
				MainActivity.this.unregisterReceiver(smsReceiver);
			}
	    	
	    }
}

SMSReceiver.java

public class SMSReceiver extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		System.out.println("receive message");
		
		//接受Intent对象当中的数据
		Bundle bundle = intent.getExtras();
		//在Bundle对象当中有一个属性名为pdus,这个属性的值是一个Object数组
		Object[] myOBJpdus = (Object[]) bundle.get("pdus"); 
		//创建一个SmsMessage类型的数组
        SmsMessage[] messages = new SmsMessage[myOBJpdus.length];  
        System.out.println(messages.length);
        for (int i = 0; i<myOBJpdus.length; i++) 
        {  
          //使用Object数组当中的对象创建SmsMessage对象
          messages[i] = SmsMessage.createFromPdu((byte[]) myOBJpdus[i]);  
          //调用SmsMessage对象的getDisppalyMessageBody()方法,就可以得到消息的内容
          System.out.println(messages[i].getDisplayMessageBody());
        }
        try {
			Thread.sleep(30 * 1000);
			System.out.println("-------------------------------");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}

在AndroidManifest.xml中配置读取短信的权限

    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />




Android 系统广播大全    

(参考http://blog.chinaunix.net/uid-25370280-id-1735613.html)

  1. String  ADD_SHORTCUT_ACTION  动作:在系统中添加一个快捷方式。

  2. String ALL_APPS_ACTION 动作:列举所有可用的应用。输入:无。

  3. String ALTERNATIVE_CATEGORY 类别:说明 activity 是用户正在浏览的数据的一个可选操作。

  4. String ANSWER_ACTION 动作:处理拨入的电话。

  5. String BATTERY_CHANGED_ACTION 广播:充电状态,或者电池的电量发生变化。

  6. String BOOT_COMPLETED_ACTION 广播:在系统启动后,这个动作被广播一次(只有一次)。

  7. String BROWSABLE_CATEGORY 类别:能够被浏览器安全使用的 activities 必须支持这个类别。

  8. String BUG_REPORT_ACTION 动作:显示 activity 报告错误。

  9. String CALL_ACTION 动作:拨打电话,被呼叫的联系人在数据中指定。

  10. String CALL_FORWARDING_STATE_CHANGED_ACTION 广播:语音电话的呼叫转移状态已经改。

  11. String CLEAR_CREDENTIALS_ACTION 动作:清除登陆凭证 (credential)

  12. String CONFIGURATION_CHANGED_ACTION 广播:设备的配置信息已经改变,参见 Resources.Configuration.

  13. Creator CREATOR 无 无

  14. String DATA_ACTIVITY_STATE_CHANGED_ACTION 广播:电话的数据活动(data activity)状态(即收发数据的状态)已经改变。

  15. String DATA_CONNECTION_STATE_CHANGED_ACTION 广播:电话的数据连接状态已经改变。

  16. String DATE_CHANGED_ACTION 广播:日期被改变。

  17. String DEFAULT_ACTION 动作:和 VIEW_ACTION 相同,是在数据上执行的标准动作。

  18. String DEFAULT_CATEGORY 类别:如果 activity 是对数据执行确省动作(点击, center press)的一个选项,需要设置这个类别。

  19. String DELETE_ACTION 动作:从容器中删除给定的数据。

  20. String DEVELOPMENT_PREFERENCE_CATEGORY 类别:说明 activity 是一个设置面板 (development preference panel).

  21. String DIAL_ACTION 动作:拨打数据中指定的电话号码。

  22. String EDIT_ACTION 动作:为制定的数据显示可编辑界面。

  23. String EMBED_CATEGORY 类别:能够在上级(父)activity 中运行。

  24. String EMERGENCY_DIAL_ACTION 动作:拨打紧急电话号码。

  25. int FORWARD_RESULT_LAUNCH 启动标记:如果这个标记被设置,而且被一个已经存在的 activity 用来启动新的 activity,已有 activity 的回复目标 (reply target) 会被转移给新的 activity。

  26. String FOTA_CANCEL_ACTION 广播:取消所有被挂起的 (pending) 更新下载。

  27. String FOTA_INSTALL_ACTION 广播:更新已经被确认,马上就要开始安装。

  28. String FOTA_READY_ACTION 广播:更新已经被下载,可以开始安装。

  29. String FOTA_RESTART_ACTION 广播:恢复已经停止的更新下载。

  30. String FOTA_UPDATE_ACTION 广播:通过 OTA 下载并安装操作系统更新。

  31. String FRAMEWORK_INSTRUMENTATION_TEST_CATEGORY 类别:To be used as code under test for framework instrumentation tests.

  32. String GADGET_CATEGORY 类别:这个 activity 可以被嵌入宿主 activity (activity that is hosting gadgets)

  33. String GET_CONTENT_ACTION 动作:让用户选择数据并返回。

  34. String HOME_CATEGORY 类别:主屏幕 (activity),设备启动后显示的第一个 activity。

  35. String INSERT_ACTION 动作:在容器中插入一个空项 (item)

  36. String INTENT_EXTRA 附加数据:和 PICK_ACTIVITY_ACTION 一起使用时,说明用户选择的用来显示的 activity;和 ADD_SHORTCUT_ACTION 一起使用的时候,描述要添加的快捷方式。

  37. String LABEL_EXTRA 附加数据:大写字母开头的字符标签,和 ADD_SHORTCUT_ACTION 一起使用。

  38. String LAUNCHER_CATEGORY 类别:Activity 应该被显示在顶级的 launcher 中。

  39. String LOGIN_ACTION 动作:获取登录凭证。

  40. String MAIN_ACTION 动作:作为主入口点启动,不需要数据。

  41. String MEDIABUTTON_ACTION 广播:用户按下了“Media Button”。

  42. String MEDIA_BAD_REMOVAL_ACTION 广播:扩展介质(扩展卡)已经从 SD 卡插槽拔出,但是挂载点 (mount point) 还没解除 (unmount)

  43. String MEDIA_EJECT_ACTION 广播:用户想要移除扩展介质(拔掉扩展卡)。

  44. String MEDIA_MOUNTED_ACTION 广播:扩展介质被插入,而且已经被挂载。

  45. String MEDIA_REMOVED_ACTION 广播:扩展介质被移除。

  46. String MEDIA_SCANNER_FINISHED_ACTION 广播:已经扫描完介质的一个目录。

  47. String MEDIA_SCANNER_STARTED_ACTION 广播:开始扫描介质的一个目录。

  48. String MEDIA_SHARED_ACTION 广播:扩展介质的挂载被解除 (unmount),因为它已经作为 USB 大容量存储被共享。

  49. String MEDIA_UNMOUNTED_ACTION 广播:扩展介质存在,但是还没有被挂载 (mount)

  50. String MESSAGE_WAITING_STATE_CHANGED_ACTION 广播:电话的消息等待(语音邮件)状态已经改变。

  51. int MULTIPLE_TASK_LAUNCH 启动标记:和 NEW_TASK_LAUNCH 联合使用,禁止将已有的任务改变为前景任务 (foreground)

  52. String NETWORK_TICKLE_RECEIVED_ACTION 广播:设备收到了新的网络 "tickle" 通知。

  53. int NEW_TASK_LAUNCH 启动标记:设置以后,activity 将成为历史堆栈中的第一个新任务(栈顶)。

  54. int NO_HISTORY_LAUNCH 启动标记:设置以后,新的 activity 不会被保存在历史堆栈中。

  55. String PACKAGE_ADDED_ACTION 广播:设备上新安装了一个应用程序包。

  56. String PACKAGE_REMOVED_ACTION 广播:设备上删除了一个应用程序包。

  57. String PHONE_STATE_CHANGED_ACTION 广播:电话状态已经改变。

  58. String PICK_ACTION 动作:从数据中选择一个项目 (item),将被选中的项目返回。

  59. String PICK_ACTIVITY_ACTION 动作:选择一个 activity,返回被选择的 activity 的类(名)。

  60. String PREFERENCE_CATEGORY 类别:activity是一个设置面板 (preference panel)

  61. String PROVIDER_CHANGED_ACTION 广播:更新将要(真正)被安装。

  62. String PROVISIONING_CHECK_ACTION 广播:要求 polling of provisioning service 下载最新的设置。

  63. String RUN_ACTION 动作:运行数据(指定的应用),无论它(应用)是什么。

  64. String SAMPLE_CODE_CATEGORY 类别:To be used as an sample code example (not part of the normal user experience).

  65. String SCREEN_OFF_ACTION 广播:屏幕被关闭。

  66. String SCREEN_ON_ACTION 广播:屏幕已经被打开。

  67. String SELECTED_ALTERNATIVE_CATEGORY 类别:对于被用户选中的数据,activity 是它的一个可选操作。

  68. String SENDTO_ACTION 动作:向 data 指定的接收者发送一个消息。

  69. String SERVICE_STATE_CHANGED_ACTION 广播:电话服务的状态已经改变。

  70. String SETTINGS_ACTION 动作:显示系统设置。输入:无。

  71. String SIGNAL_STRENGTH_CHANGED_ACTION 广播:电话的信号强度已经改变。

  72. int SINGLE_TOP_LAUNCH 启动标记:设置以后,如果 activity 已经启动,而且位于历史堆栈的顶端,将不再启动(不重新启动) activity。

  73. String STATISTICS_REPORT_ACTION 广播:要求 receivers 报告自己的统计信息。

  74. String STATISTICS_STATE_CHANGED_ACTION 广播:统计信息服务的状态已经改变。

  75. String SYNC_ACTION 动作:执行数据同步。

  76. String TAB_CATEGORY 类别:这个 activity 应该在 TabActivity 中作为一个 tab 使用。

  77. String TEMPLATE_EXTRA 附加数据:新记录的初始化模板。

  78. String TEST_CATEGORY 类别:作为测试目的使用,不是正常的用户体验的一部分。

  79. String TIMEZONE_CHANGED_ACTION 广播:时区已经改变。

  80. String TIME_CHANGED_ACTION 广播:时间已经改变(重新设置)。

  81. String TIME_TICK_ACTION 广播:当前时间已经变化(正常的时间流逝)。

  82. String UMS_CONNECTED_ACTION 广播:设备进入 USB 大容量存储模式。

  83. String UMS_DISCONNECTED_ACTION 广播:设备从 USB 大容量存储模式退出。

  84. String UNIT_TEST_CATEGORY 类别:应该被用作单元测试(通过 test harness 运行)。

  85. String VIEW_ACTION 动作:向用户显示数据。

  86. String WALLPAPER_CATEGORY 类别:这个 activity 能过为设备设置墙纸。

  87. String WALLPAPER_CHANGED_ACTION 广播:系统的墙纸已经改变。

  88. String WALLPAPER_SETTINGS_ACTION 动作:显示选择墙纸的设置界面。输入:无。

  89. String WEB_SEARCH_ACTION 动作:执行 web 搜索。

  90. String XMPP_CONNECTED_ACTION 广播:XMPP 连接已经被建立。

  91. String XMPP_DISCONNECTED_ACTION 广播:XMPP 连接已经被断开。


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI