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继承这个父类,达到简化程序的目的。
分享到:
相关推荐
在Android中,Service是后台运行的组件,而Activity是用户界面。Service与Activity之间的通信通常有以下三种方法: 1. **接口回调**:这是一种直接的通信方式,通过定义一个接口,Service在数据变化时调用接口的...
本主题将深入探讨如何使用Service以及BroadcastReceiver来实现特定的功能:当Service检测到某个函数的状态变化时,通过Broadcast发送通知,进而启动一个新的Activity。 首先,让我们了解`Service`。在Android中,...
`Service`用于在后台执行长时间运行的任务,而`Activity`则负责用户界面交互。在某些场景下,我们可能需要在`Service`和`Activity`之间传递数据,比如`Service`执行完一些操作后,将结果传递给`Activity`进行展示。...
本示例"Android Service与Activity交互"旨在演示如何在Service启动后,通过线程进行异步操作,并在完成特定任务后,通过发送广播(Broadcast)通知Activity来更新用户界面。 首先,我们需要创建一个Service,通常在...
Activity代表用户界面,而Service则用于在后台执行长时间运行的任务,不直接与用户交互。在实际项目中,常常需要多个Activity与一个Service进行通信,比如本例中提到的“service在后台下载”场景。这种通信机制对于...
本项目"Android notification+Service实时更新"就是利用这些组件来构建一个功能,即在后台进行文件下载并实时更新用户通知栏的状态,当下载失败时允许用户重新尝试,下载成功后可自动安装。 首先,我们来看`...
在Android应用开发中,Service和Activity是两个非常重要的组件,它们各自承担着不同的职责。Service主要负责在后台长时间运行的任务,而Activity则专注于用户界面的交互。本篇将深入探讨Service与Activity之间的绑定...
1、startService开启服务以后,与activity就没有关联,不受影响,独立运行,需要stopService关闭,否则Activity移除栈后将一直运行(kill杀不死). 2、bindService开启服务以后,与activity存在关联,退出activity时...
在“android service反馈到主线程更新界面”这个主题中,我们主要探讨的是如何利用Service和Handler机制,实现在后台服务中执行任务,并将结果实时反馈到主线程以更新UI。 首先,Service的基本概念是:它是一个没有...
总之,Android Service和EventBus的结合使用为Android应用提供了强大的后台处理和界面更新能力。Service负责后台任务,EventBus则作为通信桥梁,使得数据在Service和界面之间传递变得更加简单和高效。在实际项目中,...
在Android应用开发中,"Service后台运行实时更新Activity"是一个常见的需求,主要涉及到Service、Handler以及UI更新等关键概念。Service是Android系统的一种组件,它能够在后台长时间运行,即使用户离开了应用程序...
在Android应用开发中,Service和Activity是两个非常重要的组件,它们分别用于后台长时间运行的任务和服务交互。本示例"Android Service与Activity会话Demo"旨在教你如何在Android Studio中实现Service与Activity之间...
在某些场景下,我们需要在Activity和Service之间进行数据交换,以便在前台的Activity更新用户界面或利用Service获取的数据来驱动应用逻辑。以下将详细阐述如何实现Android Service向Activity传递数据。 首先,让...
Android Service和Activity基于串口蓝牙模块的双向通信 通过本帖,我们可以了解到如何使用 Android 的 Service 和 Activity 实现基于串口蓝牙模块的双向通信。这种通信方式可以用来控制家电、智能小车等设备。 ...
Service用于在后台执行长时间运行的任务,而Activity则负责用户界面交互。在某些场景下,我们可能需要Service与Activity之间进行数据传递,例如本例中的“Service向Activity传值,实现Count累加的效果。定时传值”。...
在Android应用开发中,Service是后台运行的一种组件,它可以长时间执行任务而不会受到用户界面的影响。Service主要用于处理那些不需要用户直接交互但是需要长时间运行的任务,比如播放音乐、网络通信等。Activity则...
在Android应用开发中,Activity是构成应用程序的基本组件,它代表用户界面的一个屏幕。"android两个Activity的转换"这个主题涉及到如何在不同的Activity之间导航,这是Android应用交互的基础。以下是关于这个主题的...
// 处理接收到的数据并更新Activity界面 } } } ``` 4. **注意事项**: - 使用BroadcastReceiver时,确保广播的Action是唯一的,以避免与其他应用的广播冲突。 - 如果Service发送的广播可能在Activity未启动...
Activity负责用户界面的展示,而Service则用于在后台执行长时间运行的任务,不依赖用户界面。然而,在某些情况下,Activity需要与Service进行通信,例如更新UI或者传递数据。在这种场景下,Android提供了多种进程间...
在Android应用开发中,Activity和Service是两个非常重要的组件,它们各自承担着不同的职责。Activity作为用户界面的主要载体,负责与用户进行交互;而Service则是在后台运行,不与用户界面直接互动,常用于执行长...