Android中有时候需要在Service中改变Activity的UI,或者在Activity中修改Service中的数值。首先必须使用与Activity绑定的Service,有三种方式可以实现。第一,是使用接口回调的方式在Activty中实现Service中的接口;第二,使用广播的方式传递;第三,则是用观察者模式,在Activity中实现update方法。

使用接口回调的方式在Activty中实现Service中的接口

package com.kkrs.serivce;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log; /**
* Created by zd on 2018/12/20.
*/ //绑定的service
public class LocalService extends Service { private final static String TAG = "LocalService";
private int count;
private boolean quit;
private Thread thread;
private LocalBinder binder = new LocalBinder(); /**
* 回调
*/
private Callback callback; /**
* 提供接口回调方法
* @param callback
*/
public void setCallback(Callback callback) {
this.callback = callback;
} /**
* 回调接口
*
* @author lenovo
*
*/
public static interface Callback {
/**
* 得到实时更新的数据
*
* @return
*/
void getNum(int num);
} @Override
public void onCreate() {
super.onCreate();
Log.e(TAG, "Service is invoke Created");
thread = new Thread(new Runnable() {
@Override
public void run() {
// 每间隔一秒count加1 ,直到quit为true。
while (!quit) {
try {
Thread.sleep(1000); if(callback!=null){
/*
* 得到最新数据
*/
callback.getNum(count);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
}
}
});
thread.start();
} public class LocalBinder extends Binder {
// 声明一个方法,getService。(提供给客户端调用)
LocalService getService() {
// 返回当前对象LocalService,这样我们就可在客户端端调用Service的公共方法了
return LocalService.this;
}
} /**
* 公共方法
* @return
*/
public int getCount(){
return count;
} @Override
public void onDestroy() {
Log.e(TAG, "Service is onDestroy"); this.quit = true;
super.onDestroy();
} @Override
public boolean onUnbind(Intent intent) {
Log.e(TAG, "Service is onUnbind");
return super.onUnbind(intent);
} @Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG, "Service is onBind"); return binder;
}
}

  

   private ServiceConnection conn;
private LocalService mService;
@Override
protected void onCreate(Bundle savedInstanceState) { conn = new ServiceConnection() {
/**
* 与服务器端交互的接口方法 绑定服务的时候被回调,在这个方法获取绑定Service传递过来的IBinder对象,
* 通过这个IBinder对象,实现宿主和Service的交互。
*/
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e("MainActivity", "绑定成功调用:onServiceConnected");
// 获取Binder
LocalService.LocalBinder binder = (LocalService.LocalBinder) service;
mService = binder.getService();
mService.setCallback(new LocalService.Callback(){ @Override
public void getNum(int num) {
// TODO Auto-generated method stub
Log.e("num","====num===="+num);
}
});
}
/**
* 当取消绑定的时候被回调。但正常情况下是不被调用的,它的调用时机是当Service服务被意外销毁时,
* 例如内存的资源不足时这个方法才被自动调用。
*/
@Override
public void onServiceDisconnected(ComponentName name) {
mService=null;
}
}; final Intent intent = new Intent(this, LocalService.class); btnBind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.e("MainActivity", "绑定调用:bindService"); bindService(intent, conn, Service.BIND_AUTO_CREATE); }
}); btnUnBind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 解除绑定
Log.e("MainActivity", "解除绑定:bindService"); if(mService!=null) {
Log.e("MainActivity", "mService!=null");
mService = null;
unbindService(conn);
}
}
}); btnGetDatas.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mService != null) {
// 通过绑定服务传递的Binder对象,获取Service暴露出来的数据
Log.e("MainActivity", "从服务端获取数据:" + mService.getCount());
} else { Log.e("MainActivity", "还没绑定呢,先绑定,无法从服务端获取数据");
}
}
}); }

  使用广播的方式传递

