一、启动Service并传递参数

传递参数时只需在startService启动的Intent中传入数据便可,接收参数时可在onStartCommand函数中通过读取第一个参数Intent的内容来实现

1.MainActivity.java

package com.example.shiyanshi.serviceconnected;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText; public class MainActivity extends Activity implements View.OnClickListener {
private EditText editText; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); editText= (EditText) findViewById(R.id.editText);
findViewById(R.id.btnStartService).setOnClickListener(this);
findViewById(R.id.btnStopService).setOnClickListener(this);
} @Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btnStartService:

Intent intent=new Intent(MainActivity.this,MyService.class);
intent.putExtra("data",editText.getText().toString());
startService(intent);

                break;
case R.id.btnStopService:
stopService(new Intent(MainActivity.this,MyService.class));
} }
}

2.MyService.java

package com.example.shiyanshi.serviceconnected;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder; public class MyService extends Service {
private String data;
private boolean flag; public MyService() {
} @Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
} @Override
public int

onStartCommand

(Intent intent, int flags, int startId) {

data=intent.getStringExtra("data");

        return super.onStartCommand(intent, flags, startId);
} @Override
public void onCreate() {
super.onCreate();
flag=true;
new Thread() {
@Override
public void run() {
super.run();
while (flag) {
System.out.println(data);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
} @Override
public void onDestroy() {
super.onDestroy();
flag=false;
}
}

3.布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <EditText android:text="@string/hello_world" android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/editText"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动服务"
android:id="@+id/btnStartService" /> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止服务"
android:id="@+id/btnStopService" /> </LinearLayout>

二、绑定Service进行通信

(1)Activity向Service传递消息

绑定服务后,Activity和Service之间可以通过android.os.Binder进行通信,当绑定服务时首先调用onCreate函数,然后调用Service类的onBind函数返回一个Binder,之后会调用Activity类中实现的onServiceConnected函数,该函数的第二个参数IBinder iBinder是Service类中onBind方法的返回值,通过这个Binder二者便可以成功通信。

1.MainActivity.java

package com.example.shiyanshi.serviceconnected;

import android.app.Activity;
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.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText; public class MainActivity extends Activity implements View.OnClickListener, ServiceConnection {
private EditText editText;
private MyService.Binder binder=null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); editText= (EditText) findViewById(R.id.editText);
findViewById(R.id.btnStartService).setOnClickListener(this);
findViewById(R.id.btnStopService).setOnClickListener(this);

findViewById(R.id.btnBindService).setOnClickListener(this);
findViewById(R.id.btnUnbindService).setOnClickListener(this);
findViewById(R.id.btnSyncData).setOnClickListener(this);

    }

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId(); //noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
} return super.onOptionsItemSelected(item);
} @Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btnStartService:
Intent intent=new Intent(MainActivity.this,MyService.class);
intent.putExtra("data",editText.getText().toString());
startService(intent);
break;
case R.id.btnStopService:
stopService(new Intent(MainActivity.this, MyService.class));
break;

case R.id.btnBindService:
bindService(new Intent(MainActivity.this, MyService.class), this, Context.BIND_AUTO_CREATE);
break;
case R.id.btnUnbindService:
unbindService(this);
break;
case R.id.btnSyncData:
if(binder!=null){
System.out.println("bind in not null");
binder.setData(editText.getText().toString()); //调用Bind中实现的数据交互方法
}
break;

        }

    }

    @Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
System.out.println("*****Connected Successful*******");

binder= (MyService.Binder) iBinder;

    }

    @Override
public void onServiceDisconnected(ComponentName componentName) {
System.out.println("*****Disconnected Successful*******"); }
}

2.MyService.java

package com.example.shiyanshi.serviceconnected;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder; public class MyService extends Service {
private String data="default info";
private boolean flag; public MyService() {
} @Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
// throw new UnsupportedOperationException("Not yet implemented");

return new Binder(); //返回值会传给onServiceConnected函数的第二个参数IBinder

    }   
    //该类是Activity和Service进行交互数据的接口

public class Binder extends android.os.Binder{
public void setData(String data) {
MyService.this.data=data;
}

    }

    @Override
