前言:
写这篇文章主要目的只是为了加深印象。由于工作的缘故,平时最多遇到的都是Activity。其他三大组件使用频率极少。
本文阅读要点提醒:
1、一个简单的service的例子,了解service生命周期;
2、activity与service的通信的两种方式:Intent,Binder;
3、service与activtiy的通信(或者activity监听service内部变化);
4、servcie的销毁几种情况及总结;
阅读声明:水平有限,主要针对普通玩家,快速查看某一点请直接通过目录,高端玩家随意。
正文:
一、写一个简单的service例子。
目的:阅读此部分主要为了解service的生命周期,可跳过。官方的生命周期图如下:
看图说话:
上图分左右两列,
1.左边这一列即是一个简单service的生命周期。
2.全图结合右边则是一个与activity有交互紧密关联的service的生命周期。
先看代码一个简单service
(一):一个简单activity用于启动service
package com.example.user.simpleservice;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void start(View view){
startService(new Intent(this,SimpleService.class));
}
public void stop(View view){
stopService(new Intent(this,SimpleService.class));
}
}
对应的activity_main:略。
(二):一个简单service
package com.example.user.simpleservice;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
public class SimpleService extends Service {
private String TAG = getClass().getSimpleName();
public SimpleService() {
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG,TAG+"--onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG,TAG+"--onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.d(TAG,TAG+"--onDestroy");
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
对应的在manifeist中写:略。
操作后log如下:
点击按钮【启动service】:
11-26 01:14:47.010 1537-1537/com.example.user.simpleservice D/SimpleService: SimpleService--onCreate
11-26 01:14:47.014 1537-1537/com.example.user.simpleservice D/SimpleService: SimpleService--onStartCommand
再次点击【启动service】:
11-26 01:14:47.010 1537-1537/com.example.user.simpleservice D/SimpleService: SimpleService--onCreate
11-26 01:14:47.014 1537-1537/com.example.user.simpleservice D/SimpleService: SimpleService--onStartCommand
11-26 01:26:54.466 1537-1537/com.example.user.simpleservice D/SimpleService: SimpleService--onStartCommand
可见多打一条日志startCommand
点击按钮【停止service】:
11-26 01:14:47.010 1537-1537/com.example.user.simpleservice D/SimpleService: SimpleService--onCreate
11-26 01:14:47.014 1537-1537/com.example.user.simpleservice D/SimpleService: SimpleService--onStartCommand
11-26 01:26:54.466 1537-1537/com.example.user.simpleservice D/SimpleService: SimpleService--onStartCommand
11-26 01:28:38.034 1537-1537/com.example.user.simpleservice D/SimpleService: SimpleService--onDestroy
再次点击【停止service】:与上面Log并没有区别。确认已经销毁了。
由此左边的一列生命周期解释很清晰了。
二、写一个activity与service绑定的(Binder)service例子
所谓紧密关联:即可进行数据交互:Activity传递数据到Service,Service传递数据到Activity。
(1)Activity传递数据到Service包含两种:
1.一种是传统的Intent传递数据到service,另一种则是通过Binder进行传递数据到Service。
2.一种是传统的Intent传递数据到service的升级版本Demo:
一种是传统的Intent传递数据到service:
MainActivity.java:Activity两个按钮,一个启动service,一个销毁service。启动service时通过intent携带数据,传递给service。
public class MainActivity extends Activity {
private EditText edit_tv;
private String TAG = getClass().getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit_tv = (EditText) findViewById(R.id.edit_tv);
}
public void start(View view){
Intent intent = new Intent(this,MiddleService.class);
intent.putExtra(TAG,edit_tv.getText().toString());
startService(intent);
}
public void stop(View view){
Intent intent = new Intent(this,MiddleService.class);
stopService(intent);
}
}
activity_main.xml:效果如下图:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/edit_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="activity默认信息"/>
<Button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="start"
android:onClick="start" />
<Button
android:id="@+id/bind"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="bind"
android:onClick="bind" />
<Button
android:id="@+id/unbind"
android:text="start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="start" />
<Button
android:id="@+id/stop"
android:text="stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="stop" />
</LinearLayout>
MiddleService.java:
onCreate方法,新启动一个线程。将running设为true,通过running判断是否持续(每1秒打一条)打Log日志。
onDestroy方法:将running设为false。
public class MiddleService extends Service {
private MyBinder myBinder = new MyBinder();
private String TAG = getClass().getSimpleName();
private boolean running = false;
private String data = "这是默认信息";
public MiddleService() {
}
@Override
public void onCreate() {
super.onCreate();
running = true;
Log.d(TAG,TAG+"--"+"onCreate");
new Thread(){
@Override
public void run() {
super.run();
while (running){
Log.d(TAG,data);
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
data = intent.getStringExtra("MainActivity");
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
Log.d(TAG,TAG+"--"+"onBind");
return myBinder;
}
@Override
public void unbindService(ServiceConnection conn) {
super.unbindService(conn);
Log.d(TAG,TAG+"--"+"unbindService");
}
@Override
public void onDestroy() {
super.onDestroy();
running =false;
Log.d(TAG,TAG+"--"+"onDestroy");
}
class MyBinder extends Binder{
}
}
OK,demo基本上已经说清楚了。
1)点击start按钮Log日志说明:
第1行,点击start时,oncreate方法Log打印。
第2行,打印service初始化的默认信息。
第3行,开始获取到activity传递来的edittext中的默认信息,持续输出。
11-26 22:40:08.046 7707-7707/com.example.user.middleservice D/MiddleService: MiddleService--onCreate
11-26 22:40:08.046 7707-8026/com.example.user.middleservice D/MiddleService: 这是默认信息
11-26 22:40:09.046 7707-8026/com.example.user.middleservice D/MiddleService: activity默认信息
11-26 22:40:10.050 7707-8026/com.example.user.middleservice D/MiddleService: activity默认信息
11-26 22:40:11.050 7707-8026/com.example.user.middleservice D/MiddleService: activity默认信息
11-26 22:40:12.050 7707-8026/com.example.user.middleservice D/MiddleService: activity默认信息
2)修改editText的文案为“信息”,再点击start按钮:
最后1行,即再次点击start效果,Log日志改变,“信息”持续打印。
11-26 22:41:35.566 7707-7707/com.example.user.middleservice D/MiddleService: MiddleService--onCreate
11-26 22:41:35.566 7707-9336/com.example.user.middleservice D/MiddleService: activity默认信息
11-26 22:41:36.566 7707-9336/com.example.user.middleservice D/MiddleService: activity默认信息
11-26 22:41:37.570 7707-9336/com.example.user.middleservice D/MiddleService: activity默认信息
11-26 22:41:38.570 7707-9336/com.example.user.middleservice D/MiddleService: activity默认信息
11-26 22:41:39.570 7707-9336/com.example.user.middleservice D/MiddleService: activity默认信息
11-26 22:41:40.574 7707-9336/com.example.user.middleservice D/MiddleService: activity默认信息
11-26 22:41:41.574 7707-9336/com.example.user.middleservice D/MiddleService: activity默认信息
11-26 22:41:42.574 7707-9336/com.example.user.middleservice D/MiddleService: 信息
3)点击stop按钮:
最后1行,service销毁。
11-26 22:43:35.274 11021-11021/com.example.user.middleservice D/MiddleService: MiddleService--onCreate
11-26 22:43:35.274 11021-11100/com.example.user.middleservice D/MiddleService: activity默认信息
11-26 22:43:36.274 11021-11100/com.example.user.middleservice D/MiddleService: activity默认信息
11-26 22:43:37.274 11021-11100/com.example.user.middleservice D/MiddleService: activity默认信息
11-26 22:43:38.274 11021-11100/com.example.user.middleservice D/MiddleService: activity默认信息
11-26 22:43:39.102 11021-11021/com.example.user.middleservice D/MiddleService: MiddleService--onDestroy
另一种则是通过Binder进行传递数据到Service的升级版本Demo:
MainActivity.java:对前一个版本的修改见注释。主要通过binder绑定,建立连接。可通过binder进行数据从activity传递到service交互方式二。
public class MainActivity extends Activity {
private EditText edit_tv;
private String TAG = getClass().getSimpleName();
private MiddleService.MyBinder myBinder;
//建立连接,binder
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MiddleService.MyBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit_tv = (EditText) findViewById(R.id.edit_tv);
}
public void start(View view){
Intent intent = new Intent(this,MiddleService.class);
intent.putExtra(TAG,edit_tv.getText().toString());
startService(intent);
}
public void stop(View view){
Intent intent = new Intent(this,MiddleService.class);
stopService(intent);
}
//bind绑定数据
public void bind(View view){
Intent intent = new Intent(this,MiddleService.class);
bindService(intent,serviceConnection,BIND_AUTO_CREATE);
}
//unbind取消绑定
public void unbind(View view){
unbindService(serviceConnection);
}
//新增按钮“activity同步到service方法二”
public void sync(View view){
myBinder.setData(edit_tv.getText().toString());
}
}
MiddleService.java:MyBinder继承Binder,在里面提供对外的公开方法setData对data字符串操作。
public class MiddleService extends Service {
private MyBinder myBinder = new MyBinder();
private String TAG = getClass().getSimpleName();
private boolean running = false;
private String data = "这是默认信息";
public MiddleService() {
}
@Override
public void onCreate() {
super.onCreate();
running = true;
Log.d(TAG,TAG+"--"+"onCreate");
new Thread(){
@Override
public void run() {
super.run();
while (running){
Log.d(TAG,data);
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
data = intent.getStringExtra("MainActivity");
Log.d(TAG,TAG+"--"+"onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
Log.d(TAG,TAG+"--"+"onBind");
return myBinder;
}
@Override
public boolean onUnbind(Intent intent) {
Log.d(TAG,TAG+"--"+"onUnbind");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
running =false;
Log.d(TAG,TAG+"--"+"onDestroy");
}
//新增setdata公开方法,供外界使用
class MyBinder extends Binder{
public void setData(String data){
MiddleService.this.data = data;
}
}
}
activity_main.xml效果图如下:
效果说明:
点击start启动service(第1、2行日志),点击bind建立连接(第6行),修改editText文案为“信息xiugai”,点activity同步到service方法二(第倒数第4行),log日志如下:
11-27 00:53:07.840 7359-7359/com.example.user.middleservice D/MiddleService: MiddleService--onCreate
11-27 00:53:07.844 7359-7359/com.example.user.middleservice D/MiddleService: MiddleService--onStartCommand
11-27 00:53:07.844 7359-7693/com.example.user.middleservice D/MiddleService: 这是默认信息
11-27 00:53:08.848 7359-7693/com.example.user.middleservice D/MiddleService: 信息
11-27 00:53:09.848 7359-7693/com.example.user.middleservice D/MiddleService: 信息
11-27 00:53:09.936 7359-7359/com.example.user.middleservice D/MiddleService: MiddleService--onBind
11-27 00:53:10.844 7359-7693/com.example.user.middleservice D/MiddleService: 信息
11-27 00:53:11.848 7359-7693/com.example.user.middleservice D/MiddleService: 信息
11-27 00:53:12.848 7359-7693/com.example.user.middleservice D/MiddleService: 信息
11-27 00:53:13.848 7359-7693/com.example.user.middleservice D/MiddleService: 信息
11-27 00:53:14.848 7359-7693/com.example.user.middleservice D/MiddleService: 信息
11-27 00:53:15.848 7359-7693/com.example.user.middleservice D/MiddleService: 信息
11-27 00:53:16.852 7359-7693/com.example.user.middleservice D/MiddleService: 信息
11-27 00:53:17.848 7359-7693/com.example.user.middleservice D/MiddleService: 信息
11-27 00:53:18.852 7359-7693/com.example.user.middleservice D/MiddleService: 信息
11-27 00:53:19.848 7359-7693/com.example.user.middleservice D/MiddleService: 信息xiugai
11-27 00:53:20.848 7359-7693/com.example.user.middleservice D/MiddleService: 信息xiugai
11-27 00:53:21.852 7359-7693/com.example.user.middleservice D/MiddleService: 信息xiugai
11-27 00:53:22.852 7359-7693/com.example.user.middleservice D/MiddleService: 信息xiugai
到此,activity传递数据到service的两种传输数据方式已经完结。
三、Service销毁的几种情况及总结:
Service销毁的一个普通流程:
第1行,点击start启动service。
第5行,点击bind按钮建立连接。
第8行,点击unbind按钮解除绑定。
第末行,点击stop按钮销毁连接。
Log日志按照顺序如下:
11-27 00:18:39.172 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onCreate
11-27 00:18:39.176 16091-16138/com.example.user.middleservice D/MiddleService: 这是默认信息
11-27 00:18:39.176 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onStartCommand
11-27 00:18:40.180 16091-16138/com.example.user.middleservice D/MiddleService: activity默认信息
11-27 00:18:40.916 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onBind
11-27 00:18:41.180 16091-16138/com.example.user.middleservice D/MiddleService: activity默认信息
11-27 00:18:42.180 16091-16138/com.example.user.middleservice D/MiddleService: activity默认信息
11-27 00:18:42.352 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onUnbind
11-27 00:18:43.184 16091-16138/com.example.user.middleservice D/MiddleService: activity默认信息
11-27 00:18:43.956 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onDestroy
由于网上之前常有争议,service销毁的几种情况:(结合生命周期图看)
由start启动的service的销毁:
情况一、点击start,点击stop。前面已经说过,直接发日志。可见生命周期图左侧的一列。
11-27 00:23:01.800 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onCreate
11-27 00:23:01.800 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onStartCommand
11-27 00:23:05.852 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onDestroy
情况二、点击bind,点击unbind。可见生命周期图右侧的一列。
11-27 00:26:17.104 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onCreate
11-27 00:26:17.104 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onBind
11-27 00:26:17.104 16091-22990/com.example.user.middleservice D/MiddleService: 这是默认信息
11-27 00:26:18.112 16091-22990/com.example.user.middleservice D/MiddleService: 这是默认信息
11-27 00:26:18.636 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onUnbind
11-27 00:26:18.636 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onDestroy
情况三、点击start,点击bind,点击unbind。发现不点击stop,则无法停止service。
11-27 00:29:12.920 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onCreate
11-27 00:29:12.920 16091-25610/com.example.user.middleservice D/MiddleService: 这是默认信息
11-27 00:29:12.920 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onStartCommand
11-27 00:29:13.924 16091-25610/com.example.user.middleservice D/MiddleService: activity默认信息
11-27 00:29:14.152 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onBind
11-27 00:29:14.924 16091-25610/com.example.user.middleservice D/MiddleService: activity默认信息
11-27 00:29:15.520 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onUnbind
11-27 00:29:15.924 16091-25610/com.example.user.middleservice D/MiddleService: activity默认信息
11-27 00:29:16.928 16091-25610/com.example.user.middleservice D/MiddleService: activity默认信息
情况四、点击start,点击bind,直接点击stop。发现不点击unbind,也无法停止service。
11-27 00:30:49.704 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onCreate
11-27 00:30:49.704 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onStartCommand
11-27 00:30:49.704 16091-27066/com.example.user.middleservice D/MiddleService: activity默认信息
11-27 00:30:50.708 16091-27066/com.example.user.middleservice D/MiddleService: activity默认信息
11-27 00:30:51.216 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onBind
11-27 00:30:51.708 16091-27066/com.example.user.middleservice D/MiddleService: activity默认信息
11-27 00:30:52.708 16091-27066/com.example.user.middleservice D/MiddleService: activity默认信息
11-27 00:30:53.712 16091-27066/com.example.user.middleservice D/MiddleService: activity默认信息
情况五、点击bind,点击stop。发现也无法停止service。
11-27 00:32:47.656 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onCreate
11-27 00:32:47.656 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onBind
11-27 00:32:47.656 16091-28833/com.example.user.middleservice D/MiddleService: 这是默认信息
11-27 00:32:48.660 16091-28833/com.example.user.middleservice D/MiddleService: 这是默认信息
11-27 00:32:49.656 16091-28833/com.example.user.middleservice D/MiddleService: 这是默认信息
情况六、点击bind(第1行,第2行),再点击start(第7行),最后点击unbind(最后2行)。发现已经结束。
11-27 00:35:32.548 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onCreate
11-27 00:35:32.556 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onBind
11-27 00:35:33.552 16091-31318/com.example.user.middleservice D/MiddleService: 这是默认信息
11-27 00:35:34.556 16091-31318/com.example.user.middleservice D/MiddleService: 这是默认信息
11-27 00:35:35.560 16091-31318/com.example.user.middleservice D/MiddleService: 这是默认信息
11-27 00:35:36.560 16091-31318/com.example.user.middleservice D/MiddleService: 这是默认信息
11-27 00:35:36.756 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onStartCommand
11-27 00:35:37.560 16091-31318/com.example.user.middleservice D/MiddleService: activity默认信息
11-27 00:35:38.560 16091-31318/com.example.user.middleservice D/MiddleService: activity默认信息
11-27 00:35:39.560 16091-31318/com.example.user.middleservice D/MiddleService: activity默认信息
11-27 00:35:40.560 16091-31318/com.example.user.middleservice D/MiddleService: activity默认信息
11-27 00:35:41.560 16091-31318/com.example.user.middleservice D/MiddleService: activity默认信息
11-27 00:35:41.868 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onUnbind
11-27 00:35:41.868 16091-16091/com.example.user.middleservice D/MiddleService: MiddleService--onDestroy
总结结论:
service由start启动,则必须由stop结束。
service由bind启动,则必须由unbind结束。
service由start+bind启动(有先后顺序),则必须由unbind+stop结束。
四、Service传递数据到Activity:
其实这个说法严谨的说应该是Activity监听Service内部数据的改变。
理论依据:通过Binder让Activity持有Service对象。通过这个Service对象设置其内部的回调接口,设置监听方法。
第一步、在Service的MyBinder类内部添加:
class MyBinder extends Binder{
public void setData(String data){
MiddleService.this.data = data;
}
public MiddleService getService(){
return MiddleService.this;
}
}
第二步、在service中写一个内部接口:
public interface callBack{
void onDataChange(String data);
}
第三步、在service中写一个第二步创建的内部接口的声明:
private callBack callBack = null;
再对外公开set和get方法:
public MiddleService.callBack getCallBack() {
return callBack;
}
public void setCallBack(MiddleService.callBack callBack) {
this.callBack = callBack;
}
准备工作做好后。现在service中进行设置监听。如果callback不为空,则执行callback的onDataChange(String str)方法,将数据传递给callback指向的实例方法的对应onDataChange(String str)方法。
@Override
public void onCreate() {
super.onCreate();
running = true;
Log.d(TAG,TAG+"--"+"onCreate");
new Thread(){
@Override
public void run() {
super.run();
int i = 0;
while (running){
i++;
String str = data+i;
Log.d(TAG,str);
//设置监听
if (callBack!=null){
callBack.onDataChange(str);
}
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
上面提到callback的实例化,则在activity的service连接中持有service,并对service中的callback接口进行实现,本例通过setCallBack方法实例化的。
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MiddleService.MyBinder) service;
middleService = ((MiddleService.MyBinder) service).getService();
middleService.setCallBack(new MiddleService.callBack() {
@Override
public void onDataChange(String data) {
}
});
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
然而,由于servcie中onDataChange方法是在子线程中调用的。则activity也无法直接通过textview.setText设置文案。需要通过handler处理UI交互的问题。
还记得Handler如何使用么?
第一步、在activity中新建一个handler对象并实例化:(内部的handleMessage()方法可最后再写)
private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if (msg.what==10010){
tvOut.setText(msg.getData().getString("data"));
}
return true;
}
});
第二步、在activity的连接的子线程操作中通过上面的handler对象发送Msg给主UI线程,本例约定msg的消息唯一标志为10010,消息内容通过一个bundle对象传递,写完这儿再对第一步的handleMessage方法处理实现。
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MiddleService.MyBinder) service;
middleService = ((MiddleService.MyBinder) service).getService();
middleService.setCallBack(new MiddleService.callBack() {
@Override
public void onDataChange(String data) {
Message msg = Message.obtain();
msg.what = 10010;
Bundle b = new Bundle();
b.putString("data",data);
msg.setData(b);
handler.sendMessage(msg);
}
});
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};