Service的启动、绑定、传递数据

1.startService 启动服务
 

想要用 startService  启动服务,不管Local 还是 Remote 我们需要做的工作都是一样简单。当然要记得在 Androidmanifest.xml 中注册 service。

根据上面的生命周期,我们便会给出 Service 中的代码框架:

package com.newcj.test;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class LocalService1 extends Service {

        /**
         * onBind 是 Service 的虚方法,因此我们不得不实现它。
         * 返回 null,表示客服端不能建立到此服务的连接。
         */
        @Override
        public IBinder onBind(Intent intent) {
                return null;
        }
        
        @Override
        public void onCreate() {
                super.onCreate();
        }
        
        @Override
        public void onStart(Intent intent, int startId) {
                super.onStart(intent, startId);
        }
        
        @Override
        public void onDestroy() {
                super.onDestroy();
        }

}

对应生命周期系统回调函数上面已经说明,在对应地方加上适当的代码即可。下面是启动与停止 Service 的代码:

       // 启动一个 Activity
       startActivity(new Intent(this, LocalService1.class));
       ...
       // 停止一个 Activity
       stopService(new Intent(this, LocalService1.class));
对应的 Intent 为标志服务类的 Intent。


在服务中不仅可以启动服务,还可以传递数据,像Activity一样通过intent传递数据

在Service中获取到传递的数据


 2.Local 服务绑定:Local 服务的绑定较简单,首先在 Se rvice 中我们需要实现 Se rvice 的抽象方法 onBind,并返回一个实现 IBinde r 接口的对象。
在Service中返回的是一个Ibinder对象,在Acitivity中获取此Ibinder对象即可调用其中的方法

Service 中的代码:

package com.newcj.test;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

public class LocalService extends Service {

        /**
         * 在 Local Service 中我们直接继承 Binder 而不是 IBinder,因为 Binder 实现了 IBinder 接口,这样我们可以少做很多工作。
         * @author newcj
         */
        public class SimpleBinder extends Binder{
                /**
                 * 获取 Service 实例
                 * @return
                 */
                public LocalService getService(){
                        return LocalService.this;
                }
                
                public int add(int a, int b){
                        return a + b;
                }
        }
        
        public SimpleBinder sBinder;
        
        @Override
        public void onCreate() {
                super.onCreate();
                // 创建 SimpleBinder
                sBinder = new SimpleBinder();
        }
        
        @Override
        public IBinder onBind(Intent intent) {
                // 返回 SimpleBinder 对象
                return sBinder;
        }

}

上面的代码关键之处,在于 onBind(Intent) 这个方法 返回了一个实现了 IBinder 接口的对象,这个对象将用于绑定Service 的 Activity 与 Local Service 通信。下面是 Activity 中的代码:

package com.newcj.test;

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.util.Log;
import android.view.View;
import android.view.View.OnClickListener;

public class Main extends Activity {
        private final static String TAG = "SERVICE_TEST";
        private ServiceConnection sc;
        private boolean isBind;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        sc = new ServiceConnection() {
                       
                        @Override
                        public void onServiceDisconnected(ComponentName name) {

                        }
                       
                        @Override
                        public void onServiceConnected(ComponentName name, IBinder service) {
                                LocalService.SimpleBinder sBinder = (LocalService.SimpleBinder)service;
                                Log.v(TAG, "3 + 5 = " + sBinder.add(3, 5));
                                Log.v(TAG, sBinder.getService().toString());
                        }
                };
        findViewById(R.id.btnBind).setOnClickListener(new OnClickListener() {
                       
                        @Override
                        public void onClick(View v) {
                                bindService(new Intent(Main.this, LocalService.class), sc, Context.BIND_AUTO_CREATE);
                                isBind = true;
                        }
                });
        findViewById(R.id.btnUnbind).setOnClickListener(new OnClickListener() {
                       
                        @Override
                        public void onClick(View v) {
                                if(isBind){
                                        unbindService(sc);
                                        isBind = false;
                                }
                        }
                });
    }
}

获取Service内部的状态:

定义一个接口,用来传递数据:

调用方法的地方:

在Binder中传递Service:

其中setData是可以通过Acitivity向Service传递数据:

在Activity中实现onDataChange方法,在Service中调用该方法并将值通过Ibinder对象传回:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值