public int onStartCommand(Intent intent, int flags, int startId) { data=intent.getStringExtra("data");
return super.onStartCommand(intent, flags, startId);
} @Override
public void onCreate() {
super.onCreate();
System.out.println("*******onCreate********");
flag=true;
new Thread() {
@Override
public void run() {
super.run();
while (flag) {
System.out.println(data);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
} @Override
public void onDestroy() {
super.onDestroy();
System.out.println("******onDestroy******");
flag=false;
}
}

(2)Service向Activity传递消息,并将传递的数据显示到Activity中

主要通过在Service中设定一个回调函数的接口,并定义一个该接口的引用,该引用的实例化是在Activity中进行的,实例化的同时会重写该接口中定义的回调函数,让该回调函数发送一个消息,并且在消息处理器(Handler)中进行更新UI线程的内容;此外在新开的Thread线程中调用该回调函数进行更新数据。

1.MainActivity.java

package com.example.shiyanshi.serviceconnected;

import android.app.Activity;
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.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView; import org.w3c.dom.Text; import java.util.logging.Handler; public class MainActivity extends Activity implements View.OnClickListener, ServiceConnection {
private EditText editText;
private MyService.Binder binder=null;
private TextView tvOut; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); editText= (EditText) findViewById(R.id.editText);
tvOut=(TextView)findViewById(R.id.tvOut); findViewById(R.id.btnStartService).setOnClickListener(this);
findViewById(R.id.btnStopService).setOnClickListener(this);
findViewById(R.id.btnBindService).setOnClickListener(this);
findViewById(R.id.btnUnbindService).setOnClickListener(this);
findViewById(R.id.btnSyncData).setOnClickListener(this); } @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId(); //noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
} return super.onOptionsItemSelected(item);
} @Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btnStartService:
Intent intent=new Intent(MainActivity.this,MyService.class);
intent.putExtra("data",editText.getText().toString());
startService(intent);
break;
case R.id.btnStopService:
stopService(new Intent(MainActivity.this, MyService.class));
break;
case R.id.btnBindService:
bindService(new Intent(MainActivity.this, MyService.class), this, Context.BIND_AUTO_CREATE);
break;
case R.id.btnUnbindService:
unbindService(this);
break;
case R.id.btnSyncData:
if(binder!=null){
System.out.println("bind in not null");
binder.setData(editText.getText().toString());
}
break;
} } @Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
System.out.println("*****Connected Successful*******");
binder= (MyService.Binder) iBinder;

//设置回调函数,在回调函数中通过发送消息和消息处理器进行修改UI线程要显示的内容
binder.getService().setCallback(new MyService.Callback() {
@Override
public void onDataChange(String data) {
//tvOut.setText(data); 这里不可以直接设置,因为由新创建的线程去调用这个函数,不允许直接修改UI线程的内容
Message msg=new Message();
Bundle bundle=new Bundle();
bundle.putString("data",data);
msg.setData(bundle);
handler.sendMessage(msg); //通过handler发送消息
}
});

    }

    @Override
public void onServiceDisconnected(ComponentName componentName) {
System.out.println("*****Disconnected Successful*******"); }
 

//消息处理函数,接收Message并进行处理

    

private android.os.Handler handler=new android.os.Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
tvOut.setText(msg.getData().getString("data"));

}
};

}
 

2.MyService.java

package com.example.shiyanshi.serviceconnected;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder; public class MyService extends Service {
private String data="default info";
private boolean flag; public MyService() {
} @Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
// throw new UnsupportedOperationException("Not yet implemented");
System.out.println("******onBind*****");
return new Binder(); //返回值会传给onServiceConnected函数的第二个参数IBinder
}
//该类是Activity和Service进行交互数据的接口
public class Binder extends android.os.Binder{
public void setData(String data) {
MyService.this.data=data;
}

//获取当前的MyService类的引用
public MyService getService(){
return MyService.this;
}

    }

    @Override
