广播事件处理
一.Broadcast Receiver
比如打电话等等;
广播接收器,它和事件处理机制类似,只不过事件处理机制是程序组件级别,而广播事件处理机制是系统级别。
二.使用Broadcast Receiver
1.编写类继承BroadcaseReceiver,复写onReceiver()方法
2.在AndroidManifest.xml文件中注册BroadcaseReceiver
3.构建Intent对象
4.调用sendBroadcase()方法发送广播
三.BroadcaseReceiver生命周期
BroadcastReceiver对象仅在调用onReceive()方法时有效,当该方法执行完毕后,系统认为销毁该对象。
四.标准广播Action
五.注册Broadcast Receiver的方法
1.在AndroidManifest.xml文件中进行注册//有缺陷,不会因为Activity被销毁而销毁,一般不用
这里可以设置action为短信什么的:(需要权限)
//短信
eceiver android:name="com.qmk.guangbo.Myguanbo">
android:name=""/> 拍照 2.在应用程序的代码中进行注册 注册BroadcastReceiver registerReceiver() 取消注册BroadcastReceiver unregisterReceiver() 实例1: MainActivity.java package com.example.guangbo; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { private Button btn1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/1f12646217.html,yout.activity_main); btn1=(Button)findViewById(R.id.btn1); btn1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent();//广播也是Intent来传递的intent.setAction("android.provider.Telephony.SMS_RECEIVED"); //设置action的值表示广播的类型,(name) sendBroadcast(intent);//把intent传递过来 } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } Myguanbo.java package com.qmk.guangbo; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class Myguanbo extends BroadcastReceiver { //写一个类继承BroadcastReceiver private static final String TAG = "Myservice"; public Secondrecvice(){ //复习里面的onReceive方法,可以在这里处理一些我们需要处理的消息 //假如这这消息是电话就能获取到电话信息,根据大家的需求在这里面写不同的方法 Log.i(TAG, "2Receive"); } @Override public void onReceive(Context context, Intent intent) { Log.i(TAG, "onReceive"); } } 实例2: MainActivity.java package com.example.guangbo; import com.qmk.guangbo.Secondrecvice; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.content.IntentFilter; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { private Button btn1,btn2,btn3; private Secondrecvice rec; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/1f12646217.html,yout.activity_main); btn1=(Button)findViewById(R.id.btn1); btn2=(Button)findViewById(R.id.btn2); btn3=(Button)findViewById(R.id.btn3); btn1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent();//广播也是Intent来传递的intent.setAction("android.provider.Telephony.SMS_RECEIVED"); //设置action的值表示广播的类型,(name) sendBroadcast(intent);//把intent传递过来 } }); btn2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { IntentFilter fitt=new IntentFilter(); rec=new Secondrecvice(); fitt.addAction("android.provider.Telephony.SMS_RECEIVED"); //注册 registerReceiver(rec, fitt); //参数1,用来处理广播的receiver;参数2:intentfilter对象 } }); btn3.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { unregisterReceiver(rec);//注销 } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } Myguanbo.java package com.qmk.guangbo; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class Myguanbo extends BroadcastReceiver { //写一个类继承BroadcastReceiver private static final String TAG = "Myservice"; public Secondrecvice(){ //复习里面的onReceive方法,可以在这里处理一些我们需要处理的消息 //假如这这消息是电话就能获取到电话信息,根据大家的需求在这里面写不同的方法Log.i(TAG, "2Receive"); } @Override public void onReceive(Context context, Intent intent) { Log.i(TAG, "onReceive"); } } Secondrecvice.java package com.qmk.guangbo; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class Secondrecvice extends BroadcastReceiver { //写一个类继承BroadcastReceiver private static final String TAG = "Myservice"; public Secondrecvice(){ //复习里面的onReceive方法,可以在这里处理一些我们需要处理的消息 //假如这这消息是电话就能获取到电话信息,根据大家的需求在这里面写不同的方法Log.i(TAG, "2Receive"); } @Override public void onReceive(Context context, Intent intent) { //不能执行耗时的操作,它只存在1到2秒钟 Log.i(TAG, "2onReceive"); } } 附录1: Android 广播事件 Intent Action 大全 1.String ADD_SHORTCUT_ACTION 动作:在系统中添加一个快捷方式。. "android.intent.action.ADD_SHORTCUT" 2.String ALL_APPS_ACTION 动作:列举所有可用的应用。输入:无。 "android.intent.action.ALL_APPS" 3.String ALTERNA TIVE_CATEGORY 类别:说明 activity 是用户正在浏览的数据的一个可选操作。 "android.intent.category.ALTERNATIVE" 4.String ANSWER_ACTION 动作:处理拨入的电话。"android.intent.action.ANSWER" 5.String BATTERY_CHANGED_ACTION 广播:充电状态,或者电池的电量发生变化。"android.intent.action.BA TTERY_CHANGED" 6.String BOOT_COMPLETED_ACTION 广播:在系统启动后,这个动作被广播一次(只有一次)。 "android.intent.action.BOOT_COMPLETED" 7.String BROWSABLE_CA TEGORY 类别:能够被浏览器安全使用 的 activities 必须支持这个类别。 "android.intent.category.BROWSABLE" 8.String BUG_REPORT_ACTION 动作:显示 activity 报告错误。 "android.intent.action.BUG_REPORT" 9. String CALL_ACTION 动作:拨打电话,被呼叫的联系人在数据中指定。 "android.intent.action.CALL" 10.String CALL_FORWARDING_STATE_CHANGED_ACTION 广播:语音电话的呼叫转移状态已经改变。 "android.intent.action.CFF" 11.String CLEAR_CREDENTIALS_ACTION 动作:清除登陆凭证 (credential)。"android.intent.action.CLEAR_CREDENTIALS" 12.String CONFIGURATION_CHANGED_ACTION 广播:设备的配置信息已经改变,参见 Resources.Configuration. "android.intent.action.CONFIGURATION_CHANGED" Creator CR EATOR 无无 13.String DATA_ACTIVITY_STA TE_CHANGED_ACTION 广播:电话的数据活动(data activity)状态(即收发数据的状态)已经改变。 "android.intent.action.DATA_ACTIVITY" 14.String DATA_CONNECTION_STATE_CHANGED_ACTION 广播:电话的数据连接状态已经改变。"android.intent.action.DATA_STATE" 15.String DATE_CHANGED_ACTION 广播:日期被改变。 "android.intent.action.DATE_CHANGED" 16.String DEFAULT_ACTION 动作:和 VIEW_ACTION 相同,是在数据上执行的标准动作。 "android.intent.action.VIEW" 17.String DEFAULT_CATEGORY 类别:如果 activity 是对数据执行确省动作(点击, center press)的一个选项,需要设置这个类别。 "android.intent.category.DEFAULT" 18.String DELETE_ACTION 动作:从容器中删除给定的数据。 "android.intent.action.DELETE" 19.String DEVELOPMENT_PREFERENCE_CATEGORY 类别:说明 activity 是一个设置面板 (development preference panel). "android.intent.category.DEVELOPMENT_PREFERENCE" 20.String DIAL_ACTION 动作:拨打数据中指定的电话号码。 "android.intent.action.DIAL" 21. String EDIT_ACTION 动作:为制定的数据显示可编辑界面。 "android.intent.action.EDIT" 22.String EMBED_CATEGORY 类别:能够在上级(父)activity 中运行。 "android.intent.category.EMBED" 23.String EMERGENCY_DIAL_ACTION 动作:拨打紧急电话号码。 "android.intent.action.EMERGENCY_DIAL" 24.int FORWARD_RESULT_LAUNCH 启动标记:如果这个标记被设置,而且被一个已经存在的 activity 用来启动新的 activity,已有 activity 的回复目标 (reply target) 会被转移给新的 activity。16 0x00000010 25.String FOTA_CANCEL_ACTION 广播:取消所有被挂起的 (pending) 更新下载。"android.server.checkin.FOTA_CANCEL" 26.String FOTA_INSTALL_ACTION 广播:更新已经被确认,马上就要开始安装。 "android.server.checkin.FOTA_INSTALL" 27.String FOTA_READY_ACTION 广播:更新已经被下载,可以开始安装。 "android.server.checkin.FOTA_READY" 28.String FOTA_RESTART_ACTION 广播:恢复已经停止的更新下载。 "android.server.checkin.FOTA_RESTART" 29.String FOTA_UPDATE_ACTION 广播:通过 OTA 下载并安装操作系统更新。 "android.server.checkin.FOTA_UPDATE" 30.String FRAMEWORK_INSTRUMENTATION_TEST_CATEGORY 类别: To be used as code under test for framework instrumentation tests. "android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" 31.String GADGET_CA TEGORY 类别:这个 activity 可以被嵌入宿主 activity (activity that is hosting gadgets)。 "android.intent.category.GADGET" 32.String GET_CONTENT_ACTION 动作:让用户选择数据并返回。 "android.intent.action.GET_CONTENT" 33.String HOME_CA TEGORY 类别:主屏幕 (activity),设备启动后显示的第一个 activity。 "android.intent.category.HOME" 34.String INSERT_ACTION 动作:在容器中插入一个空项 (Item)。 "android.intent.action.INSERT" 35.String INTENT_EXTRA 附加数据:和 PICK_ACTIVITY_ACTION 一起使用时,说明用户选择的用来显示的 activity;和 ADD_SHORTCUT_ACTION 一起使用的时候,描述要添加的快捷方式。 "android.intent.extra.INTENT" 36.String LABEL_EXTRA 附加数据:大写字母开头的字符标签,和 ADD_SHORTCUT_ACTION 一起使用。 "https://www.doczj.com/doc/1f12646217.html,BEL" 37.String LAUNCHER_CATEGORY 类别:Activity 应该被显示在顶级的 launcher 中。 "https://www.doczj.com/doc/1f12646217.html,UNCHER" 38.String LOGIN_ACTION 动作:获取登录凭 证。 "android.intent.action.LOGIN" 39.String MAIN_ACTION 动作:作为主入口点启动,不需要数 据。 "android.intent.action.MAIN" 40.String MEDIABUTTON_ACTION 广播:用户按下了 “Media Button”。 "android.intent.action.MEDIABUTTON" 41.String MEDIA_BAD_REMOV AL_ACTION 广播:扩展介质(扩展卡)已经从 SD 卡插槽拔出,但是挂载点 (mount point) 还没解除 (unmount)。 "android.intent.action.MEDIA_BAD_REMOV AL" 42.String MEDIA_EJECT_ACTION 广播:用户想要移除扩展介质(拔掉扩展卡)。 "android.intent.action.MEDIA_EJECT" 43 String MEDIA_MOUNTED_ACTION 广播:扩展介质被插入,而且已经被挂载。 "android.intent.action.MEDIA_MOUNTED" 44.String MEDIA_REMOVED_ACTION 广播:扩展介质被移除。 "android.intent.action.MEDIA_REMOVED" 45.String MEDIA_SCANNER_FINISHED_ACTION 广播:已经扫描完介质的一个目录。 "android.intent.action.MEDIA_SCANNER_FINISHED" 46String MEDIA_SCANNER_STARTED_ACTION 广播:开始扫描介质的一个目录。"android.intent.action.MEDIA_SCANNER_STARTED" 47. String MEDIA_SHARED_ACTION 广播:扩展介质的挂载被解除 (unmount),因为它已经作为 USB 大容量存储被共享。 "android.intent.action.MEDIA_SHARED" 48.String MEDIA_UNMOUNTED_ACTION 广播:扩展介质存在,但是还没有被挂载 (mount)。 "android.intent.action.MEDIA_UNMOUNTED" 49. String MESSAGE_W AITING_STA TE_CHANGED_ACTION 广播:电话的消息等待(语音邮件)状态已经改变。 "android.intent.action.MWI" 50.int MULTIPLE_TASK_LAUNCH 启动标记:和 NEW_TASK_LAUNCH 联合使用,禁止将已有的任务改变为前景任务 (foreground)。 8 0x00000008 51.String NETWORK_TICKLE_RECEIVED_ACTION 广播:设备 收到了新的网络 "tickle" 通知。 "https://www.doczj.com/doc/1f12646217.html,WORK_TICKLE_RECEIVED" 52.int NEW_TASK_LAUNCH 启动标记:设置以后,activity 将成为历史堆栈中的第一个新任务(栈顶)。 4 0x00000004 int NO_HISTORY_LAUNCH 启动标记:设置以后,新的 activity 不会被保存在历史堆栈中。 1 0x00000001 53String PACKAGE_ADDED_ACTION 广播:设备上新安装了一个应用程序包。 "android.intent.action.PACKAGE_ADDED" 54.String PACKAGE_REMOVED_ACTION 广播:设备上删除了一个应用程序包。 "android.intent.action.PACKAGE_REMOVED" 55.String PHONE_STATE_CHANGED_ACTION 广播:电话状态已经改变。 "android.intent.action.PHONE_STATE" 56.String PICK_ACTION 动作:从数据中选择一个项目 (item),将被选中的项目返回。 "android.intent.action.PICK" 57.String PICK_ACTIVITY_ACTION 动作:选择一个 activity,返回被选择的 activity 的类(名)。 "android.intent.action.PICK_ACTIVITY" 58.String PREFERENCE_CATEGORY 类别:activity是一个设置面板 (preference panel)。 "android.intent.category.PREFERENCE" 59.String PROVIDER_CHANGED_ACTION 广播:更新将要(真正)被安装。 "android.intent.action.PROVIDER_CHANGED" 60.String PROVISIONING_CHECK_ACTION 广播:要求 polling of provisioning service 下载最新的设置。 "android.intent.action.PROVISIONING_CHECK" 61.String RUN_ACTION 动作:运行数据(指定的应用),无论它(应用)是什么。 "android.intent.action.RUN" 62.String SAMPLE_CODE_CA TEGORY 类别: To be used as an sample code example (not part of the normal user experience). "android.intent.category.SAMPLE_CODE" 63.String SCREEN_OFF_ACTION 广播:屏幕被关闭。 "android.intent.action.SCREEN_OFF" 64.String SCREEN_ON_ACTION 广播:屏幕已经被打开。 "android.intent.action.SCREEN_ON" 65.String SELECTED_ALTERNA TIVE_CATEGORY 类别:对于被用户选中的数据,activity 是它的一个可选操作。 "android.intent.category.SELECTED_ALTERNATIVE" 66.String SENDTO_ACTION 动作:向 data 指定的接收者发送一个消息。 "android.intent.action.SENDTO" 67.String SERVICE_STA TE_CHANGED_ACTION 广播:电话服务的状态已经改变。 "android.intent.action.SERVICE_STATE" 68.String SETTINGS_ACTION 动作:显示系统设置。输入:无。 "android.intent.action.SETTINGS" 69.String SIGNAL_STRENGTH_CHANGED_ACTION 广播:电话的信号强度已经改变。 "android.intent.action.SIG_STR" 70.int SINGLE_TOP_LAUNCH 启动标记:设置以后,如果 activity 已经启动,而且位于历史堆栈的顶端,将不再启动(不重新启动) activity。 2 0x00000002 71.String STATISTICS_REPORT_ACTION 广播:要求 receivers 报告自己的统计信息。 "android.intent.action.STA TISTICS_REPORT" 72.String STATISTICS_STATE_CHANGED_ACTION 广播:统计信息服务的状态已经改变。 "android.intent.action.STATISTICS_STA TE_CHANGED" 73.String SYNC_ACTION 动作:执行数据同步。 "android.intent.action.SYNC" 74.String TAB_CATEGORY 类别:这个 activity 应该在 TabActivity 中作为一个 tab 使用。"android.intent.category.TAB" 75. String TEMPLATE_EXTRA 附加数据:新记录的初始化模板。 "android.intent.extra.TEMPLATE" 76.String TEST_CATEGORY 类别:作为测试目的使用,不是正常的用户体验的一部分。 "android.intent.category.TEST" 77. String TIMEZONE_CHANGED_ACTION 广播:时区已经改变。 "android.intent.action.TIMEZONE_CHANGED" 78.String TIME_CHANGED_ACTION 广播:时间已经改变(重新设置)。 "android.intent.action.TIME_SET" 79.String TIME_TICK_ACTION 广播:当前时间已经变化(正常的时间流逝)。 "android.intent.action.TIME_TICK" 80.String UMS_CONNECTED_ACTION 广播:设备进入 USB 大容量存储模式。 "android.intent.action.UMS_CONNECTED" 81.String UMS_DISCONNECTED_ACTION 广播:设备从 USB 大容量存储模式退出。 "android.intent.action.UMS_DISCONNECTED" 82. String UNIT_TEST_CA TEGORY 类别:应该被用作单元测试(通过 test harness 运行)。 "android.intent.category.UNIT_TEST" 83.String VIEW_ACTION 动作:向用户显示数据。 "android.intent.action.VIEW" 84.String WALLPAPER_CA TEGORY 类别:这个 activity 能过为设备设置墙纸。 "android.intent.category.WALLPAPER" 85.String WALLPAPER_CHANGED_ACTION 广播:系统的墙纸已经改变。 "android.intent.action.WALLPAPER_CHANGED" 86.String WALLPAPER_SETTINGS_ACTION 动作:显示选择墙纸的设置界面。输入:无。"android.intent.action.WALLPAPER_SETTINGS" 87.String WEB_SEARCH_ACTION 动作:执行 web 搜索。 "android.intent.action.WEB_SEARCH" 88.String XMPP_CONNECTED_ACTION 广播:XMPP 连接已经被建立。 "android.intent.action.XMPP_CONNECTED" 89.String XMPP_DISCONNECTED_ACTION 广播:XMPP 连接已经被断开。 "android.intent.action.XMPP_DI 附录:2 String ADD_SHORTCUT_ACTION 动作:在系统中添加一个快捷方式。. “android.intent.action.ADD_SHORTCUT” String ALL_APPS_ACTION 动作:列举所有可用的应用。 输入:无。“android.intent.action.ALL_APPS” String ALTERNATIVE_CATEGORY 类别:说明activity 是用户正在浏览的数据的一个可选操作。“android.intent.category.ALTERNATIVE” String ANSWER_ACTION 动作:处理拨入的电话。 “android.intent.action.ANSWER” String BATTERY_CHANGED_ACTION 广播:充电状态,或者电池的电量发生变化。“android.intent.action.BATTERY_CHANGED” String BOOT_COMPLETED_ACTION 广播:在系统启动后。 这个动作被广播一次(只有一次)。“android.intent.action.BOOT_COMPLETED” String BROWSABLE_CATEGORY 类别:能够被浏览器安全使用的activities 必须支持这个类别。“android.intent.category.BROWSABLE” String BUG_REPORT_ACTION 动作:显示activity 报告错误。 “android.intent.action.BUG_REPORT” String CALL_ACTION 动作:拨打电话。 被呼叫的联系人在数据中指定。“android.intent.action.CALL” String CALL_FORWARDING_STATE_CHANGED_ACTION 广播:语音电话的呼叫转移状态已经改变。“android.intent.action.CFF” String CLEAR_CREDENTIALS_ACTION 动作:清除登陆凭证(credential)。“android.intent.action.CLEAR_CREDENTIALS” String CONFIGURATION_CHANGED_ACTION 广播:设备的配置信息已经改变,参见Resources.Configuration. “android.intent.action.CONFIGURATION_CHANGED” Creator CREATOR 无无 String DATA_ACTIVITY_STATE_CHANGED_ACTION 广播:电话的数据活动(data activity)状态(即收发数据的状态)已经改变。“android.intent.action.DATA_ACTIVITY” String DATA_CONNECTION_STATE_CHANGED_ACTION 广播:电话的数据连接状态已经改变。“android.intent.action.DATA_STATE” String DATE_CHANGED_ACTION 广播:日期被改变。 “android.intent.action.DATE_CHANGED” String DEFAULT_ACTION 动作:和VIEW_ACTION 相同,是在数据上执行的标准动作。“android.intent.action.VIEW” String DEFAULT_CATEGORY 类别:如果activity 是对数据执行确省动作(点击, center press)的一个选项,需要设置这个类别。“android.intent.category.DEFAULT” String DELETE_ACTION 动作:从容器中删除给定的数据。 “android.intent.action.DELETE” String DEVELOPMENT_PREFERENCE_CATEGORY 类别:说明activity 是一个设置面板(development preference panel). “android.intent.category.DEVELOPMENT_PREFERENCE” String DIAL_ACTION 动作:拨打数据中指定的电话号码。 “android.intent.action.DIAL” String EDIT_ACTION 动作:为制定的数据显示可编辑界面。 “android.intent.action.EDIT” String EMBED_CATEGORY 类别:能够在上级(父)activity 中运行。 “android.intent.category.EMBED” String EMERGENCY_DIAL_ACTION 动作:拨打紧急电话号码。 “android.intent.action.EMERGENCY_DIAL” int FORWARD_RESULT_LAUNCH 启动标记:如果这个标记被设置。 而且被一个已经存在的activity 用来启动新的activity,已有activity 的回复目标(reply target) 会被转移给新的activity。16 0×00000010 String FOTA_CANCEL_ACTION 广播:取消所有被挂起的(pending) 更新下载。“android.server.checkin.FOTA_CANCEL” String FOTA_INSTALL_ACTION 广播:更新已经被确认,马上就要开始安装。“android.server.checkin.FOTA_INSTALL” String FOTA_READY_ACTION 广播:更新已经被下载。 可以开始安装。“android.server.checkin.FOTA_READY” String FOTA_RESTART_ACTION 广播:恢复已经停止的更新下载。 “android.server.checkin.FOTA_RESTART” String FOTA_UPDATE_ACTION 广播:通过OTA 下载并安装操作系统更新。“android.server.checkin.FOTA_UPDATE” String FRAMEWORK_INSTRUMENTATION_TEST_CATEGORY 类别:To be used as code under test for framework instrumentation tests. “android.intent.category.FRAMEWORK_INSTRUMENTATION _TEST” String GADGET_CATEGORY 类别:这个activity 可以被嵌入宿主activity (activity that is hosting gadgets)。“android.intent.category.GADGET” String GET_CONTENT_ACTION 动作:让用户选择数据并返回。 “android.intent.action.GET_CONTENT” String HOME_CATEGORY 类别:主屏幕(activity)。 设备启动后显示的第一个activity。“android.intent.category.HOME” String INSERT_ACTION 动作:在容器中插入一个空项(item)。 “android.intent.action.INSERT” String INTENT_EXTRA 附加数据:和PICK_ACTIVITY_ACTION 一起使用时,说明用户选择的用来显示的activity;和ADD_SHORTCUT_ACTION 一起使用的时候,描述要添加的快捷方式。“android.intent.extra.INTENT” String LABEL_EXTRA 附加数据:大写字母开头的字符标签,和 ADD_SHORTCUT_ACTION 一起使用。“https://www.doczj.com/doc/1f12646217.html,BEL” String LAUNCHER_CATEGORY 类别:Activity 应该被显示在顶级的launcher 中。“https://www.doczj.com/doc/1f12646217.html,UNCHER” String LOGIN_ACTION 动作:获取登录凭证。“android.intent.action.LOGIN” String MAIN_ACTION 动作:作为主入口点启动,不需要数据。 “android.intent.action.MAIN” String MEDIABUTTON_ACTION 广播:用户按下了“Media Button”。“android.intent.action.MEDIABUTTON” String MEDIA_BAD_REMOVAL_ACTION 广播:扩展介质(扩展卡)已经从SD 卡插槽拔出,但是挂载点(mount point) 还没解除(unmount)。 “android.intent.action.MEDIA_BAD_REMOVAL” String MEDIA_EJECT_ACTION 广播:用户想要移除扩展介质(拔掉扩展卡)。“android.intent.action.MEDIA_EJECT” String MEDIA_MOUNTED_ACTION 广播:扩展介质被插入,而且已经被挂载。“android.intent.action.MEDIA_MOUNTED” String MEDIA_REMOVED_ACTION 广播:扩展介质被移除。 “android.intent.action.MEDIA_REMOVED” String MEDIA_SCANNER_FINISHED_ACTION 广播:已经扫描完介质的一个目录。“android.intent.action.MEDIA_SCANNER_FINISHED” String MEDIA_SCANNER_STARTED_ACTION 广播:开始扫描介质的一个目录。“android.intent.action.MEDIA_SCANNER_STARTED” String MEDIA_SHARED_ACTION 广播:扩展介质的挂载被解除(unmount)。 因为它已经作为USB 大容量存储被共享。 “android.intent.action.MEDIA_SHARED” String MEDIA_UNMOUNTED_ACTION 广播:扩展介质存在,但是还没有被挂载(mount)。“android.intent.action.MEDIA_UNMOUNTED” String MESSAGE_WAITING_STATE_CHANGED_ACTION 广播:电话的消息等待(语音邮件)状态已经改变。“android.intent.action.MWI” int MULTIPLE_TASK_LAUNCH 启动标记:和NEW_TASK_LAUNCH 联合使用。 禁止将已有的任务改变为前景任务(foreground)。8 0×00000008 String NETWORK_TICKLE_RECEIVED_ACTION 广播:设备收到了新的网络“tickle”通知。“https://www.doczj.com/doc/1f12646217.html,WORK_TICKLE_RECEIVED” int NEW_TASK_LAUNCH 启动标记:设置以后,activity 将成为历史堆栈中的第一个新任务(栈顶)。4 0×00000004 int NO_HISTORY_LAUNCH 启动标记:设置以后,新的activity 不会被保存在历史堆栈中。1 0×00000001 String PACKAGE_ADDED_ACTION 广播:设备上新安装了一个应用程序包。“android.intent.action.PACKAGE_ADDED” String PACKAGE_REMOVED_ACTION 广播:设备上删除了一个应用程序包。“android.intent.action.PACKAGE_REMOVED” String PHONE_STATE_CHANGED_ACTION 广播:电话状态已经改变。“android.intent.action.PHONE_STATE” String PICK_ACTION 动作:从数据中选择一个项目(item),将被选中的项目返回。“android.intent.action.PICK” String PICK_ACTIVITY_ACTION 动作:选择一个activity,返回被选择的activity 的类(名)。“android.intent.action.PICK_ACTIVITY” String PREFERENCE_CATEGORY 类别:activity是一个设置面板(preference panel)。“android.intent.category.PREFERENCE” String PROVIDER_CHANGED_ACTION 广播:更新将要(真正)被安装。“android.intent.action.PROVIDER_CHANGED” String PROVISIONING_CHECK_ACTION 广播:要求polling of provisioning service 下载最新的设置。“android.intent.action.PROVISIONING_CHECK” String RUN_ACTION 动作:运行数据(指定的应用),无论它(应用)是什么。“android.intent.action.RUN” String SAMPLE_CODE_CATEGORY 类别:To be used as an sample code example (not part of the normal user experience). “android.intent.category.SAMPLE_CODE” String SCREEN_OFF_ACTION 广播:屏幕被关闭。 “android.intent.action.SCREEN_OFF” String SCREEN_ON_ACTION 广播:屏幕已经被打开。 “android.intent.action.SCREEN_ON” String SELECTED_ALTERNATIVE_CATEGORY 类别:对于被用户选中的数据。 activity 是它的一个可选操作。 “android.intent.category.SELECTED_ALTERNATIVE” String SENDTO_ACTION 动作:向data 指定的接收者发送一个消息。 “android.intent.action.SENDTO” String SERVICE_STATE_CHANGED_ACTION 广播:电话服务的状态已经改变。“android.intent.action.SERVICE_STATE” String SETTINGS_ACTION 动作:显示系统设置。输入:无。 “android.intent.action.SETTINGS” String SIGNAL_STRENGTH_CHANGED_ACTION 广播:电话的信号强度已经改变。“android.intent.action.SIG_STR” int SINGLE_TOP_LAUNCH 启动标记:设置以后,如果activity 已经启动。 而且位于历史堆栈的顶端,将不再启动(不重新启动)activity。2 0×00000002 String STATISTICS_REPORT_ACTION 广播:要求receivers 报告自己的统计信息。“android.intent.action.STATISTICS_REPORT” String STATISTICS_STATE_CHANGED_ACTION 广播:统计信息服务的状态已经改变。“android.intent.action.STATISTICS_STATE_CHANGED” String SYNC_ACTION 动作:执行数据同步。“android.intent.action.SYNC” String TAB_CATEGORY 类别:这个activity 应该在TabActivity 中作为一个tab 使用。“android.intent.category.TAB” String TEMPLATE_EXTRA 附加数据:新记录的初始化模板。 “android.intent.extra.TEMPLATE” String TEST_CATEGORY 类别:作为测试目的使用,不是正常的用户体验的一部分。“android.intent.category.TEST” String TIMEZONE_CHANGED_ACTION 广播:时区已经改变。 “android.intent.action.TIMEZONE_CHANGED” String TIME_CHANGED_ACTION 广播:时间已经改变(重新设置)。 “android.intent.action.TIME_SET” String TIME_TICK_ACTION 广播:当前时间已经变化(正常的时间流逝)。“android.intent.action.TIME_TICK” String UMS_CONNECTED_ACTION 广播:设备进入USB 大容量存储模式。“android.intent.action.UMS_CONNECTED” String UMS_DISCONNECTED_ACTION 广播:设备从USB 大容量存储模式退出。“android.intent.action.UMS_DISCONNECTED” String UNIT_TEST_CATEGORY 类别:应该被用作单元测试(通过test harness 运行)。“android.intent.category.UNIT_TEST” String VIEW_ACTION 动作:向用户显示数据。“android.intent.action.VIEW” String WALLPAPER_CATEGORY 类别:这个activity 能过为设备设置墙纸。“android.intent.category.WALLPAPER” String WALLPAPER_CHANGED_ACTION 广播:系统的墙纸已经改变。“android.intent.action.WALLPAPER_CHANGED” String WALLPAPER_SETTINGS_ACTION 动作:显示选择墙纸的设置界面。输入:无。“android.intent.action.WALLPAPER_SETTINGS” String WEB_SEARCH_ACTION 动作:执行web 搜索。 “android.intent.action.WEB_SEARCH” String XMPP_CONNECTED_ACTION 广播:XMPP 连接已经被建立。“android.intent.action.XMPP_CONNECTED” String XMPP_DISCONNECTED_ACTION 广播:XMPP 连接已经被断开。“android.intent.action.XMPP_DI =================================================================== ========== Activity总是要来回跳转的,发现积累个ACTION列表是必要的... 1. 电话 (1) 拔打一个号码,号码为传入参数 TelephonyManager tm =(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); if(tm.getCallState()== TelephonyManager.CALL_STATE_IDLE){ //其实,这个 可以不要的,只是判断一下当前phone的状态,如果为IDLE,才允许呼叫~ Intent callIntent =new Intent(Intent.ACTION_CALL_PRIVILEGED,Uri.fromParts("tel", mNumber,null)); startActivity(callIntent); } 2. 短信 (1) 发送短信给一个号码,号码为传入参数 Intent SMSIntent =new Intent(Intent.ACTION_SENDTO, Uri.fromParts(Constants.SCHEME_SMSTO,Number, null)); startActivity(SMSIntent); (2) 通过短信将一个内容发送出去,内容为传入参数 Intent sendIntent =new Intent(Intent.ACTION_SEND); sendIntent.setType("text/plain"); sendIntent.putExtra("sms_body","sms body"); //这个。。有可能系统会让选择用蓝牙还是信息 3. 附:2.2源码中的ACTION定义 androidsrc>grep ACTION_ frameworks/base/core/java/android/content/Intent.java|grep String public static final String ACTION_MAIN ="android.intent.action.MAIN"; public static final String ACTION_VIEW ="android.intent.action.VIEW"; public static final String ACTION_DEFAULT = ACTION_VIEW; public static final String ACTION_ATTACH_DATA = "android.intent.action.ATTACH_DATA"; public static final String ACTION_EDIT ="android.intent.action.EDIT"; public static final String ACTION_INSERT_OR_EDIT = "android.intent.action.INSERT_OR_EDIT"; public static final String ACTION_PICK ="android.intent.action.PICK"; public static final String ACTION_CREATE_SHORTCUT = "android.intent.action.CREATE_SHORTCUT"; public static final String ACTION_CHOOSER = "android.intent.action.CHOOSER"; public static final String ACTION_GET_CONTENT = "android.intent.action.GET_CONTENT"; public static final String ACTION_DIAL ="android.intent.action.DIAL"; public static final String ACTION_CALL ="android.intent.action.CALL"; public static final String ACTION_CALL_EMERGENCY = "android.intent.action.CALL_EMERGENCY"; public static final String ACTION_CALL_PRIVILEGED = "android.intent.action.CALL_PRIVILEGED"; public static final String ACTION_IP_CALL_PRIVILEGED = "android.intent.action.IP_CALL_PRIVILEGED"; public static final String ACTION_SENDTO = "android.intent.action.SENDTO"; public static final String ACTION_SEND ="android.intent.action.SEND"; public static final String ACTION_SEND_MULTIPLE = "android.intent.action.SEND_MULTIPLE"; public static final String ACTION_ANSWER = "android.intent.action.ANSWER"; public static final String ACTION_INSERT = "android.intent.action.INSERT"; public static final String ACTION_DELETE = "android.intent.action.DELETE"; public static final String ACTION_RUN ="android.intent.action.RUN"; public static final String ACTION_SYNC ="android.intent.action.SYNC"; public static final String ACTION_PICK_ACTIVITY = "android.intent.action.PICK_ACTIVITY"; public static final String ACTION_SEARCH = "android.intent.action.SEARCH"; public static final String ACTION_SYSTEM_TUTORIAL = "android.intent.action.SYSTEM_TUTORIAL"; public static final String ACTION_WEB_SEARCH = "android.intent.action.WEB_SEARCH"; public static final String ACTION_ALL_APPS = "android.intent.action.ALL_APPS"; public static final String ACTION_SET_WALLPAPER = "android.intent.action.SET_WALLPAPER"; public static final String ACTION_BUG_REPORT = "android.intent.action.BUG_REPORT"; public static final String ACTION_FACTORY_TEST = "android.intent.action.FACTORY_TEST"; public static final String ACTION_CALL_BUTTON = "android.intent.action.CALL_BUTTON"; public static final String ACTION_VOICE_COMMAND = "android.intent.action.VOICE_COMMAND"; public static final String ACTION_SEARCH_LONG_PRESS = "android.intent.action.SEARCH_LONG_PRESS"; public static final String ACTION_APP_ERROR = "android.intent.action.APP_ERROR"; public static final String ACTION_POWER_USAGE_SUMMARY = "android.intent.action.POWER_USAGE_SUMMARY"; public static final String ACTION_UPGRADE_SETUP = "android.intent.action.UPGRADE_SETUP"; public static final String ACTION_SCREEN_OFF = "android.intent.action.SCREEN_OFF"; public static final String ACTION_SCREEN_ON = "android.intent.action.SCREEN_ON"; public static final String ACTION_USER_PRESENT = "https://www.doczj.com/doc/1f12646217.html,ER_PRESENT"; public static final String ACTION_TIME_TICK = "android.intent.action.TIME_TICK"; public static final String ACTION_TIME_CHANGED = "android.intent.action.TIME_SET"; public static final String ACTION_DATE_CHANGED = "android.intent.action.DATE_CHANGED"; public static final String ACTION_TIMEZONE_CHANGED = "android.intent.action.TIMEZONE_CHANGED"; public static final String ACTION_ALARM_CHANGED = "android.intent.action.ALARM_CHANGED"; public static final String ACTION_SYNC_STATE_CHANGED public static final String ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED"; public static final String ACTION_CLOSE_SYSTEM_DIALOGS = "android.intent.action.CLOSE_SYSTEM_DIALOGS"; public static final String ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL"; public static final String ACTION_PACKAGE_ADDED = "android.intent.action.PACKAGE_ADDED"; public static final String ACTION_PACKAGE_REPLACED = "android.intent.action.PACKAGE_REPLACED"; public static final String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED"; public static final String ACTION_PACKAGE_CHANGED = "android.intent.action.PACKAGE_CHANGED"; public static final String ACTION_QUERY_PACKAGE_RESTART = "android.intent.action.QUERY_PACKAGE_RESTART"; public static final String ACTION_PACKAGE_RESTARTED = "android.intent.action.PACKAGE_RESTARTED"; public static final String ACTION_PACKAGE_DATA_CLEARED = "android.intent.action.PACKAGE_DATA_CLEARED"; public static final String ACTION_UID_REMOVED = "android.intent.action.UID_REMOVED"; public static final String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE = public static final String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE = public static final String ACTION_WALLPAPER_CHANGED = "android.intent.action.WALLPAPER_CHANGED"; public static final String ACTION_CONFIGURATION_CHANGED = "android.intent.action.CONFIGURATION_CHANGED"; public static final String ACTION_LOCALE_CHANGED = "android.intent.action.LOCALE_CHANGED"; public static final String ACTION_BATTERY_CHANGED = "android.intent.action.BATTERY_CHANGED"; public static final String ACTION_BATTERY_LOW = "android.intent.action.BATTERY_LOW"; public static final String ACTION_BATTERY_OKAY = "android.intent.action.BATTERY_OKAY"; public static final String ACTION_POWER_CONNECTED = "android.intent.action.ACTION_POWER_CONNECTED"; public static final String ACTION_POWER_DISCONNECTED = public static final String ACTION_SHUTDOWN = "android.intent.action.ACTION_SHUTDOWN"; public static final String ACTION_REQUEST_SHUTDOWN = "android.intent.action.ACTION_REQUEST_SHUTDOWN"; public static final String ACTION_DEVICE_STORAGE_LOW = "android.intent.action.DEVICE_STORAGE_LOW"; public static final String ACTION_DEVICE_STORAGE_OK = "android.intent.action.DEVICE_STORAGE_OK"; public static final String ACTION_MANAGE_PACKAGE_STORAGE = "android.intent.action.MANAGE_PACKAGE_STORAGE"; public static final String ACTION_UMS_CONNECTED = "android.intent.action.UMS_CONNECTED"; public static final String ACTION_UMS_DISCONNECTED = "android.intent.action.UMS_DISCONNECTED"; public static final String ACTION_MEDIA_REMOVED = "android.intent.action.MEDIA_REMOVED"; public static final String ACTION_MEDIA_UNMOUNTED = "android.intent.action.MEDIA_UNMOUNTED"; public static final String ACTION_MEDIA_CHECKING = "android.intent.action.MEDIA_CHECKING"; public static final String ACTION_MEDIA_NOFS = "android.intent.action.MEDIA_NOFS"; public static final String ACTION_MEDIA_MOUNTED = "android.intent.action.MEDIA_MOUNTED"; public static final String ACTION_MEDIA_SHARED = "android.intent.action.MEDIA_SHARED"; public static final String ACTION_MEDIA_UNSHARED = "android.intent.action.MEDIA_UNSHARED"; public static final String ACTION_MEDIA_BAD_REMOVAL = "android.intent.action.MEDIA_BAD_REMOVAL"; public static final String ACTION_MEDIA_UNMOUNTABLE = "android.intent.action.MEDIA_UNMOUNTABLE"; public static final String ACTION_MEDIA_EJECT = "android.intent.action.MEDIA_EJECT"; public static final String ACTION_MEDIA_SCANNER_STARTED = "android.intent.action.MEDIA_SCANNER_STARTED"; public static final String ACTION_MEDIA_SCANNER_FINISHED = "android.intent.action.MEDIA_SCANNER_FINISHED"; public static final String ACTION_MEDIA_SCANNER_SCAN_FILE = "android.intent.action.MEDIA_SCANNER_SCAN_FILE"; public static final String ACTION_MEDIA_BUTTON = "android.intent.action.MEDIA_BUTTON"; public static final String ACTION_CAMERA_BUTTON = "android.intent.action.CAMERA_BUTTON"; public static final String ACTION_GTALK_SERVICE_CONNECTED = public static final String ACTION_GTALK_SERVICE_DISCONNECTED = public static final String ACTION_INPUT_METHOD_CHANGED = public static final String ACTION_AIRPLANE_MODE_CHANGED = "android.intent.action.AIRPLANE_MODE"; public static final String ACTION_PROVIDER_CHANGED = public static final String ACTION_HEADSET_PLUG = public static final String ACTION_NEW_OUTGOING_CALL = public static final String ACTION_REBOOT = public static final String ACTION_DOCK_EVENT = public static final String ACTION_REMOTE_INTENT = public static final String ACTION_PRE_BOOT_COMPLETED = 标准的Activity Actions ACTION_MAIN 作为一个主要的进入口,而并不期望去接受数据 ACTION_VIEW 向用户去显示数据 ACTION_ATTACH_DATA 别用于指定一些数据应该附属于一些其他的地方,例如,图片数据应该附属于联系人 ACTION_EDIT 访问已给的数据,提供明确的可编辑ACTION_PICK 从数据中选择一个子项目,并返回你所选中的项目 ACTION_CHOOSER 显示一个activity选择器,允许用户在进程之前选择他们想要的 ACTION_GET_CONTENT 允许用户选择特殊种类的数据,并返回(特殊种类的数据:照一张相片或录一段音) ACTION_DIAL 拨打一个指定的号码,显示一个带有号码的用户界面,允许用户去启动呼叫 ACTION_CALL 根据指定的数据执行一次呼叫(ACTION_CALL在应用中启动一次呼叫有缺陷,多数应用ACTION_DIAL,ACTION_CALL 不能用在紧急呼叫上,紧急呼叫可以用ACTION_DIAL来实现) ACTION_SEND 传递数据,被传送的数据没有指定,接收的action请求用户发数据 ACTION_SENDTO 发送一跳信息到指定的某人 ACTION_ANSWER 处理一个打进电话呼叫 ACTION_INSERT 插入一条空项目到已给的容器 ACTION_DELETE 从容器中删除已给的数据 ACTION_RUN 运行数据,无论怎么 ACTION_SYNC 同步执行一个数据 ACTION_PICK_ACTIVITY 为已知的Intent选择一个Activity,返回别选中的类 ACTION_SEARCH 执行一次搜索 ACTION_WEB_SEARCH 执行一次web搜索 ACTION_FACTORY_TEST 工场测试的主要进入点, 第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适,实际上,这种形式是目前是最广泛的事件监听器形式。上面的程序代码就是匿名内部类来创建事件监听器的!!! 对于使用匿名内部类作为监听器的形式来说,唯一的缺点就是匿名内部类的语法有点不易掌握,如果读者java基础扎实,匿名内部类的语法掌握较好,通常建议使用匿名内部类作为监听器。 第二种:内部类作为监听器 将事件监听器类定义成当前类的内部类。1、使用内部类可以在当前类中复用监听器类,因为监听器类是外部类的内部类,2、所以可以自由访问外部类的所有界面组件。这也是内部类的两个优势。上面代码就是内部类的形式!! 第三种:Activity本身作为事件监听器 这种形式使用activity本身作为监听器类,可以直接在activity类中定义事件处理器方法,这种形式非常简洁。但这种做法有两个缺点:(1)这种形式可能造成程序结构混乱。Activity 的主要职责应该是完成界面初始化;但此时还需包含事件处理器方法,从而引起混乱。(2)如果activity界面类需要实现监听器接口,让人感觉比较怪异。 上面的程序让Activity类实现了OnClickListener事件监听接口,从而可以在该Activity类中直接定义事件处理器方法:onClick(view v),当为某个组件添加该事件监听器对象时,直接使用this作为事件监听器对象即可。 第四种:外部类作为监听器 ButtonTest类 当用户单击button按钮时,程序将会触发MyButtonListener监听器 外部MyButtonListener类 《Android基础应用》 AndroidUI基本控件与事件处理 ?本章任务 ?使用Android开发本息计算器程序 ?使用Android开发华氏-摄氏温度转换器 ?本章目标 ?熟悉掌握本章基本控件的使用 ?熟练掌握Android常用事件 1.Android基本控件 Android应用开发的一项内容就是用户界面的开发,Android提供了大量功能丰富的UI组件,大部分放在android.widget包及其子包android.view包及其子包 在Android当中View类是最基本的一个UI类,基本上所有的高级UI组件都是继承View类而实现的。如Button(按钮),list(列表),EditText(编辑框),RadioButton(多选按钮),Checkbox(选择框)等都是View类 在Android中,我们可以在Xml文件中使用UI组件也可以在java文件中创建UI组件官方建议采用xml方式,这样的话能够实现界面和代码分离 1.1TextView和EditText TextView是一种用于显示字符串的控件 EditText则是用来输入和编辑字符串的控件,EditText是一个具有编辑功能的TextView TextView和EditText基本属性 ●android:id设置ID,通过编码可以找到这个组件 ●android:layout_width设置在屏幕上的宽度 ●android:layout_height设置在屏幕上的高度 fill_parent强制性地使构件扩展,以填充布局单元内尽可能多的空间 wrap_content强制性地使视图扩展以显示全部内容 ●android:text设置显示的文本信息 ●android:textColor设置文本颜色 ●android:textSize设置文本尺寸 Android OnTouchListener触屏事件接口 OnTouchListener接口是用来处理手机屏幕事件的监听接口,当为View的范围内触摸按下、抬起或滑动等动作时都会触发该事件。该接口中的监听方法签名如下。 Java代码: public boolean onT ouch(View v, MotionEvent event) 参数v:参数v同样为事件源对象。 参数event:参数event为事件封装类的对象,其中封装了触发事件的详细信息,同样包括事件的类型、触发时间等信息。 节中介绍了一个在屏幕中拖动矩形移动的案例,本节将继续采用该案例的思路,通过监听接口的方式实现在屏幕上拖动按钮移动的案例。开发步骤如下。 创建一个名为Sample的Android项目。 准备字符串资源,打开strings.xml文件,用下列代码替换原有代码。 Java代码: Java代码: 广播事件处理 一.Broadcast Receiver 比如打电话等等; 广播接收器,它和事件处理机制类似,只不过事件处理机制是程序组件级别,而广播事件处理机制是系统级别。 二.使用Broadcast Receiver 1.编写类继承BroadcaseReceiver,复写onReceiver()方法 2.在AndroidManifest.xml文件中注册BroadcaseReceiver 3.构建Intent对象 4.调用sendBroadcase()方法发送广播 三.BroadcaseReceiver生命周期 BroadcastReceiver对象仅在调用onReceive()方法时有效,当该方法执行完毕后,系统认为销毁该对象。 四.标准广播Action 五.注册Broadcast Receiver的方法 1.在AndroidManifest.xml文件中进行注册//有缺陷,不会因为Activity被销毁而销毁,一般不用 Android进阶——Android事件分发机制之dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent 前言 Android事件分发机制可以说是我们Android工程师面试题中的必考题,弄懂它的原理是我们避不开的任务,所以长痛不如短痛,花点时间干掉他,废话不多说,开车啦 Android事件分发机制的简介 Android事件分发机制的发生在View与View之间或者ViewGroup与View之间具有镶嵌的视图上,而且视图上必须为点击可用。当一个点击事件产生后,它的传递过程遵循如下顺序:Activity->Window->View,即事件先传递给Activity,再到Window,再到顶级View,才开始我们的事件分发 Android事件分发机制的相关概念 Android事件分发机制主要由三个重要的方法共同完成的 dispatchTouchEvent:用于进行点击事件的分发 onInterceptTouchEvent:用于进行点击事件的拦截 onTouchEvent:用于处理点击事件 这里需要注意的是View中是没有onInterceptTouchEvent()方法的 Android事件分发机制的分发例子 这里以两个ViewGroup嵌套View来演示,下面是演示图 一、MyView 继承View并覆写其三个构造方法,覆写dispatchTouchEvent和onTouchEvent,前面已经说 了View是没有onInterceptTouchEvent方法的 public class MyView extends View { public MyView(Context context) { super(context); } public MyView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean dispatchTouchEvent(MotionEvent event) { System.out.println("MyView dispatchTouchEvent"); return super.dispatchTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { System.out.println("MyView onTouchEvent"); return super.onTouchEvent(event); } } 二、MyViewGroup01和MyViewGroup02 MyViewGroup01和MyViewGroup02是一样的代码,这里以01为例,继承ViewGroup并覆写其三个构造方法,覆写dispatchTouchEvent和onTouchEvent和onInterceptTouchEvent方法 public class MyViewGroup01 extends LinearLayout { public MyViewGroup01(Context context) { super(context); } public MyViewGroup01(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public MyViewGroup01(Context context, AttributeSet attrs) { Android广播事件处理闹钟实例 对应AlarmManage有一个AlarmManagerServie服务程序,该服务程序才是正真提供闹铃服务的,它主要维护应用程序注册下来的各类闹铃并适时的设置即将触发的闹铃给闹铃设备(在系 统中,linux实现的设备名为”/dev/alarm”),并且一直监听闹铃设备,一旦有闹铃触发或 者是闹铃事件发生,AlarmManagerServie服务程序就会遍历闹铃列表找到相应的注册闹铃并 发出广播。该服务程序在系统启动时被系统服务程序system_service启动并初始化闹铃设备(/dev/alarm)。当然,在JAVA层的AlarmManagerService与Linux Alarm驱动程序接口之间 还有一层封装,那就是JNI。 AlarmManager将应用与服务分割开来后,使得应用程序开发者不用关心具体的服务,而 是直接通过AlarmManager来使用这种服务。这也许就是客户/服务模式的好处吧。AlarmManager与 AlarmManagerServie之间是通过Binder来通信的,他们之间是多对一的关系。 在android系统中,AlarmManage提供了3个接口5种类型的闹铃服务。 3个接口: 1. // 取消已经注册的与参数匹配的闹铃 2. void cancel(PendingIntent operation) 1. 2. //注册一个新的闹铃 3. void set(int type, long triggerAtTime, PendingIntent operation) 4. //注册一个重复类型的闹铃 5. void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation) 6. //设置时区 7. void setTimeZone(String timeZone) 5个闹铃类型 public static final int ELAPSED_REALTIME 1. //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传 递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠 2. 时间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是 3 Testing和Instrumentation Android提供了一系列强大的测试工具,它针对Android的环境,扩展了业内标准的JUnit测试框架。尽管你可以使用JUnit 测试Android工程,但Android工具允许你为应用程序的各个方面进行更为复杂的测试,包括单元层面及框架层面。Android测试环境的主要特征有: ●可以访问Android系统对象。 ●Instrumentation框架可以控制和测试应用程序。 ●Android系统常用对象的模拟版本。 ●运行单个test或test suite的工具,带或不带Instrumentation。 ●支持以Eclipse的ADT插件和命令行方式管理Test和Test工程。 这篇文章是对Android测试环境和测试方法的简要介绍,并假设你已经拥有一定的Android应用程序编程及JUnit测试的经验。概要 Android测试环境的核心是一个Instrumentation框架,在这个框架下,你的测试应用程序可以精确控制应用程序。使用Instrumentation,你可以在主程序启动之前,创建模拟的系统对象,如Context;控制应用程序的多个生命周期;发送UI事件给应用程序;在执行期间检查程序状态。Instrumentation框架通过将主程序和测试程序运行在同一个进程来实现这些功能。 通过在测试工程的manifest文件中添加 Android开发-触屏事件的获取和触摸屏幕位置 在修改后的工厂测试程序中,用到了关于触摸事件的获取,顺便学习关于触摸事件和触摸位 Java代码 1.publicbooleanonTouchEvent(MotionEventevent){ 2. 3.//获得触摸的坐标 4.floatx=event.getX(); 5.floaty=event.getY();switch(event.getAction()) 6.{ 7.//触摸屏幕时刻 8.caseMotionEvent.ACTION_DOWN: 9. 10.break; 11.//触摸并移动时刻 12.caseMotionEvent.ACTION_MOVE: 13. 14.break; 15.//终止触摸时刻 16.caseMotionEvent.ACTION_UP: 17.break; 18.} 19.returntrue; 20.} 的知识,其方法如下: 关于publicbooleanonTouchEvent(MotionEventevent)方法: 参数event:参数event为手机屏幕触摸事件封装类的对象,其中封装了该事件的所有信息,例如触摸的位置、触摸的类型以及触摸的时间等。该对象会在用户触摸手机屏幕时被创建。 返回值:该方法的返回值机理与键盘响应事件的相同,同样是当已经完整地处理了该事件且不希望其他回调方法再次处理时返回true,否则返回false。 该方法并不像之前介绍过的方法只处理一种事件,一般情况下以下三种情况的事件全部由onTouchEvent方法处理,只是三种情况中的动作值不同。 屏幕被按下:当屏幕被按下时,会自动调用该方法来处理事件,此时MotionEvent.getAction()的值为MotionEvent.ACTION_DOWN,如果在应用程序中需要处理屏幕被按下的事件,只需重新该回调方法,然后在方法中进行动作的判断即可。 屏幕被抬起:当触控笔离开屏幕时触发的事件,该事件同样需要onTouchEvent方法来捕捉,然后在方法中进行动作判断。当MotionEvent.getAction()的值为MotionEvent.ACTION_UP时,表示是屏幕被抬起的事件。 在屏幕中拖动:该方法还负责处理触控笔在屏幕上滑动的事件,同样是调用MotionEvent.getAction()方法来判断动作值是否为MotionEvent.ACTION_MOVE再进行处理。 完全理解Android TouchEvent事件分发 机制(二) 可以看出来,事件一旦被某一层消费掉,其它层就不会再消费了 到这里其实对事件分发的机制就有个大概了解,知道里面的原理是怎么回事。 下面就让我们来去梳理一下这个事件分发所走的逻辑。 我们仔细思考一下,为什么有的事件有UP有的没有? 为什么Up和Down的顺序不同呢? 为什么要按照这个顺序执行呢? 这个例子主要是为了说明分发、拦截、消费的流程 以例一为例,在每个View 都不拦截down 事件的情况下,down 事件是这样传递的 super.dispatchTouchEvent方法,上面我们介绍过, 这个方法内部实际上是调用的onTouchEvent方法 所以最后的输出日志顺序就是从父到子依次调用分发和拦截,然后从子到父依次调用消费。 例二也是同理,区别在于 当Father拿到事件的时候,选择了拦截下来不再询问其他, 但是Father也没消费,直接又还回给了Grandpa, Grandpa同样也没有消费这个事件。 所以最终的顺序就是,从Grandpa到Father再返回Grandpa就结束了,没有经过LogImageView。 例三的情况就不太一样了 当Grandpa->Father->LogImageView 传递到LogImageView时,LogImageView不消费又返回给了Father,Father在onTouchEvent消费掉了事件。 然后反馈给Father说事件已经消费。,就等于parent.dispatchTouchEvent返回true给上一级的Grandpa, Grandpa不会再调用grandpa.onTouchEvent方法。 从这里我们可以总结出来: **dispatchTouchEvent返回值的作用是用于标志这个事件是否“消费了”, 无论是自己或者下面的子一级用掉了都算是消费掉。** 再如这个例子中,如果我们让LogImageView消费掉事件, 那么Father收到LogImageView的消息后,也会调用parent.dispatchTouchEvent返回true给Grandpa, 所以这个方法返回值的true是只要用掉就行,无论自己还是下面某一级, 而非我把事件传递下去就是true了,下面没人消费最终其实还是返回false的。 至此,我们来总结一下这三个方法的大致作用: dispatchTouchEvent方法内容里处理的是分发过程。可以理解为从Grandpa->Father->LogImageView一层层分发的动作 dispatchTouchEvent的返回值则代表是否将事件分发出去用掉了,自己用或者给某一层子级用都算分发成功。比如Father消费了事件,或者他发出去给的LogImageView消费了事件, Android按键事件处理流程 -- KeyEvent 2014/6/24 13:18:58 xiaoweiz 程序员俱乐部我要评论(0) ?摘要:刚接触Android开发的时候,对touch、key事件的处理总是一知半解,一会是Activity 里的方法,一会是各种View中的,自己始终不清楚到底哪个在先哪个在后,总之对整个处理流程没能很好的把握。每次写这部分代码的时候都有些心虚,因为我不是很清楚什么时候、以什么样的顺序被调用,大都是打下log看看,没问题就算ok了。但随着时间流逝,这种感觉一直折磨着我。期间也在网上搜索了相关资料,但总感觉不是那么令人满意。自打开始研究Android源码起 ?标签:事件android KEY流程事件处理 ? 刚接触Android开发的时候,对touch、key事件的处理总是一知半解,一会是Activity里的方法,一会是各种View 中的,自己始终不清楚到底哪个在先哪个在后,总之对整个处理流程没能很好的把握。 每次写这部分代码的时候都有些心虚, 因为我不是很清楚什么时候、以什么样的顺序被调用,大都是打下log看看,没问题就算ok了。但随着时间流逝,这种感觉一直 折磨着我。期间也在网上搜索了相关资料,但总感觉不是那么令人满意。自打开始研究Android源码起,这部分内容的分析早就 被列在我的TODO list上了。因为弄懂这部分处理逻辑对明明白白地写android程序实在是太重要了,所以今天我就带领大家看看 这部分的处理逻辑。touch事件的处理我将放在另一篇博客中介绍(相比KeyEvent,大体都一样,只是稍微复杂些)。 为了突出本文的重点,我们直接从事件被派发到View层次结构的根节点DecorView 开始分析,这里我们先来看看DecorView# dispatchKeyEvent方法,代码如下: @Override publicboolean dispatchKeyEvent(KeyEvent event) { finalint keyCode = event.getKeyCode(); finalint action = event.getAction(); finalboolean isDown = action == KeyEvent.ACTION_DOWN; /// 1. 第一次down事件的时候,处理panel的快捷键 if (isDown && (event.getRepeatCount() == 0)) { 浅谈android单击和键盘事件 一,概念和种类 (1) 二,事件的用法。 (1) 三,事件的过程及原理 (2) 四,android事件的常用方法 (5) 1)onClick:按钮单击事件。 (5) 2)onLongClick:长按事件。 (5) 3)onCreateContextMenu:上下文菜单事件。 (6) 4)onFocusChange:焦点事件。 (7) 5)onTouchEvent:触屏事件。 (7) 6)onKeyUp、onKeyDown:键盘或遥控事件。 (8) 7)onTrackballEvent:轨迹球事件。 (8) 一,概念和种类 事件是用户与应用的UI交互的动作。在android中有许许多多的事件,即使是一个简单的单击事件,也有按下、弹起、长按之分。它们以监听接口和基于回调方式进行划分的。下面列出几种常用的事件: 1,onClick:按钮单击事件。 2,onLongClick:长按事件。 3,onCreateContextMenu:上下文菜单事件。 4,onFocusChange:焦点事件。 5,onTouchEvent:触屏事件。 6,onKeyUp、onKeyDown:键盘或遥控事件。 7,onTrackballEvent:轨迹球事件。 二,事件的用法。 在android平台中,每个View都有自己处理事件的回调方法,开发人员只需要重写这些回调方法,就可以实现需要的响应事件。 上图是一个简单的应用实例。程序的主入口是MainActivity,与之对应的布局文件是res/layout/main.xml ,在布局文件中有一个id为button的按钮。 单击事件只需要注册相应的监听器(setOnClickListener)监听事件的来源,当事件发生时作出相应的处理。 键盘或遥控事件只需重写父类Activity的(onKeyDown)方法(父类已经封装好了接口),通过接收不同的键值作出相应的处理。 三,事件的过程及原理 事件过程原理: 本文由我司收集整编,推荐下载,如有疑问,请与我司联系关于Android触摸事件TouchEvent的传递及截取,研究心得。 2014/07/23 868 之前一直经常使用Touch的相关操作,但是对其中的具体细节一直没有详细的研究一下,今天研究了一下,感觉思路有点清晰了很多,再次记录一下。 ?其中关于Android触摸事件相关的函数有:dispatchTouchEvent() | onInterceptTouchEvent()| onTouchEvent() ?由函数的名字也大概能够知道具体的作用是什么了:dispatchTouchEvent()负责触摸事件的分发,onInterceptTouchEvent()决定事件是不是在当前的View下拦截,onTouchEvent()负责触摸事件的处理消化。 ?先说一下传递的机制和顺序吧。 ?我们建立一个这样的场景,就是在一个Activity中有一个View,名叫:Layout_out_0,在Layout_out_0中还有嵌套在里面的一个View,叫Layout_inner_0,相信大家也能够想象是个什么东西吧。 ? ?当你触摸屏幕的时候,首先产生事件的顺序为:DOWN—— MOVE(这个事件的产生和你触摸时的触摸时间的长度有关,如果时间极短,就不会产生,如果一直按住,就会一直产生MOVE)—— UP(手指抬起的时候);当然这个顺序是固定的,事件的处理也是一个传递消化完毕之后,才开始第二个事件的传递消化,很固定。 ?好进入重点,DOWN事件产生首先经由Activity的dispatchTouchEvent(),在Activity中是没有方法onInterceptTouchEvent()方法的,也就无法使产生的事件被拦截了,接着进入等级仅次于Activity的容器组件View中,也是经由dispatchTouchEvent()(不过我在测试程序中尝试把该函数的返回值 super.dispatchTouchEvent()修改为false或者是true结果发现导致事件无法正常的分发,因此不建议大家重写该回调函数),在经过onInterceptTouchEvent()决定是不是要拦截该事件,如果onInterceptTouchEvent()返回true则表示要拦截,那么事件就不会再继续往子控件传递了(否则继续重复上面的步骤,再次进入子控件的 一、实验名称:实验5 事件处理 二、实验日期: 三、实验目的: ◆基于监听的事件处理 ◆基于回调的事件处理 四、实验用的仪器和材料:Windows+Eclipse+jdk+sdk+adt 五、实验的步骤和方法: 实验一:基于监听的事件处理机制 Activity.java package com.my; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class Week05Activity extends Activity implements OnClickListener{ EditText txt; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/1f12646217.html,yout.main); //获取button对象 Button btn1 = (Button)findViewById(R.id.button1); Button btn2 = (Button)findViewById(R.id.button2); Button btn3 = (Button)findViewById(R.id.button3); Button btn4 = (Button)findViewById(R.id.button4); Button btn5 = (Button)findViewById(R.id.button5); //获取edittext对象 txt = (EditText)findViewById(R.id.edittext); //定义一个单击事件的监听器(内部类) class MyClickListener implements OnClickListener{ public void onClick(View v) { EditText txt = (EditText)findViewById(R.id.edittext); txt.setText("内部类"); } } //定义一个单击事件的监听器(外部类) class ExtentEvent implements OnClickListener{ private Activity act; private EditText txt; public ExtentEvent(Activity act,EditText txt){ this.act=act; this.txt=txt; } public void onClick(View v) { txt.setText("外部类"); } } //为按钮绑定事件监听(内部类) btn1.setOnClickListener(new MyClickListener()); //为按钮绑定事件监听(外部类) btn2.setOnClickListener(new ExtentEvent(this,txt)); //直接使用Activity作为事件监听器 btn4.setOnClickListener(this); //匿名内部类 btn3.setOnClickListener(new OnClickListener(){ public void onClick(View v) { txt.setText("匿名内部类"); } }); } //直接绑定到标签 public void clickHandler(View source){ 实验3 android事件处理 学时:2学时 一、实验目的: 1、了解Android 的事件处理机制, 2、掌握Handler 消息传递机制,学会如何利用 3、AsyncTask 进行异步任务处理。 二、实验内容: 1.运行书上例题(EventTransferTest,见P89页),观察并分析程序的输出结果. 2.实现的是当开始按钮按下时,会启动一个线程,并绑定到handler中,该线程发送带有参数的message到handler的消息队列中,消息队列的另一端获取该消息,并且用该消息的参数来更新进度条。(请将该题做好后保存,保存名为“你的学号”,发给你班的学习委员,各班学习委员统一发到我的邮箱610083060@https://www.doczj.com/doc/1f12646217.html,) 3.将上一题用AsyncTask实现. 第2题的代码参考: 实验主要部分代码和注释: 参考代码如下: MainActivity.java: import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; public class MainActivity extends Activity { private ProgressBar progress_bar = null; private Button start = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/1f12646217.html,yout.activity_main); progress_bar = (ProgressBar)findViewById(R.id.progress_bar); start = (Button)findViewById(R.id.start); start.setOnClickListener(new StartOnClickListenr()); } private class StartOnClickListenr implements OnClickListener { public void onClick(View v) { //让进度条显示出来 progress_bar.setVisibility(View.VISIBLE); //将线程加入到handler的线程队列中 update_progress_bar.post(update_thread); } } //创建一个handler,内部完成处理消息方法 Handler update_progress_bar = new Handler() { @Override View的事件分发: 对于事件分发机制,举个简单的例子,在一个Activity中只有一个按钮,如果我们想给这个按钮注册一个点击事件,只需要调 用setOnClickListener方法,这样在onClick方法里面写实现的代码,就可以在按钮被点击的时候执行.我们再给这个按 钮添加一个touch事件,只需要调用setOnTouchListener方法,onTouch方法里能做的事情比onClick要多一些,比如判断手指按下、抬起、移动等事件。如果我两个事件都注册了,我之前做过一个实验,运行程序点击按钮的结果是onTouch是优先于onClick执行的,并且onTouch执行了两次,一次是ACTION_DOWN,一次是ACTION_UP(你还可能会有多次ACTION_MOVE的执行,如果你手抖了一下)。因此事件传递的顺序是先经过onTouch,再传递到onClick。 onTouch方法是有返回值的,如果我们尝试把onTouch方法里的返回值改成true,再运行一次就会发现onClick方法不再执行了,这是因为onTouch方法返回true就认为这个事件被onTouch消费掉了,因而不会再继续向下传递。 我看过事件分发的一些源码, 只要你触摸到了任何一个控件,就一定会调用该控件的dispatchTouchEvent方法。那当我们去点击按钮的时候,就会去调用Button类里的dispatchTouchEvent方法,可是你会发现Button类里并没有这个方法,那么就到它的父类TextView 里去找一找,你会发现TextView里也没有这个方法,那没办法了,只好继续在TextView的父类View里找一找,这个时候你终于在View里找到了这个方法,示意图如下: 对于View中的dispatchTouchEvent方法,在这个方法内,首先是进行了一个判断,里面有三个条件,如果这三个条件都满足,就返回true,否则就返回onTouchEvent方法执行的结果。对于第一个条件是一个mOnTouchListener变量,这个变量是在View中的setOnTouchListener方法里赋值的,也就是说只要我们给控件注册了touch事件,mOnTouchListener 就一定被赋值了。第二个条件是判断当前点击的控件是否是enable的,按钮默认都是enable的,因此这个条件恒定为true。第三个条件最为关键,mOnTouchListener.onTouch(this, event),其实也就是去回调控件注册touch事件时的onTouch 方法。也就是说如果我们在onTouch方法里返回true,就会让这三个条件全部成立,从而整个方法直接返回true。如果我们在onTouch方法里返回false,就会再去执行onTouchEvent(event)方法。 结合我之前讲的例子,首先在dispatchTouchEvent中最先执行的就是onTouch方法,因此onTouch肯定是要优先于onClick 执行的,而如果在onTouch方法里返回了true,就会让dispatchTouchEvent方法直接返回true,不会再继续往下执行。而我做的实验的结果也证实了如果onTouch返回true,onClick就不会再执行了。 这里还讲到了onTouchEvent方法,这个方法要稍微复杂一点,如果我们的控件是可以点击的,就会进入到switch判断中去,而如果当前的事件是抬起手指,则会进入到MotionEvent.ACTION_UP这个case当中。在经过种种判断之后,会执行到performClick()方法。 对于performClick()方法,只要mOnClickListener不是null,就会去调用它的onClick方法。 而刚刚说过,当我们通过调用setOnClickListener方法来给控件注册一个点击事件时,就会给mOnClickListener赋值。然后每当控件被点击时,都会在performClick()方法里回调被点击控件的onClick方法。 Android平台的事件处理机制有两种,一种是基于回调机制的,一种是基于监听接口的,现介绍第一种:基于回调机制的事件处理。Android平台中,每个View都有自己的处理事件的回调方法,开发人员可以通过重写View中的这些回调方法来实现需要的响应事件。当某个事件没有被任何一个View处理时,便会调用Activity中相应的回调方法。Android提供了以下回调方法供用户使用: 1. onKeyDown: 功能:该方法是接口KeyEvent.Callback中的抽象方法,所有的View全部实现了该接口并重写了该方法,该方法用来捕捉手机键盘被 按下的事件。 声明:public boolean onKeyDown (int keyCode, KeyEvent event) 参数说明: 参数keyCode,该参数为被按下的键值即键盘码,手机键盘中每个按钮都会有其单独的键盘码,在应用程序都是通过键盘码才知道用户按 下的是哪个键。 参数event,该参数为按键事件的对象,其中包含了触发事件的详细信息,例如事件的状态、事件的类型、事件发生的时间等。当用户按下按键时,系统会自动将事件封装成KeyEvent对象供应用程序使 用。 返回值,该方法的返回值为一个boolean类型的变量,当返回true 时,表示已经完整地处理了这个事件,并不希望其他的回调方法再次进行处理,而当返回false时,表示并没有完全处理完该事件,更希望其他回调方法继续对其进行处理,例如Activity中的回调方法。 2. onKeyUp: 功能:该方法同样是接口KeyEvent.Callback中的一个抽象方法,并且所有的View同样全部实现了该接口并重写了该方法,onKeyUp 方法用来捕捉手机键盘按键抬起的事件。 声明:public boolean onKeyUp (int keyCode, KeyEvent event) 参数说明:同onKeyDown 3. onTouchEvent: 功能:该方法在View类中的定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触摸事件。 声明:public boolean onTouchEvent (MotionEvent event) 参数说明: 参数event:参数event为手机屏幕触摸事件封装类的对象,其中封装了该事件的所有信息,例如触摸的位置、触摸的类型以及触摸的时间等。该对象会在用户触摸手机屏幕时被创建。安卓按钮单击事件
AndroidUI基本控件与事件处理
Android OnTouchListener触屏事件接口
android简单的广播事件处理
Android进阶——Android事件分发机制之dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent
Android广播事件处理闹钟实例
主动发送事件 android
Android开发触屏事件的获取和触摸屏幕位置
完全理解AndroidTouchEvent事件分发机制(二)分析解析
Android按键事件处理流程 -- KeyEvent
浅谈Android事件原理
【IT专家】关于Android触摸事件TouchEvent的传递及截取,研究心得。
Android实验5 事件处理答案
实验3 android事件处理
android 面试事件分发机制的回答
安卓事件处理