断其一指------Service的使用

来源:互联网 发布:linux打开oracle服务 编辑:程序博客网 时间:2024/04/30 03:40

和Activity非常类似,只是没有用户界面。

创建和配置Service(和Activity一样一样的~~)
步骤:
1.定义一个继承Service的子类。
2.在AndroidManifest.xml文件中配置Service

生命周期
onBind() 返回一个IBinder对象,应用程序可以通过它来和Service通信
onCreate() 第一次被创建时回调
onDestroy() Service关闭之前回调
onStartCommand() 客户端调用startService 启动服务时回调
onUnbind 当Service与所有绑定的客户端断开连接上回调

通过startService和stopService可以开启和关闭服务

绑定本地Service,并与之通信
bindService(Intent service , ServiceConnection conn,int flags)

1.service 要启动的意图
2.conn 该对象用于监听访问者与Service间的联系情况,当二者连接成功的时候,回调onServiceConnected , 否则,回调onServiceDisconnected
3.flags 绑定时是否自动创建Service,0 (不自动创建) BIND_AUTO_CREATE 自动创建

Service和Activity之间通信的思路:

1.创建一个类,实现Binder。并把要通信的数据和业务逻辑写在这个类中。
2.在Service的子类中,创建1类的对象,取名为binder.
3.在onBind中,return binder
4.在Manifest清单文件中,创建一个

<action android:name="com.vincentliong.BIND"/>

5.在Activity类中,创建一个MyBinder对象。
同时,把binder通过onBind方法传入到Activity中。进而实现与Activity间的数据通信。

示例:
Service

public class CountService extends Service {    private boolean quit;    private int count;    private MyBinder binder = new MyBinder();    //创建一个Binder的子类,把需要执行的操作写入    public class MyBinder extends Binder    {        public int getCount()        {            return count;        }    }    public CountService() {    }    @Override    public void onCreate() {        super.onCreate();        Log.i("Demos","Create Service");        new Thread(new Runnable() {            public void run() {                while(!quit)                {                    try                    {                        Thread.sleep(1000);                        count++;                    }                    catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }        }).start();    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        Log.i("Demos","Start Service");        return super.onStartCommand(intent, flags, startId);    }    @Override    public void onDestroy() {        super.onDestroy();        this.quit = true;        Log.i("Demos","Destroy Service");    }    public IBinder onBind(Intent intent) {        Log.i("Demos","Bind Service");        return binder;    }    @Override    public boolean onUnbind(Intent intent) {        Log.i("Demos","Unbind Service");        return super.onUnbind(intent);    }}

Activity类

private Button mBtnStart;    private Button mBtnBind;    private Button mBtnStop;    private Button mBtnUnbind;    private Button mBtnCount;    private CountService.MyBinder binder ;    private ServiceConnection conn;    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_service_demo);        mBtnStart = (Button) findViewById(R.id.btn_start_service);        mBtnBind = (Button) findViewById(R.id.btn_bind_service);        mBtnStop = (Button) findViewById(R.id.btn_stop_service);        mBtnUnbind = (Button) findViewById(R.id.btn_unbind_service);        mBtnCount = (Button) findViewById(R.id.btn_getcount_service);        conn = new ServiceConnection() {            public void onServiceConnected(ComponentName name, IBinder service) {                binder = (CountService.MyBinder) service;                Log.i("Demo","serviceConnected");            }            public void onServiceDisconnected(ComponentName name) {                Log.i("Demo","serviceDisconnected");            }        };        mBtnStart.setOnClickListener(this);        mBtnBind.setOnClickListener(this);        mBtnStop.setOnClickListener(this);        mBtnUnbind.setOnClickListener(this);        mBtnCount.setOnClickListener(this);    }    public void onClick(View v) {        Intent intent = new Intent();        intent.setAction("com.vincentliong.service.BIND_SERVICE");        switch(v.getId())        {            case R.id.btn_start_service:                startService(intent);                break;            case R.id.btn_stop_service:                stopService(intent);                break;            case R.id.btn_bind_service:                bindService(intent,conn,BIND_AUTO_CREATE);                break;            case R.id.btn_unbind_service:                unbindService(conn);                break;            case R.id.btn_getcount_service:                Toast.makeText(this,binder.getCount()+"",Toast.LENGTH_SHORT).show();                break;        }    }

生命周期:
两种情况
1.调用startService()
onCreate –> onStartCommand –> Service运行中–>onDestroy

2.调用bindService()
onCreate –> onBind –>绑定Service –> 调用unbindService解绑 –> onUnbind –> onDestroy

注:解绑服务并不会关闭服务。

“特殊服务”^_^#~~~IntentService

使用队列来管理请求的Intent,当有Intent来请求启动IntentService的时候,IntentService会将该intent放到队列中,然后开启一个Worker线程来处理该Intent。为onBind onStartCommand提供了默认实现、

使用方法:
写一个类继承自IntentService
重写onHandleIntent
可以直接通过使用IntentService来完成耗时操作

0 0
原创粉丝点击