public int onStartCommand(Intent intent, int flags, int startId) { data=intent.getStringExtra("data");
return super.onStartCommand(intent, flags, startId);
} @Override
public void onCreate() {
super.onCreate();
System.out.println("*******onCreate********");
flag=true; new Thread() {
@Override
public void run() {
super.run();
int i=0;
while (flag) {
i++;
String str=i+":"+data;
System.out.println(str);

//由新创建的线程去调用这个函数,不允许直接修改UI线程的内容
if (callback!=null){
callback.onDataChange(str);
}

                    try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
} @Override
public void onDestroy() {
super.onDestroy();
System.out.println("******onDestroy******");
flag=false;
}

//创建的接口用于回调,回调函数(onDataChange)具体是在Activity中实现的


private Callback callback=null;

public void setCallback(Callback callback) {
this.callback = callback;
}

public Callback getCallback() {
return callback;
}

public static interface Callback{
void onDataChange(String data);
}


}
 
 

(六)Android中Service通信的更多相关文章

  1. Android中Service通信(二)——绑定Service进行通信

    一.把输入文本的数据同步到服务的实例(如何执行服务的内部代码) 绑定服务比启动服务更加方便高效,绑定服务中的直接方法调用比Intent作为载体传输更为快捷得多. 1.activity_main.xml ...

  2. Android中Service通信(一)——启动Service并传递数据

    启动Service并传递数据的小实例(通过外界与服务进行通信): 1.activity_main.xml: <EditText android:layout_width="match_ ...

  3. Android中Service(服务)详解

    http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...

  4. Android中Service的使用详解和注意点(LocalService)

    Android中Service的使用详解和注意点(LocalService) 原文地址 开始,先稍稍讲一点android中Service的概念和用途吧~ Service分为本地服务(LocalServ ...

  5. Android中Service的一个Demo例子

    Android中Service的一个Demo例子  Service组件是Android系统重要的一部分,网上看了代码,很简单,但要想熟练使用还是需要Coding.  本文,主要贴代码,不对Servic ...

  6. Android中Service与多个Activity通信

    由于项目需要,我们有时候需要在service中处理耗时操作,然后将结果发送给activity以更新状态.通常情况下,我们只需要在一个service与一个activity之间通信,通常这种情况下,我们使 ...

  7. Android中Service和Activity之间的通信

    启动Service并传递数据进去: Android中通过Intent来启动服务会传递一个Intent过去. 可以在Intent中通过putExtra()携带数据 Intent startIntent ...

  8. Android中Service 使用详解(LocalService + RemoteService)

    Service 简介: Service分为本地服务(LocalService)和远程服务(RemoteService): 1.本地服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外L ...

  9. Android中AIDL通信机制分析

    一.背景 ·1.AIDL出现的原因 在android系统中,每一个程序都是运行在自己的进程中,进程之间无法进行通讯,为了在Android平台,一个进程通常不能访问另一个进程的内存空间,所以要想对话,需 ...

随机推荐

  1. Android自定义带标题边框的Layout

    今天工作中又碰到个小问题,项目需要用到像Java Swing的JPanel一样带标题边框的布局,Android里没有类似控件,想到这个也不难,自己画了一个,是继承LinearLayout的一个自定义布 ...

  2. Unity之极光推送

    Android应用中大多数应用使用了推送,游戏中当然也可以使用推送!下面在Unity3D做个测试!(下面是客套话,大家可以忽略) 1.1 什么是推送技术? 推送技术,又名反向AJAX,指的是一种基于I ...

  3. Oracle Linux Server 7安装VMwareTools问题

    OracleLinuxServer7安装VMwareTools问题#./vmware-install.pl时报错:#-bash: ./vmware-instal.pl:/usr/bin/perl:ba ...

  4. 《JavaScript 闯关记》之对象

    对象是 JavaScript 的数据类型.它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值,因此我们可以把它看成是从字符串到值的映射.对象是动态的,可以随时新增和删除自有属性.对象除了 ...

  5. Android 打开系统相册和系统视

    1.打开系统相册 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setType("vnd.android.cursor.dir ...

  6. android开发工具类总结(一)

    一.日志工具类 Log.java public class L { private L() { /* 不可被实例化 */ throw new UnsupportedOperationException ...

  7. github Permission denied (publickey)解决办法

    想要玩玩git,参考了网友懒惰之计的一篇Blog<github:如何获取项目源代码 >,按部就班完成了所有的步骤的, 可在测试的时候,遇到了问题,总是报错”github Permissio ...

  8. thinkPHP入门 一

    简介 ThinkPHP是一个快速.简单的基于MVC和面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,尤其注重开 ...

  9. bluestacks安装安卓引擎时出现2502 2503错误的解决办法

    2503代表工作站无法启动.2502代表下面的程序调用不支持的MS-DOS函数. 以管理员身份运行命令提示符在经典桌面使用快捷键Win+X,出现一个菜单,选择“命令提示符(管理员) ”即可以以管理员身 ...

  10. PPT 制作必备工具

    1.图标 http://www.easyicon.net/ http://ico.58pic.com/ http://www.iconpng.com/ 2.字体 http://www.qiuziti. ...