Android之 服务(1)

1 简介

服务是Android四大组件之一。不过与Activity不同的是,服务不会直接与用户交互,而是摸摸地在后台运行。

有两种方式来启动系统服务。

一种是调用 Context.startService() 方法。另一种是调用 Context.bindService() 方法。

 

2 服务的生命周期

下面这张图说明了服务的生命周期。当用户调用Context.startService()或者Context.binService()时,系统会启动服务。

如果服务没有创建,那么系统首先会调用Service类中的onCreate()方法,然后onStart()方法或者onBind()方法将会执行,开启一个服务。

服务会一直默默地在后台进行,调用Context.stopService()或stopSelf()方法,服务中的onDestroy()会执行,销毁服务。

当通过Context.bindService()开启服务后,必须通过Context.unbindService()停止服务。

 

 

3 实例

3.1 通过Context.startService()启动服务

首先新建一个类,继承Service类。

public class MyService extends Service{
    
    @Override
    public IBinder onBind(Intent intent){
        return null;
    }
    
    @Override
    public void onCreate(){
        super.onCreate();
        Log.d("MyService","onCreate executed!");
    }
    
    @Override
    public void onStart(Intent intent, int startId){
        super.onStart();
        Log.d("MyService","onStart executed!");
    }
    
    @Override
    public void onDestroy(){
        super.onDestroy();
        Log.d("MyService","onDestroy executed!");
    }
    
}

然后在活动中通过点击按钮,实现活动的启动或停止。

 3.1 通过Context.bindService()启动服务

 上面的方式,我们只能通过活动界面的按钮来启动和停止服务。如果服务想要跟活动更多的交流,就需要采用另外一种方式来开启活动。

1、通过Context.bindService()启动服务,我们同样需要继承Service类,重写onBind()方法。

在onBind()方法中我们返回一个Binder对象。Binder类的API定义如下:

下面是具体代码:

public class MyService extends Service {
    private DownloadBinder mBinder = new DownloadBinder();
    
    DownloadBinder extends Binder {
        public void startDownload() {
            Log.d("MyService", "startDownload executed");
        }
        public int getProgress() {
            Log.d("MyService", "getProgress executed");
            return 0;
        }
    }
    
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
    ……
}

 可以看到我们定义了一个内部类DownloadBinder继承自Binder,在这个类中我们实现了两个方法,用于启动下载和获取进度。

2、接下来就是在活动中通过Context.bindService()启动服务,并且用上面的DownloadBinder中定义的方法,与服务随时交互。

下面是具体代码

public class MainActivity extends Activity implements OnClickListener {

    private Button bindService;
    private Button unbindService;
    
    private MyService.DownloadBinder downloadBinder;
    private ServiceConnection connection = new ServiceConnection() {
    
        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
        
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            downloadBinder = (MyService.DownloadBinder) service;
            downloadBinder.startDownload();
            downloadBinder.getProgress();
        }
    };
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ……
        bindService = (Button) findViewById(R.id.bind_service);
        unbindService = (Button) findViewById(R.id.unbind_service);
        bindService.setOnClickListener(this);
        unbindService.setOnClickListener(this);
    }
    
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.bind_service:
            Intent bindIntent = new Intent(this, MyService.class);
            bindService(bindIntent, connection, BIND_AUTO_CREATE); // 绑定服务
            break;
        case R.id.unbind_service:
            unbindService(connection); // 解绑服务
            break;
        default:
        break;
        }
    }
}

 

posted on 2017-03-14 18:03  猫咪大王  阅读(170)  评论(0编辑  收藏  举报