版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android移动应用开发
010302040706认识Android列表与适配器菜单与对话框设计UI控件设计设计用户界面创建Android项目Android本地存储书目录140911BroadcastReceiver与广播通信Service与后台服务设计ContentProvider与应用间数据共享网络连接与管理05Activity与Fragment08131210线程间的通信与异步机制Android性能分析与测试
BroadcastReceiver与广播通信11.1发送与监听广播11.2EventBus事件管理11.3使用AppWidgets创建桌面应用章目录11.1.1初识BroadcastReceiver广播作为Android组件间的通信方式,可以使用的场景如下。同一应用内部的同一组件内的消息通信(单个或多个线程之间)。同一应用内部的不同组件之间的消息通信(单个进程)。同一应用具有多个进程的不同组件之间的消息通信。不同应用之间的组件之间的消息通信。Android在特定情况下与应用之间的消息通信。11.1.1初识BroadcastReceiver从实现原理上看,Android中的广播使用了观察者模式,基于消息的发布/订阅事件模型。在程序中使用BroadcastReceiver的一般步骤如下。定义一个类继承BroadcastReceiver,并且重载onReceiver()方法来响应事件。在程序中注册BroadcastReceiver。构建Intent对象,把要发送的信息和用于过滤的信息如Action、Category装入一个Intent对象,调用sendBroadcast()方法将其广播发出。在Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则调用BroadcastReceiver的onReceive()方法。11.1.2创建BroadcastReceiver创建BroadcastReceiver主要通过定义一个继承BroadcastReceiver的类来实现,继承该类后重载其onReceiver()方法。该方法是实现对广播的监听并响应广播事件的核心方法。例如,下面的代码演示了一个短信接收广播的工作方法。publicclassSMSReceiverextendsBroadcastReceiver{@OverridepublicvoidonReceive(Contextcontext,Intentintent){Bundlebundle=intent.getExtras();if(bundle!=null){Object[]objArray=(Object[])bundle.get("pdus");SmsMessage[]messages=newSmsMessage[objArray.length];for(inti=0;i<objArray.length;i++){messages[i]=SmsMessage.createFromPdu((byte[])objArray[i]);StringBuilderstr=newStringBuilder("from:");str.append(messages[i].getDisplayOriginatingAddress());str.append("\nmessage:\n");str.append(messages[i].getDisplayMessageBody());Toast.makeText(context,str.toString(),Toast.LENGTH_LONG).show();}}}11.1.2创建BroadcastReceiver响应广播事件处理的Activity需要在onStart()方法中对相应的BroadcastReceiver进行注册。例如:protectedvoidonStart(){super.onStart();smsReceiver=newSMSReceiver();registerReceiver(callReceiver,newIntentFilter("vider.Telephony.SMS_RECEIVED"));}并在onStop()方法中进行注销。例如:protectedvoidonStop(){unregisterReceiver(smsReceiver);super.onStop();}11.1.2创建BroadcastReceiver使用BroadcastReceiver时常见的方法。abortBroadcast()clearAbortBroadcast()getAbortBroadcast()getResultCode()getResultData()isInitialStickyBroadcast()isOrderedBroadcast()11.1.3注册广播静态注册静态注册是在AndroidManifest.xml的<application>里定义接收者并设置要接收的Action和IntentFilter。例如:<receiverandroid:name=".SMSReceiver"><intent-filter><actionandroid:name="vider.Telephony.SMS_RECEIVED"/></intent-filter></receiver>动态注册动态广播最好在Activity的onResume()方法中注册,在onPause()方法中注销。(1)registerReceiver(receiver,filter)方法(2)registerReceiver(receiver,filter,broadcastPermission,scheduler)方法11.1.4发送广播正常广播正常广播通过Context.sendBroadcast()方法发送,是完全异步的。BroadcastReceiver的onReceiver()方法不能包含所要使用的结果或中止广播的方法。sendOrderedBroadcast(intent,receiverPermission)sendOrderedBroadcast(intent,receiverPermission,resultReceiver,scheduler,initialCode,initialData,initialExtras)有序广播有序广播通过Context.sendOrderedBroadcast()方法发送,每次发送给一个接收者。所谓有序,就是每个接收者执行后可以传播给下一个接收者,也可以完全中止传播(不传播给其他接收者)。而接收者运行的顺序可以通过比较IntentFilter里的android:priority来控制,当优先级相同的时候,接收者以任意的顺序运行。发送有序广播的方法有:11.1.4发送广播异步广播异步广播通过Context.sendStickyBroadcast()方法发送,当处理完相应的Intent之后,BroadcastReceiver依然存在,这时候registerReceiver()方法还能收到它的值,直到调用removeStickyBroadcast()方法把它去掉为止。异步广播不能将处理结果传给下一个接收者,且无法终止广播。异步广播的发送和移除都需要在AndroidManifest.xml里声明如下权限。<uses-permissionandroid:name="android.permission.BROADCAST_STICKY"/>另外,有如下方法:sendStickyOrderedBroadcast(intent,resultReceiver,scheduler,initialCode,initialData,initialExtras)11.1发送与监听广播11.2EventBus事件管理11.3使用AppWidgets创建桌面应用章目录11.2.1EventBus的架构EventBus的架构如图所示。在该架构中包含以下3个角色。Event:事件。Subscriber:事件订阅者。Publisher:事件发布者,它可以在任意线程里发布事件。11.2.1EventBus的架构EventBus有以下4种线程模型。-÷×+POSTING:默认的线程模型,表示事件处理方法的线程和发布事件的线程在同一个线程。MAIN:表示事件处理方法的线程在主线程(UI线程),因此在这里不能进行耗时操作。BACKGROUND:表示事件处理方法的线程在后台线程,因此不能进行UI操作。ASYNC:表示无论事件发布的线程是哪一个,事件处理方法始终会新建一个子线程运行,同样不能进行UI操作。11.2.2EventBus的使用在使用EventBus前,需要添加如下的依赖。implementation'org.greenrobot:eventbus:3.1.1'publicclassMessageWrap{publicfinalStringmessage;publicstaticMessageWrapgetInstance(Stringmessage){returnnewMessageWrap(message);}privateMessageWrap(Stringmessage){this.message=message;}}应用EventBus管理事件的设计步骤如下。定义事件消息类(POJO对象)。11.2.2EventBus的使用@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);EventBus.getDefault().register(this);//事件的注册…}@OverrideprotectedvoidonDestroy(){EventBus.getDefault().unregister(this);//解除注册super.onDestroy();}//普通事件的处理@Subscribe(threadMode=ThreadMode.MAIN)publicvoidhandleEvent(EventBusCarriercarrier){Stringcontent=(String)carrier.getObject();show.setText(content);}接收事件。11.2.2EventBus的使用privatevoidpublishContent(){Stringmsg=mEditText.getText().toString();EventBus.getDefault().post(MessageWrap.getInstance(msg));ToastUtils.makeToast("Published:"+msg);}发布事件。以下是几点说明。(1)一般事件和黏性事件(2)终止事件(3)优先级11.2.2EventBus的使用在使用EventBus前,需要添加如下的依赖。implementation'org.greenrobot:eventbus:3.1.1'应用EventBus管理事件的设计步骤如下。定义事件消息类(POJO对象)。接收事件。发布事件。任务11.1实现音乐播放器后台播放的控制【任务介绍】1.任务描述在第10章任务10.1的基础上,实现音乐在后台播放期间,使用Notification进行播放控制。
2.运行结果本任务运行结果如图所示。11.1发送与监听广播11.2EventBus事件管理11.3使用AppWidgets创建桌面应用章目录11.3.1认识AppWidgetsAppWidgets是一个可以嵌入其他应用(如主屏幕),并能定期更新其View的桌面小部件。一个能容纳其他AppWidgets的应用,称为AppWidgetsHost。图中展示了Android设备中常见的AppWidgets。11.3.1认识AppWidgets一个AppWidgets包括以下3部分。312视图布局为了能让AppWidgets进行显示,需要为AppWidgets提供一个布局文件。AppWidgetProviderInfoAppWidgetProviderInfo用于对AppWidgets的元数据进行描述,如AppWidgets的布局、更新频率和AppWidgetProvider类。AppWidgetProviderAppWidgetProvider定义了一些基本方法,通过这些方法可以很方便地和AppWidgets进行交互。AppWidgetProvider基于广播事件,当AppWidgets进行更新、启用、禁用和删除时,在AppWidgetProvider中,将收到其对应的广播,并调用相应的回调方法进行处理。11.3.2设计AppWidgets布局标准的AppWidgets显示界面由3个组件组成:一个有界限的封装盒、一个框架和一个图形控制面板。AppWidgets显示界面设计示意如图11-4所示。和Activity的布局文件一样,AppWidgets的布局文件也需要保存在res/layout目录下。但是它必须在XML文件中定义。11.3.2设计AppWidgets布局RemoteViews类在android.widget.RemoteViews包下,是一个能够显示在其他进程中的远程视图。AppWidgets中的视图都是通过RemoteViews表现的。在RemoteViews的构造方法中,首先通过传入布局文件的ID来获取布局文件对应的RemoteViews视图,然后调用RemoteViews中的方法对布局中的控件进行设置。RemoteViews支持的布局包括FrameLayout、LinearLayout、RelativeLayout和GridLayout等。支持的控件包括AnalogClock、Button、Chronometer、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView和AdapterViewFlipper等。RemoteViews不支持布局类和控件类的派生。11.3.3实现AppWidgetProviderInfoAppWidgetProviderInfo的定义必须在一个只有单一的<appwidget-provider>标签的XML资源文件中进行,该文件必须放在res/xml目录下。例如:<appwidget-providerxmlns:android="/apk/res/android"android:minWidth="294dp"android:minHeight="72dp"android:updatePeriodMillis="86400000"android:previewImage="@drawable/preview"android:initialLayout="@layout/example_appwidget"android:configure="com.example.android.ExampleAppWidgetConfigure"android:resizeMode="horizontal|vertical"android:widgetCategory="home_screen"></appwidget-provider>11.3.3实现AppWidgetProviderInfo以下是关于<appwidget-provider>标签的一些属性的介绍。minWidth和minHeight属性用于说明AppWidgets在屏幕上至少要占用多大的空间。updatePeriodMillis属性用于说明AppWidgets请求AppWidgetProvider的onUpdate()方法来更新AppWidgets的频率。previewImage属性用于指明AppWidgets的预览图标,帮助用户选中该AppWidgets的图标,并在打算添加该AppWidgets时进行显示,以便用户了解该AppWidgets的界面。initialLayout属性用于设置AppWidgets的布局文件。configure属性用于说明AppWidgets在被添加到AppWidgetsHost时,哪个ConfigureActivity将首先启动。这是一个可选属性。autoAdvanceViewId属性用于指定一个子ViewID,表明该子View会自动更新。resizeMode属性用于说明AppWidgets重新调整大小的规则。icon属性用于说明AppWidget在AppWidgets列表中显示的图标。label属性用于说明AppWidgets在AppWidgets列表中显示的名字。widgetCategory属性用于声明AppWidgets是否可以显示在主屏幕(home_screen)或锁定屏幕(keyguard)上。11.3.4扩展AppWidgetProviderAppWidgetProvider继承BroadcastReceiver,它对AppWidgets的广播进行了简单分类,并封装了处理的统一接口,以方便使用。AppWidgetProvider只接收和AppWidgets相关的广播。收到以上广播后,将分别调用以下方法。(1)onUpdate()方法(2)onDeleted()方法(3)onEnabled()方法(4)onDisabled()方法(5)onAppWidgetOptionsChanged()方法(6)onReceive()方法11.3.5声明AppWidgets实现AppWidgetProviderInfo并扩展AppWidgetProvider之后,即可在AndroidManifest.xml文件中声明该AppWidgetProvider类。例如:<receiverandroid:name="ExampleAppWidgetProvider"><intent-filter><actionandroid:name="android.appwidget.action.APPWIDGET_UPDATE"/></intent-filter><meta-dataandroid:name="vider"android:resource="@xml/example_appwidget_info"/></receiver><receiver>标签的android:name属性必须进行设置。在<meta-data>标签中,必须指定AppWidgetProviderInfo资源文件,并定义以下两个属性。android:name属性用于定义<meta-data>标签的名字。android:resource属性用于说明AppWidgetProviderInfo资源文件的位置。11.3.6实现ConfigurationActivity如果想让用户在添加一个新的AppWidgets时能对该AppWidgets进行一些个性化的配置,可以通过编写一个AppWidgets的ConfigurationActivity来实现。例如:<activityandroid:name=".ExampleAppWidgetConfigure"><intent-filter><actionandroid:name="android.appwidget.action.APPWIDGET_CONFIGURE"/></intent-filter></activity>在实现一个ConfigurationActivity时,需要注意以下两点。通过AppWidgetsHost调用ConfigurationActivity时,ConfigurationActivity应该总是能返回一个执行结果。如果AppWidgets有ConfigurationActivity,那么当AppWidgets被创建时,AppWidgetProvider的onUpdate()方法将不会被调用。11.3.6实现ConfigurationActivity以下是在ConfigurationActivity中更新AppWidgets和退出ConfigurationActivity的主要步骤。在启动ConfigurationActivity的Intent中得到AppWidgets的ID。进行AppWidgets配置的处理。AppWidgets的配置事务被处理完后,调用AppWidgetManager.getInstance()方法来得到AppWidget
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年初级会计职称考试题库
- 2026年营养师考试高频错题集
- 2026年理财规划师认证考试重点
- 2026年小学数学应用题高频考点
- 2026年小学科学课堂教学竞赛方案
- 2026年小学科技知识竞赛方案
- 2026年销售招聘笔试模拟题
- 小学生诚信教育高阶主题班会说课稿
- 2026年幼儿园家园栏防疫知识
- 2026年站务员岗位专业知识
- YS/T 583-2016热锻水暖管件用黄铜棒
- GB/Z 13800-2021手动轮椅车
- 2023年沅陵县水利系统事业单位招聘笔试题库及答案
- GB/T 24919-2010工业阀门安装使用维护一般要求
- GB/T 17492-2019工业用金属丝编织网技术要求和检验
- 化验室安全培训课件
- 最新合同法课件
- 夏季高温施工专项方案17P
- Java教案5面向对象编程技术
- 建筑工程脚手架安全施工培训ppt
- 内蒙古自治区专业技术人员年考核表
评论
0/150
提交评论