package com.kkrs.serivce;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log; import static android.content.ContentValues.TAG; /**
* Created by zd on 2018/12/25.
*/ public class ContentService extends Service { private Thread thread; private boolean flag = true; @Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
flag = true;
return new LocalBinder();
} @Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Log.e(TAG, "Service is invoke Created");
thread = new Thread(new Runnable() {
@Override
public void run() {
// 每间隔一秒count加1 ,直到quit为true。
while (flag) {
try {
Thread.sleep(1000);
asyncSendPerson("ContentService"); } catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.start(); } public final class LocalBinder extends Binder {
public ContentService getService() {
return ContentService.this;
}
} public void asyncSendPerson(final String name) {
// 休息5秒,模拟异步任务
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//可以在子线程中直接发送广播
sendContentBroadcast(name);
}
}).start();
} /**
* 发送广播
* @param name
*/
protected void sendContentBroadcast(String name) {
// TODO Auto-generated method stub
Intent intent=new Intent();
intent.setAction("com.example.servicecallback.content");
intent.putExtra("name", name);
sendBroadcast(intent);
} }

  

 //广播

    private ServiceReConn connRe;
private ContentReceiver mReceiver; public class ServiceReConn implements ServiceConnection { @Override
public void onServiceConnected(ComponentName name, IBinder binder) {
// service = ((LocalBinder) binder).getService();
} @Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
// service = null;
}
} public class ContentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String name = intent.getStringExtra("name");
Person person = new Person();
person.setName(name);
Log.e("ContentReceiver",person.toString());
}
} /**
* 注册广播接收者
*/
private void doRegisterReceiver() {
mReceiver=new ContentReceiver();
IntentFilter filter = new IntentFilter(
"com.example.servicecallback.content");
registerReceiver(mReceiver, filter);
}

  观察者模式

public class ObserviceService extends Service {
//被观察者
private MyObservable mObservable;
private Thread thread;
private boolean flag = true; @Override
public IBinder onBind(Intent arg0) {
flag = true;
return new LocalBinder();
} @Override
public void onCreate() {
super.onCreate();
mObservable = new MyObservable();
thread = new Thread(new Runnable() {
@Override
public void run() {
// 每间隔一秒count加1 ,直到quit为true。
while (true) {
try {
Thread.sleep(1000);
asyncSendPerson("ObserviceService");
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
});
thread.start();
} public final class LocalBinder extends Binder {
public ObserviceService getService() {
return ObserviceService.this;
}
} public void asyncSendPerson(final String name) {
// 休息5秒,模拟异步任务
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendMessage(handler.obtainMessage(0, name));
}
}).start();
} /**
* 添加观察者
* @param observer
*/
public void addObserver(Observer observer) {
mObservable.addObserver(observer);
} private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
String name = (String) msg.obj;
Person person = new Person();
person.setName(name);
//通知更新
mObservable.notifyChanged(person);
}
}; public class MyObservable extends Observable { public void notifyChanged(Object object) {
this.setChanged();
this.notifyObservers(object);
}
} @Override
public boolean onUnbind(Intent intent) {
flag = false;
return super.onUnbind(intent);
} @Override
public void onDestroy() {
super.onDestroy();
flag = false;
}
}

 实现Observer

private ServiceConnection conn;
private LocalService mService; //观察这模式
private MyServiceConn connOb;
private ObserviceService observiceService;
public class MyServiceConn implements ServiceConnection { @Override
public void onServiceConnected(ComponentName name, IBinder binder) {
observiceService = ((ObserviceService.LocalBinder) binder).getService();
//将当前activity添加为观察者
observiceService.addObserver(MainActivity.this);
} @Override
public void onServiceDisconnected(ComponentName name) {
observiceService = null;
}
} @Override
public void update(Observable observable, Object o) {
Log.e("update","观察这模式在这里修改UI");
Person person = (Person) o;
Log.e("update",person.toString());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = this;
setContentView(R.layout.activity_main);
btnBindOb = (Button)findViewById(R.id.btnBindOb);
btnUnBindOb = (Button)findViewById(R.id.btnUnBindOb); final Intent obIntent = new Intent(context, ObserviceService.class);
connOb = new MyServiceConn();
btnBindOb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
bindService(obIntent, connOb, Service.BIND_AUTO_CREATE); }
}); btnUnBindOb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(observiceService!=null) {
Log.e("MainActivity", "observiceService!=null");
observiceService = null;
unbindService(connOb);
}
}
}); }

  

