【Service】android四大组件之Service

本文详细介绍了Android中的Service组件,包括如何创建一个简单的Service,Activity与Service之间的Intent和Binder通信方式,Service的多种销毁情况及其总结,以及Service如何将数据传递回Activity。通过对各种场景的分析,加深了对Service生命周期和交互的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

写这篇文章主要目的只是为了加深印象。由于工作的缘故,平时最多遇到的都是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) {

        }
    };


看看动态效果图:操作顺序点击start启动,点击bind建立连接,修改文案,点击activity同步到service方法二按钮,点击unbind,点击stop销毁。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值