Service与Activity之间的通信(同一进程)

一、当Acitivity和Service处于同一个Application和进程时,通过继承Binder类来实现。

当一个Activity绑定到一个Service上时,它负责维护Service实例的引用,允许你对正在运行的Service进行一些方法调用。比如你后台有一个播放背景音乐的Service,这时就可以用这种方式来进行通信。

代码如下:

/*************************Service代码****************************************
/public class LocalService extends Service {
private final IBinder binder = new LocalBinder();
public class LocalBinder extends Binder {
LocalService getService() {
return LocalService.this;
}
} public IBinder onBind(Intent intent) {
return binder;
}
}
/*****************************Activity代码*************************************/public class BindingActivity extends Activity {
LocalService localService;
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className,IBinder localBinder) { localService = (LocalBinder) localBinder.getService();
}
public void onServiceDisconnected(ComponentName arg0) {
localService = null;
}
};
protected void onStart() {
super.onStart();
Intent intent = new Intent(this, LocalService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
protected void onStop() {
super.onStop();
unbindService(mConnection);
}
public void printRandomNumber{
int num = localService.getRandomNumber();
System.out.println(num);
}
}

代码解释:

使用使用context.bindService()启动Service会经历:

context.bindService()->onCreate()->onBind()->Service running
onUnbind() -> onDestroy() ->Service stop

Activity能进行绑定得益于Service的接口onBind()。Service和Activity的连接可以用ServiceConnection来实现,需要实现一个新的ServiceConnection,重写onServiceConnected和onServiceDisconnected方法。执行绑定,调用bindService方法,传入一个选择了要绑定的Service的Intent(显式或隐式)和一个你实现了的ServiceConnection实例。一旦连接建立,你就能通Service的接口onBind()得到serviceBinder实例进而得到Service的实例引用。一旦Service对象找到,就能得到它的公共方法和属性。但这种方式,一定要在同一个进程和同一个Application里。

如何检验Activity和Service是否是在同一个进程中运行

一般情况下,Activity和Service在同一个包名内,并且没有设定属性android:process=":remote",两者在同一个进程中。

因为一个进程只有一个UI线程,所以两者就在同一个线程里。

如果设置android:process=":remote",就属于跨进程访问,就属于不同的进程了。

验证方法:

在Activiyt和Service的OnCreate中打印进程的信息

如Log.i("Tag",Thread.curentThread().getId());

(0)

相关推荐

  • Android实现从activity中停止Service的方法

    本文实例讲述了Android实现从activity中停止Service的方法.分享给大家供大家参考,具体如下: 1.在AndroidManifest.xml注册Service <service android:name=".service.SensorService" > <intent-filter> <action android:name="ITOP.MOBILE.SIMPLE.SERVICE.SENSORSERVICE"/>

  • Activity与Service之间交互并播放歌曲的实现代码

    Activity与Service之间交互并播放歌曲,为了方便,我把要播放的歌曲定死了,大家可以灵活改进 MService: 复制代码 代码如下: package com.tiantian.test;import android.app.Service;import android.content.Intent;import android.media.MediaPlayer;import android.os.Binder;import android.os.Environment;import

  • Android实现Activity、Service与Broadcaster三大组件之间互相调用的方法详解

    本文实例讲述了Android实现Activity.Service与Broadcaster三大组件之间互相调用的方法.分享给大家供大家参考,具体如下: 我们研究两个问题, 1.Service如何通过Broadcaster更改activity的一个TextView. (研究这个问题,考虑到Service从服务器端获得消息之后,将msg返回给activity) 2.Activity如何通过Binder调用Service的一个方法. (研究这个问题,考虑到与服务器端交互的动作,打包至Service,Ac

  • Android中Service实时向Activity传递数据实例分析

    本文实例讲述了Android中Service实时向Activity传递数据的方法.分享给大家供大家参考.具体如下: 这里演示一个案例,需求如下: 在Service组件中创建一个线程,该线程用来生产数值,每隔1秒数值自动加1,然后把更新后的数值在界面上实时显示. 步骤如下: 1.新建一个android项目工程,取名为demo. 2.新建一个Service类,用来实时生产数值,供界面实时显示. package com.ljq.activity; import android.app.Service;

  • android使用service和activity获取屏幕尺寸的方法

    本文实例讲述了android使用service和activity获取屏幕尺寸的方法.分享给大家供大家参考.具体实现方法如下: 1. activity: DisplayMetrics dm = new DisplayMetrics(); this.getWindowManager().getDefaultDisplay().getMetrics(dm); sW = dm.widthPixels; sH = dm.heightPixels; 2. service: DisplayMetrics dm

  • Service与Activity之间的通信(同一进程)

    一.当Acitivity和Service处于同一个Application和进程时,通过继承Binder类来实现. 当一个Activity绑定到一个Service上时,它负责维护Service实例的引用,允许你对正在运行的Service进行一些方法调用.比如你后台有一个播放背景音乐的Service,这时就可以用这种方式来进行通信. 代码如下: /*************************Service代码**************************************** /p

  • Android中Service与Activity之间通信的几种方式

    在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activity中启动后台Service,通过Intent来启动,Intent中我们可以传递数据给Service,而当我们Service执行某些操作之后想要更新UI线程,我们应该怎么做呢?接下来我就介绍两种方式来实现Service与Activity之间的通信问题 1.通过Binder对象 当Activity通

  • 详解Android Service与Activity之间通信的几种方式

    在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activity中启动后台Service,通过Intent来启动,Intent中我们可以传递数据给Service,而当我们Service执行某些操作之后想要更新UI线程,我们应该怎么做呢?接下来我就介绍两种方式来实现Service与Activity之间的通信问题 通过Binder对象 当Activity通过调

  • 详解Android activity与fragment之间的通信交互

    前言 纵观市场,大多数的APP都采用导航+fragment这种设计模式,如微信,QQ,京东,淘宝,究其原因:简洁. 在开发过程中不可避免的会出现fragment与fragment,fragment与activity之间的通信交互问题. 本章讲述如何实现fragment与activity之间的通信. 一.APP构成 MainActivity+底部导航栏: 二.通信目的 MainActivity中成员方法test(),fragment中经test()方法判断后,方可执行下一步操作,如执行界面跳转:

  • Android中Activity之间跳转和参数传递的实例

    一个activity就好比一个网页,此文章讲解怎样创建一个activity并且实现跳转! 一.学习创建Activity 1.新建一个java类,右击src目录,选择new-->class,新的activity需要继承Activity类 2.需要复写onCreate() 例子: package com.example.testsend; import android.app.Activity; import android.os.Bundle; public class MainActivity2

  • Android中Service和Activity相互通信示例代码

    前言 在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,本文就给大家详细介绍了关于Android中Service和Activity相互通信的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. Activity向Service通信 第一种方式:通过MyBinder方式调用Service方法 MainActivity public class Ma

  • Android实现Activity之间通信的方法

    本文实例讲述了Android实现Activity之间通信的方法.分享给大家供大家参考.具体如下: 在一个Activity中可以使用系统提供的startActivity(Intent intent)方法打开新的Activity,在打开新的Activity前,你可以决定是否为新的Activity传递参数. 第一种:打开新的Activity,不传递参数 public class MainActivity extends Activity { @Override public void onCreate

  • Android Fragment与Activity之间的相互通信实例代码

    Android Fragment与Activity之间的相互通信 前言 自从Android3.0引入Fragment之后,主要是为了支持动态灵活的界面设计和屏幕的适配问题.Fragmenty不能单独存在,必须依赖Activity作为视图展示的一部分,同事它具有自己的生命周期,接收它自己的事件,具有更加灵活的特性,如今Fragment已经被广泛的应用到App开发中,最常见的就是单Activity多Fragment的模式.Fragment依赖于Activity而存在,就不可避免需要与Activity

  • c# 如何实现不同进程之间的通信

    进程之间的通信是为了解决不同进程之间的数据传输问题,这样可以让不同程序交互数据.实现进程通信的方式:1.剪切板:2.COM:3.内存映射文件:4.WCF 1.剪切板Clipboard在进程间传送对象 剪切板是一个供应用程序使用的公有区域.在.NET中定一个了一个DataFormats类,此类包含一些静态字段,定义了剪切板中可以存放的数据类型.使用Clipboard类可以向剪切板中放入数据. 如将文字放入剪切板,使用方法SetDataObject即可:Clipboard.SetDataObject

  • Android中使用开源框架eventbus3.0实现fragment之间的通信交互

    1.概述 在之前的博文中简单介绍过如何实现fragment之间的信息交互:<Android中Fragment与Activity之间的交互(两种实现方式)>,今天继续给大家介绍一种可以实现此效果的另外一种方式EventBus.(相比于handler,接口回调,bundle传参,这个简单好用到哭) EventBus是Android下高效的发布/订阅事件的消息总线.作用是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment.Activity.Service.线程

随机推荐