Android的最重要的组件式service和activity,那么在使用的过程中,我们最常遇到的问题是他们之间的通信问题。当然今天我们不研究底层的实现问题,我从上层的应用的如何使用的角度进行研究。
首先Activity调用Service
这个是比较基础的,它有两种常见的方法;
第一, 通过Intent,这个比较简单了,可以指定package name和class name的方式来调用,Intent.setClassName这个成员即可。通过putString来装载数据,startService(intent)即可例子如下:
Intent regIntent = new Intent(“com.service”);
regIntent.putExtra(“data”, "helloData");
startService(regIntent);
第二, 通过IPC,这个比较麻烦,一般用不着,这里不谈
但是,反过来,Service如何将一些状态告诉Activity呢?方法有两种
第 一、 service 通过广播的形式发送broadcast,我们写一个broadcastReceiver即可,通常的情况,将broadcastReceiver写成 Activity的内部类,这个onReceiver可以直接调用activity的方法来更新界面。但是内部类只能采用代码注册的方法 registerReceiver(),不能再AndroidManifest.xml文件中进行静态的声明,因为内部类要依赖于外部类而存在的。如果你 一定要用AndroidManifest来注册receiver,那么只能把broadcastReceiver写成单独的文件的public类。这时 候,你想更新界面就比较麻烦了,你只能自己把你要更新的activity运行起来,然后再向这个activity的内部类发广播的消息来更新界面
第 二、 service直接向activity发intent。在service里面进行startActivity是属于在Activity外 startActivity即在task外启动activity,因此,必须在intent加入一个参数如下:
Intent intentSend = new Intent(Constants.ACTION_STATUS);
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent1.putExtra(“statues“,“end“);
context.startActivity(intent1);
但 是此时会引发的一个问题是,多次startActivity会导致很多的activity实现被运行,这肯定不是我们要的,我只要一个Activity就 可,此时,我们要在androidManifest里面对这个activity的launchMode设置为singleInstance
<activity android:name="com.demo.Activity"
android:label="@string/online" android:launchMode="singleInstance">
记住啦,有人设置为singleTask,也可以,但他们有一点区别。
同时记住要更新intent,这样getInstent才可以得到每次的新实例
@Override
protected void onNewIntent (Intent intent){
setIntent(intent);
}
在后台运行的Service,有时候也需要通知前台的Activity,向Activity发送一些数据。例如,当数据下载已经完成或者音乐播放结 束时,为了降低程序的耦合,使用Intent在Service和Activity之间通信是一个不错的方案。在Activity中注册一个 BroadcastReceiver,当Service有数据发送给Activity时,构建一个Intent并调用sendBroadcast()方法 将数据发送给Activity。
在chapter8_1的基础上做适当修改,使得音乐播放结束后,MainActivity可以收到来自MusicService的通知。首先,为 MediaPlayer注册一个OnCompletionListener,当音乐播放结束后,向MainActivity发送Intent。
- MediaPlayer.OnCompletionListener listener =
new MediaPlayer.OnCompletionListener() {
-
- public void onCompletion(MediaPlayer arg0) {
- //MusicService使用广播方式向MainActivity发送数据
- Intent intent = new Intent(MUSIC_COMPLETED);
- intent.putExtra("msg", getText(R.string.music_completed));
- sendBroadcast(intent);
- }
- };
接下来,要为MainActivity注册一个BroadcastReceiver,来监听来自MusicService的信息。当 MusicReceiver接收到来自MusicService的广播后,弹出一个Toast提示用户。MainActivity增加的代码如下所示:
- class MusicReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context arg0, Intent arg1) {
- String action = arg1.getAction();
- if (action.equals(MusicService.MUSIC_COMPLETED)) {
- //从MusicService接收广播消息,弹出Toast
- String msg = arg1.getStringExtra("msg");
- Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT)
- .show();
- }
- }
- }
- @Override
- protected void onPause() {
- //注销BroadcastReceiver
- unregisterReceiver(receiver);
- super.onPause();
- }
-
- @Override
- protected void onResume() {
- IntentFilter filter = new IntentFilter
(MusicService.MUSIC_COMPLETED);
- if (receiver == null)
- receiver = new MusicReceiver();
- //注册BroadcastReceiver
- registerReceiver(receiver, filter);
- super.onResume();
- }
如 果有多个Activity需要注册BroadcastReceiver来监听来自Service的消息该怎么办?一个一个注册,显然比较麻烦。可以通过定 义一个父Activity来注册BroadcastReceiver,其他的Activity继承这个父类,达到简化程序的目的。
分享到:
相关推荐
安卓开发观察者模式应用-一个service通知多个activity更新ui的实现, service与activity的交互: 1.接口回调 2.自定义广播 3.观察者模式
1、startService开启服务以后,与activity就没有关联,不受影响,独立运行,需要stopService关闭,否则Activity移除栈后将一直运行(kill杀不死). 2、bindService开启服务以后,与activity存在关联,退出activity时...
Android Service与Activity会话Demo(开发工具:Android Studio)
在android中Activity负责前台界面展示,service负责后台的需要长期运行的任务。下面这篇文章主要给大家介绍了关于Android中Service和Activity相互通信的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
本文实例讲述了Android中Service实时向Activity传递数据的方法。分享给大家供大家参考。具体如下: 这里演示一个案例,需求如下: 在Service组件中创建一个线程,该线程用来生产数值,每隔1秒数值自动加1,然后把...
本文实例讲述了Android实现Activity、Service与Broadcaster三大组件之间互相调用的方法。分享给大家供大家参考,具体如下: 我们研究两个问题, 1、Service如何通过Broadcaster更改activity的一个TextView。 (研究这...
本章内容服务(Service)是Android系统中4个应用程序组件之一(其他的组件详见3.2节的内容)。服务主要用于两个目的:后台运行和跨进程访问。通过启动一个服务,可以在不显示界面的前提下在后台运行指定的任务,这样...
service中开线程并结合广播实现动态更新activity主界面。有需要的可以下载下来看看,谢谢支持!!
Android 应用案例——备忘录,通过一个Android基础应用项目综合应用了Android中的各种组件,包括Activity、Service、Broadcast Receiver、ContentProvider、Intent和View的应用 第18章 Android应用案例——无线点餐...
本文实例讲述了Android判断Activity是否在最上层的方法。分享给大家供大家参考,具体如下: private boolean isTopActivity(Activity activity) { ActivityManager am = (ActivityManager)getSystemService...
按下电源键再次按下时弹出自定义界面。Activityservicereceiver.zip
3、Service和Activity之间通讯和UI更新 4、弹出消息通知(包括锁屏通知) 5、心跳检测和重连(保证websocket连接稳定性) 6、服务(Service)保活 聊天界面也比较完整,后台存活比较稳定,目前已在生产环境使用。...
Service和Activity通信的方法; 对“单纯计算”进行封装; 一个Activity对应的,按照硬件划分模块的,内部结构和外部关系的架构模式; 用阅读信息量衡量程序结构的复杂度; 双向绑定的应用场景 数据流图;
了解Service的原理和用途 掌握进程内服务的管理方法 掌握服务的隐式启动和显式启动方法 了解线程的启动、挂起和停止方法 了解跨线程的界面更新方法 掌握跨进程服务的绑定和调用方法 了解AIDL语言的用途和语法
Android高级应用源码-按下电源键,再次按下时,弹出自定义界面。Activity+service+receiver.zip
源码参考,欢迎下载
Server端将目前的下载进度,通过广播的方式发送出来,Client端注册此广播的监听器,当获取到该广播后,将广播中当前的下载进度解析出来并更新到界面上。 优缺点分析: 通过广播的方式实现Activity与Service的交互...
Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,只不过它没有UI界面,是在后台运行的组件。 二、Service的生命周期 Service对象不能自己启动,需要通过某个Activity、Service或者...
aidl双向通信,Service加回调刷新自身Activity
service组件跟activity组件及其类似,可以说service是没有界面的activity, 当然service的生命周期和activity还是有一定的差别的。 service组件一般用在什么地方的,上面讲了service组件没有界面,不用跟用户...