Activity与Service的启动和绑定

Activity提供了用户操作的视图界面,而Service则能在Activity退出时运行在后台,在实际的android应用开发中,经常会用到Activity和Service,它们是如何绑定的呢。
Service的启动:context.startService(Intent i)
Service的绑定:context.bindService(Intent service, ServiceConnection conn,int flags)
Service的解绑:context.unbind(ServiceConnection conn)
Service的停止:context.stopService(Intent i)
通过Activity启动和绑定Service,有两种方法:
1、启动Activity后,startService–>bindService–>进行通信后–>unbind–>stopService;
2、启动Activity后,bindService–>进行通信–>unbind;
这两种方法是有差别的,第一种当Activity没有stopService就退出时,service会一直在后台运行,直到有哪个组件stop它,当Activity与Service bind后,要想停止Service,则必须即unbind又stopService(两者哪个先执行都可以)。
第二种,当bindService时可以指定自动创建Service并将其与Activity绑定,一旦退出Activity时,Service也会先unbind后destory。

下面看一个例子:

package com.qiaqia.androidapp;
import android.content.ComponentName;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;


public class MainActivity extends ActionBarActivity implements View.OnClickListener,ServiceConnection{

    private Button btnStart,btnStop,btnBind,btnUnbind;
    private Intent i;
    private MyService myService = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //界面是四个button,代码就不展示了
        setContentView(R.layout.activity_main);        
        System.out.println("oncreate!");
        //初始化四个按钮
        btnStart = (Button) findViewById(R.id.btnStart);
        btnStop = (Button) findViewById(R.id.btnStop);
        btnBind = (Button) findViewById(R.id.btnBind);
        btnUnbind = (Button) findViewById(R.id.btnUnbind);
        //指定监听器
        btnStart.setOnClickListener(this);
        btnStop.setOnClickListener(this);
        btnBind.setOnClickListener(this);
        btnUnbind.setOnClickListener(this);
        //创建Intent,并添加数据,用来实现与service的通信
        i = new Intent();
        i.setClass(this,MyService.class);
        i.putExtra("lalala","我来自activity");
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case(R.id.btnStart):
            //启动Service,Service会执行onCreate方法
                startService(i);
                break;
            case(R.id.btnStop):
            //停止Service,Service会执行onDestory方法
                stopService(i);
                break;
            case(R.id.btnBind):
            //绑定service,这里需要该Activity实现ServiceConnected接口
                bindService(i,this, BIND_AUTO_CREATE);
                break;
            case(R.id.btnUnbind):
            //解除绑定
                unbindService(this);
                break;
        }
    }
    /**
    * 当Service中的onBind返回值不为空时,会调用下面的函数
    * /
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        System.out.println("onserviceConnected");
        myService = ((MyService.MyBinder)service).getMyService();
        System.out.println(myService.getStr());
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {

    }
}

MyService.java

package com.qiaqia.androidapp;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;


public class MyService extends Service  {
    @Override
    public IBinder onBind(Intent intent) {
        System.out.println("onBind");
        //当与Activity绑定后,可获取intent中的数据
        System.out.println("this is service, "+intent.getExtras().getString("lalala"));
        //若返回值为空,则与之相绑定的Connection不会执行
        //onServiceConnected方法
        return binder;
    }
    private final MyBinder binder = new MyBinder();
    //通过下面这个类中的getMyService方法来获取该Service对象
    class MyBinder extends Binder{
        public MyService getMyService(){
            return MyService.this;
        }
    }
    public String getStr(){
        return "我是service,你好activity";
    }
    @Override
    public boolean onUnbind(Intent intent) {
        System.out.println("onunbind");
        return super.onUnbind(intent);

    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("ondestroy in service");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        System.out.println("oncreate in service");
    }
}

以下为运行结果:
1、依次点击start–stop,输出oncreate in service,ondestroy in service
2、依次点击start–bind–unbind–destory,
输出 oncreate in service
onBind //onBind方法执行
this is service, 我来自activity //onbind方法执行,取得intent中的数据
onserviceConnected //onServiceConnected方法执行
我是service,你好activity //调用取得与之绑定的Service中的方法
onunbind in service
ondestroy in service
3、依次点击bind–unbind
输出结果与2相同

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值