学习-简单的Service使用

2016-02-20 / 3 阅读 / Android
定义一个Service与定义Activity类似:

①定义一个类继承Service。
②在AndroidManifest.xml文件中配置该Service。

Service也有自已的生命周期

  • IBinder onBind(Intent intent)
    子类必须实现的方法,IBinder可实现与Service的通信。

  • void onCreate()
    该Service第一次创建时回调。

  • void onStartCommand(Intent intent, int flags, int startId)
    每次程序调用startService(intent)的被调用。

  • void onDestroy()
    销毁该Service时被调用。

  • boolean onUnbind(Intent intent)
    当该Service上所有绑定的程序都断开连接时回调。

启动Service有2种方式
  1. Context的startService()
    该方法启动Service,启动者与Service没有什么关联,即使启动者退出,Service依然运行

  2. Context的bindService()
    该方法启动Service,启动者与Service关联,启动者退出,Service也就终止了

下面给出两种启动方式实例:

1.startService()

这边只是简单的打印一句话,真正的是写上业务所需代码即可。

public class TestServiceActivity extends BaseActivity {

    @Bind(R.id.startService)
    private Button startService;

    @Bind(R.id.stopService)
    private Button stopService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_service_activity);

        startService.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(TestServiceActivity.this, MySerivce.class);
                startService(intent);
            }
        });

        stopService.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(TestServiceActivity.this, MySerivce.class);
                stopService(intent);
            }
        });
    }
}

MyService:

public class MySerivce extends Service{

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        Log.e("e","onCreate");
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        Log.e("e","onDestroy");
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e("e","onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }
}
2.bindService()

bindService较复杂,因为调用方需要与Service建立通信;
关键在于IBinder这个类,所有对Service的操作,状态都可以通过该类返回;
而在调用方可以通过ServiceConnection这个类与Service进行通信,ServiceConnection实例化必须实现的连个方法,如下:

            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                Log.e("e", "onServiceConnected");
                //这边service对象便是Service中onBind()返回的IBinder
                myBinder = (MySerivce.MyBinder)service;
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                //发生异常中断时会被调用
                Log.e("e", "onServiceDisconnected");
            }
public class TestServiceActivity extends BaseActivity {

    @Bind(R.id.startService)
    private Button startService;

    @Bind(R.id.stopService)
    private Button stopService;

    @Bind(R.id.getCount)
    private Button getCount;

    private MySerivce.MyBinder myBinder;
    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.e("e", "onServiceConnected");
            //这边service对象便是Service中onBind()返回的IBinder
            myBinder = (MySerivce.MyBinder)service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            //发生异常中断时会被调用
            Log.e("e", "onServiceDisconnected");
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_service_activity);

        startService.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(TestServiceActivity.this, MySerivce.class);
                bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE);
            }
        });

        stopService.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //解绑
                unbindService(serviceConnection);
            }
        });

        getCount.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(TestServiceActivity.this, String.valueOf(myBinder.getCount()), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

MyService:

public class MySerivce extends Service{
    private int count = 0;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }

    @Override
    public void onCreate() {
        Log.e("e","onCreate");
        new Thread(){
            @Override
            public void run() {
                while (true){
                    try {
                        Thread.sleep(1000);
                        count ++;
                        Log.e("e",""+count);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        Log.e("e","onDestroy");
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e("e","onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    public class MyBinder extends Binder{
        public int getCount(){
            return count;
        }
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.e("e","onUnbind");
        return super.onUnbind(intent);
    }
}
相关推荐