Android Service与Activity的交互的更多相关文章

  1. Android—Service与Activity的交互

    service-Android的四大组件之一.人称"后台服务"指其本身的运行并不依赖于用户可视的UI界面 实际开发中我们经常需要service和activity之间可以相互传递数据 ...

  2. Android Service 通知Activity更新界面的方法研究

    Android Service 通知Activity更新界面的方法研究   Android的最重要的组件式service和activity,那么在使用的过程中,我们最常遇到的问题是他们之间的通信问题. ...

  3. Android Service与Activity之间通信的几种方式

    在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activ ...

  4. Android:Service通知Activity更新界面

    Android有四大组件,其中包括service和activity,那么在使用的过程中,我们最常遇到的问题是他们之间的通信问题. 1.首先Activity调用Service 这个是比较基础的,它有两种 ...

  5. Android Service与Activity之间通信

    主要分为: 通过Binder对象 通过broadcast(广播)的形式 Activity调用bindService (Intent service, ServiceConnection conn, i ...

  6. Android Fragment和Activity的交互介绍

    Fragment和Activity的交互 一个Fragment的实例总是和包括它的Activity直接相关. fragment能够通过getActivity() 方法来获得Activity的实例.然后 ...

  7. android service和activity的通讯

    我们须要用下面方式来启动service: </pre><pre name="code" class="java"><span st ...

  8. Service 启动Activity

    1, 在BroadcastReceiver中启动Activity的问题  *  * 如果在BroadcastReceiver的onReceive()方法中如下启动一个Activity  * Inten ...

  9. android开发之使用Messenger实现service与activity交互

    service与activity交互的方式有多种,这里说说使用Messenger来实现两者之间的交互. Service程序 public class MessengerService extends ...

随机推荐

  1. 原生aspx页面如何引用公共js和css

    项目过程中遇到一个问题,每个页面需要引用很多的js和css文件,其中很多都是控件,而且大部分都是一样的,造成很多重复引用. 针对这种情况,参考了mvc的BundleConfig,思路是建立一个公用的用 ...

  2. 关于内核转储(core dump)的设置方法

    原作者:http://blog.csdn.net/wj_j2ee/article/details/7161586 1. 内核转储作用 (1) 内核转储的最大好处是能够保存问题发生时的状态. (2) 只 ...

  3. Spring Cloud Eureka Server高可用注册服务中心的配置

    前言 Eureka 作为一个云端负载均衡,本身是一个基于REST的服务,在 Spring Cloud 中用于发现和注册服务. 那么当成千上万个微服务注册到Eureka Server中的时候,Eurek ...

  4. Java 8 基础API的一些小的该进

    Java8是一个较大改变的版本,包含了API和库方面的修正,它还对我们常用的API进行很多微小的调整, 下面我会带你了解字符串.集合.注解等新方法. 字符串 经常会遇到这样一种情况, 需要将一组字符串 ...

  5. 深入NGINX:nginx高性能的实现原理

    深入NGINX:我们如何设计它的性能和扩展性 来源: cnBeta  原文链接 英文原文:Inside NGINX: How We Designed for Performance & Sca ...

  6. 前端为什么非要动静分离 说一下CDN托管的意义

    大型Web应用对速度的追求并没有止步于仅仅利用浏览器缓存,因为浏览器缓存始终只是为了提升二次访问的速度,对于首次访问的加速,我们需要从网络层面进行优化,最常见的手段就是CDN(Content Deli ...

  7. DOS系统常用命令

    前言: DOS命令是DOS操作系统使用的命令.DOS操作系统是一种磁盘操作系统,从Windows95.98到今天的Windows10都内置有DOS操作系统.可以通过"win+R", ...

  8. PHP异步请求

    正常情况下,PHP都是同步请求,脚本右上而下依次执行,必须等上一步请求好了,才能进行下一步操作,这种效率在某些时候是不必要的,如发送邮件等操作,是可以异步处理的. PHP异步也很不少插件,我们使用的是 ...

  9. c#Socket客户端和服务端的信息发送

    这是我制作的界面信息,c# Socket通信的简单使用,刚开始学习,不对的地方请大家指教,目前是可以运行的,之后自己在慢慢添加新的东西.同时了解Tcp协议的三次握手.希望对跟我一样的初学者有所帮助. ...

  10. 3. Java面向对象之泛型-指定多个泛型

    3. Java面向对象之泛型-指定多个泛型 package generic; class MutiGeneric<K, T> { private K key; private T take ...