在Android中,我们通常需要Activity跟Service进行通讯,很多人只知道Activity掉用Service,却不知道Service如何将数据返回给Activity。其实Service返回数据给Activity有很多种方法,1、广播。2、回调。3、Activity每隔几秒去取Service的方法等等。现在我们只讨论第二种方法。回调。举个例子,我们Activity里面有两个参数a 和b,这时需要计算a和b的和,但是不能在Activity里面计算。需要在Service里面去计算。这时计算完之后,通过Service的回调,将结果返回给Activity。废话不多说,直接上代码:

我们先定义一个Service,命名为MyService。首先在MyService里面定义一个计算返回的接口。当也可以在外面定义。

public interface OnAddCalculateListener{
void onAddResultCallback(int value);
}
然后写两个公开的方法,一个是注册,一个是反注册。如下
public void registenerOnAddCalculateListener(OnAddCalculateListener onAddCalculateListener){
this.onAddCalculateListener=onAddCalculateListener;
}
public void unregistenerOnAddCalculateListener(){
this.onAddCalculateListener = null;
}
然后写计算方法,计算结束之后,通过回调的接口,把值回调。这时候,如果有其他地方注册了OnAddCalculateListener 这个回调监听,便可以收到计算的结果。
public void startAddCalculate(int a,int b){
if(onAddCalculateListener != null){
int value = a + b;
onAddCalculateListener.onAddResultCallback(value);
}
}
然后我们看到Activity,我们先绑定MyService。
Intent intent = new Intent(this,MyService.class);
bindService(intent,conn, Context.BIND_AUTO_CREATE);
然后创建一个conn。这时如果绑定成功后,会回调onServiceConnected方法。
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
myService = ((MyService.MyBinder) iBinder).getMyService();
myService.registenerOnAddCalculateListener(onAddCalculateListener);
} @Override
public void onServiceDisconnected(ComponentName componentName) { }
};
此时我们就可以取到MyService的实例,并且开始注册计算方法返回的回调。
private OnAddCalculateListener onAddCalculateListener = new OnAddCalculateListener(){
@Override
public void onAddResultCallback(int value) {
mTextView.setText(Integer.toString(value));
}
};
此时,如果有回调。便直接显示在TextView上面。
以下是MainActivity.java的代码:
package com.example.admin.myapplication;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; import com.example.admin.myapplication.MyService.OnAddCalculateListener; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button mButton;
private TextView mTextView;
private MyService myService =null;
private int a = 100;
private int b = 30; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this,MyService.class);
bindService(intent,conn, Context.BIND_AUTO_CREATE);
mButton = (Button) findViewById(R.id.btn);
mTextView = (TextView) findViewById(R.id.text_view);
mButton.setOnClickListener(this);
}
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
myService = ((MyService.MyBinder) iBinder).getMyService();
myService.registenerOnAddCalculateListener(onAddCalculateListener);
} @Override
public void onServiceDisconnected(ComponentName componentName) { }
};
private OnAddCalculateListener onAddCalculateListener = new OnAddCalculateListener(){
@Override
public void onAddResultCallback(int value) {
mTextView.setText(Integer.toString(value));
}
}; @Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn:
if(myService != null){
myService.startAddCalculate(a,b);
}
break;
}
} @Override
protected void onDestroy() {
super.onDestroy();
if(myService != null){
myService.unregistenerOnAddCalculateListener();
}
}
} 下面是MyService.java的代码:
package com.example.admin.myapplication;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder; public class MyService extends Service { private OnAddCalculateListener onAddCalculateListener; @Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return new MyBinder();
} public class MyBinder extends Binder{
public MyService getMyService(){
return MyService.this;
}
} public void startAddCalculate(int a,int b){
if(onAddCalculateListener != null){
int value = a + b;
onAddCalculateListener.onAddResultCallback(value);
}
} public interface OnAddCalculateListener{
void onAddResultCallback(int value);
} public void registenerOnAddCalculateListener(OnAddCalculateListener onAddCalculateListener){
this.onAddCalculateListener=onAddCalculateListener;
}
public void unregistenerOnAddCalculateListener(){
this.onAddCalculateListener = null;
}
}
												

