`
zhengjiong
  • 浏览: 71065 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

(转)Android Service 通知Activity更新界面的方法

阅读更多

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。

  1. MediaPlayer.OnCompletionListener listener =  new MediaPlayer.OnCompletionListener() {  
  2.  
  3. public void onCompletion(MediaPlayer arg0) {  
  4.     //MusicService使用广播方式向MainActivity发送数据  
  5.     Intent intent = new Intent(MUSIC_COMPLETED);  
  6.     intent.putExtra("msg", getText(R.string.music_completed));  
  7.     sendBroadcast(intent);  
  8.     }  
  9. }; 

接下来,要为MainActivity注册一个BroadcastReceiver,来监听来自MusicService的信息。当 MusicReceiver接收到来自MusicService的广播后,弹出一个Toast提示用户。MainActivity增加的代码如下所示:

  1. class MusicReceiver extends BroadcastReceiver {  
  2.     @Override  
  3.     public void onReceive(Context arg0, Intent arg1) {  
  4.         String action = arg1.getAction();  
  5.         if (action.equals(MusicService.MUSIC_COMPLETED)) {  
  6.             //从MusicService接收广播消息,弹出Toast  
  7.             String msg = arg1.getStringExtra("msg");  
  8.             Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT)  
  9.                     .show();  
  10.         }  
  11.     }  
  12. }  
  13. @Override  
  14. protected void onPause() {  
  15.     //注销BroadcastReceiver  
  16.     unregisterReceiver(receiver);  
  17.     super.onPause();  
  18. }  
  19.  
  20. @Override  
  21. protected void onResume() {  
  22.     IntentFilter filter = new IntentFilter (MusicService.MUSIC_COMPLETED);  
  23.     if (receiver == null)  
  24.         receiver = new MusicReceiver();  
  25.     //注册BroadcastReceiver  
  26.     registerReceiver(receiver, filter);  
  27.     super.onResume();  

如 果有多个Activity需要注册BroadcastReceiver来监听来自Service的消息该怎么办?一个一个注册,显然比较麻烦。可以通过定 义一个父Activity来注册BroadcastReceiver,其他的Activity继承这个父类,达到简化程序的目的。

分享到:
评论

相关推荐

    安卓开发观察者模式应用-一个service通知多个activity更新ui的实现

    在Android中,Service是后台运行的组件,而Activity是用户界面。Service与Activity之间的通信通常有以下三种方法: 1. **接口回调**:这是一种直接的通信方式,通过定义一个接口,Service在数据变化时调用接口的...

    android service 通过broadcast通知activity

    本主题将深入探讨如何使用Service以及BroadcastReceiver来实现特定的功能:当Service检测到某个函数的状态变化时,通过Broadcast发送通知,进而启动一个新的Activity。 首先,让我们了解`Service`。在Android中,...

    Android-Service与Activity传值

    `Service`用于在后台执行长时间运行的任务,而`Activity`则负责用户界面交互。在某些场景下,我们可能需要在`Service`和`Activity`之间传递数据,比如`Service`执行完一些操作后,将结果传递给`Activity`进行展示。...

    Android Service与Activity交互

    本示例"Android Service与Activity交互"旨在演示如何在Service启动后,通过线程进行异步操作,并在完成特定任务后,通过发送广播(Broadcast)通知Activity来更新用户界面。 首先,我们需要创建一个Service,通常在...

    android多个activity和一个service通信

    Activity代表用户界面,而Service则用于在后台执行长时间运行的任务,不直接与用户交互。在实际项目中,常常需要多个Activity与一个Service进行通信,比如本例中提到的“service在后台下载”场景。这种通信机制对于...

    Android notification+Service实时更新

    本项目"Android notification+Service实时更新"就是利用这些组件来构建一个功能,即在后台进行文件下载并实时更新用户通知栏的状态,当下载失败时允许用户重新尝试,下载成功后可自动安装。 首先,我们来看`...

    android Service 与Activity绑定

    在Android应用开发中,Service和Activity是两个非常重要的组件,它们各自承担着不同的职责。Service主要负责在后台长时间运行的任务,而Activity则专注于用户界面的交互。本篇将深入探讨Service与Activity之间的绑定...

    android service反馈到主线程更新界面

    在“android service反馈到主线程更新界面”这个主题中,我们主要探讨的是如何利用Service和Handler机制,实现在后台服务中执行任务,并将结果实时反馈到主线程以更新UI。 首先,Service的基本概念是:它是一个没有...

    Android Service下载,EventBus更新界面

    总之,Android Service和EventBus的结合使用为Android应用提供了强大的后台处理和界面更新能力。Service负责后台任务,EventBus则作为通信桥梁,使得数据在Service和界面之间传递变得更加简单和高效。在实际项目中,...

    Android Service无图标/界面独立运行

    1、startService开启服务以后,与activity就没有关联,不受影响,独立运行,需要stopService关闭,否则Activity移除栈后将一直运行(kill杀不死). 2、bindService开启服务以后,与activity存在关联,退出activity时...

    service后台运行实时更新activity

    在Android应用开发中,"Service后台运行实时更新Activity"是一个常见的需求,主要涉及到Service、Handler以及UI更新等关键概念。Service是Android系统的一种组件,它能够在后台长时间运行,即使用户离开了应用程序...

    Android Service与Activity会话Demo

    在Android应用开发中,Service和Activity是两个非常重要的组件,它们分别用于后台长时间运行的任务和服务交互。本示例"Android Service与Activity会话Demo"旨在教你如何在Android Studio中实现Service与Activity之间...

    Android service 传 activity

    在某些场景下,我们需要在Activity和Service之间进行数据交换,以便在前台的Activity更新用户界面或利用Service获取的数据来驱动应用逻辑。以下将详细阐述如何实现Android Service向Activity传递数据。 首先,让...

    Android Service和Activity基于串口蓝牙模块的双向通信

    Android Service和Activity基于串口蓝牙模块的双向通信 通过本帖,我们可以了解到如何使用 Android 的 Service 和 Activity 实现基于串口蓝牙模块的双向通信。这种通信方式可以用来控制家电、智能小车等设备。 ...

    Service向Activity传值(kotlin)

    Service用于在后台执行长时间运行的任务,而Activity则负责用户界面交互。在某些场景下,我们可能需要Service与Activity之间进行数据传递,例如本例中的“Service向Activity传值,实现Count累加的效果。定时传值”。...

    Service与多个Activity交互

    在Android应用开发中,Service是后台运行的一种组件,它可以长时间执行任务而不会受到用户界面的影响。Service主要用于处理那些不需要用户直接交互但是需要长时间运行的任务,比如播放音乐、网络通信等。Activity则...

    android两个Activity的转换

    在Android应用开发中,Activity是构成应用程序的基本组件,它代表用户界面的一个屏幕。"android两个Activity的转换"这个主题涉及到如何在不同的Activity之间导航,这是Android应用交互的基础。以下是关于这个主题的...

    android service 通过broadcast通知activity.zip

    // 处理接收到的数据并更新Activity界面 } } } ``` 4. **注意事项**: - 使用BroadcastReceiver时,确保广播的Action是唯一的,以避免与其他应用的广播冲突。 - 如果Service发送的广播可能在Activity未启动...

    Android开发-Activity与Service使用Messenger通信代码

    Activity负责用户界面的展示,而Service则用于在后台执行长时间运行的任务,不依赖用户界面。然而,在某些情况下,Activity需要与Service进行通信,例如更新UI或者传递数据。在这种场景下,Android提供了多种进程间...

    android中activity和service的交互

    在Android应用开发中,Activity和Service是两个非常重要的组件,它们各自承担着不同的职责。Activity作为用户界面的主要载体,负责与用户进行交互;而Service则是在后台运行,不与用户界面直接互动,常用于执行长...

Global site tag (gtag.js) - Google Analytics