Android中Activity和Service的数据通讯的更多相关文章

  1. Android中Activity、Service和线程之间的通信

    Activity.Service和线程应该是Android编程中最常见的几种类了,几乎大多数应用程序都会涉及到这几个类的编程,自然而然的,也就会涉及到三者之间的相互通信,本文就试图简单地介绍一下这三者 ...

  2. android中activity向service中传值

    和activity中互相传值类似 在activity中 Intent regIntent = new Intent(this, ChatService.class);  regIntent.putEx ...

  3. android中activity和service是否在同一个进程中

    分两种情况,如果是本地线程,肯定是同一个进程中的, 如果是远程服务,那么activity和service将在不同的进程中的 ----- 非远程服务,和Activity属于同一个进程和线程:而远程服务和 ...

  4. Android中Activity启动模式详解

    在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...

  5. Android进阶笔记08:Android 中Activity、Window和View之间的关系

    1. Android 中Activity.Window和View之间的关系(比喻): Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图) LayoutI ...

  6. android中activity.this跟getApplicationContext的区别

    转载: http://www.myexception.cn/android/1968332.html android中activity.this和getApplicationContext的区别 在a ...

  7. android中通过intent传递复杂数据

    android中在各个service或者acitivity之间可以通过Intent来传递一些数据,intent原生直接提供了一些简单数据类型的数据的传递,使用起来也很方便,比如int boolean ...

  8. Android中Activity的四种启动方式

    谈到Activity的启动方式必须要说的是数据结构中的栈.栈是一种只能从一端进入存储数据的线性表,它以先进后出的原则存储数据,先进入的数据压入栈底,后进入的数据在栈顶.需要读取数据的时候就需要从顶部开 ...

  9. Android中使用File文件进行数据存储

    Android中使用File文件进行数据存储 上一篇学到使用SharedPerences进行数据存储,接下来学习一下使用File进行存储 我们有时候可以将数据直接以文件的形式保存在设备中, 例如:文本 ...

随机推荐

  1. 【原】关于定时回查出现的BUG有感

    前言:今天有同事反映说客户在平台投标后,看到的是失败状态,但是钱在某银行的状态是被冻结了,我这边给出答复是只有投标成功才会冻结. 首先写下流程:P2P对接某银行托管,某银行的部分接口要求我们通过同步回 ...

  2. iBatis基础知识

    iBatis简介: 特点:结构性好,小巧,容易上手 搭建环境: 1.创建java 项目 2.导入(3个)jar包:ibatis-2.3.0.667.jar,mysql驱动包,Junit测试包 3.配置 ...

  3. 爬数据,能让你少写1000行代码的捷径! | Python 正则表达式

    ▌春暖花开,又到了出门游玩拍拍拍吃吃吃的好季节了! 说到拍照摄影,你会构图吗?就是在照片有限的空间内处理人.景.物的关系,并将三者安排在画面中最佳的位置,以形成画面特定结构的方法. 学院君就是一个「拍 ...

  4. 【转载】Spark运行架构

    1. Spark运行架构 1.1 术语定义 lApplication:Spark Application的概念和Hadoop MapReduce中的类似,指的是用户编写的Spark应用程序,包含了一个 ...

  5. 【BZOJ2959】长跑(Link-Cut Tree,并查集)

    [BZOJ2959]长跑(Link-Cut Tree,并查集) 题面 BZOJ 题解 如果保证不出现环的话 妥妥的\(LCT\)傻逼题 现在可能会出现环 环有什么影响? 那就可以沿着环把所有点全部走一 ...

  6. [Luogu2852][USACO06DEC]牛奶模式Milk Patterns

    Luogu 一句话题意 给出一个串,求至少出现了\(K\)次的子串的最长长度. sol 对这个串求后缀数组. 二分最长长度. 如果有\(K\)个不同后缀他们两两的\(lcp\)都\(>=mid\ ...

  7. [Luogu3527][POI2011]MET-Meteors

    BZOJ权限题!提供洛谷链接! sol 昨晚突发奇想去学了一下整体二分. 这道题应该算是整体二分的板子题吧. 整体二分 首先要求可离线,不然还是安心码数据结构吧. 整体二分简单的来讲,就是时间复杂度可 ...

  8. [BZOJ2002] [Hnoi2010] Bounce 弹飞绵羊 (LCT)

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...

  9. Idea工具开发 SpringBoot整合JSP(毕设亲测可用)

    因为,临近毕业了,自己虽然也学了很多框架.但是,都是在别人搭建好的基础上进行项目开发.但是springboot的官方文档上明确指出不提倡使用jsp进行前端开发,但是在校期间只学了jsp作为前端页面.所 ...

  10. ccd采集