android服务之启动方式

服务有两种启动方式

  • 通过startService方法来启动
  • 通过bindService来开启服务

布局文件


在布局文件中我们定义了四个按键来测试这两种方式来开启服务的不同

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:text="开始服务"
        android:onClick="start"/>
    <Button
        android:id="@+id/stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:text="停止服务"
        android:onClick="stop"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:text="绑定服务"
        android:onClick="bind"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:text="解绑"
        android:onClick="unbind"/>
</LinearLayout>

Activity


在Activity中我们使用了这两种方式来开启服务

package xidian.dy.com.chujia;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    Intent service;
    MyConnection mc;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        service = new Intent(this, MyService.class);
        mc = new MyConnection();
    }

    public void start(View v){
        Toast.makeText(this,"开启服务",Toast.LENGTH_SHORT).show();
        startService(service);
    }

    public void stop(View v){
        Toast.makeText(this,"关闭服务",Toast.LENGTH_SHORT).show();
        stopService(service);
    }

    public void bind(View v){
        bindService(service,mc,BIND_AUTO_CREATE);
    }

    public void unbind(View v){
        unbindService(mc);
    }

    class MyConnection implements ServiceConnection{
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {

        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    }
}

注意在绑定服务的时候需要传入回调函数(第二个参数),当绑定成功会调用onServiceConnected方法,当解除绑定会调用onServiceDisconnected方法。

Service


在服务代码中我们将各个方法复写了一边,其实代码中各个方法也表示了服务的生命周期。

package xidian.dy.com.chujia;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;

/**
 * Created by dy on 2016/7/12.
 */
public class MyService extends Service {
    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(this.getClass().getName(), "****start方法****");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(this.getClass().getName(), "*****startCommand方法*****");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Log.i(this.getClass().getName(), "***Destroy方法***");
        super.onDestroy();
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.i(this.getClass().getName(), "****Bind方法被调用****");
        return null;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.i(this.getClass().getName(),"****unBind方法被调用****");
        return super.onUnbind(intent);
    }
}

两者区别


启动服务

  • 点击开始服务

  • 点击返回按键销毁Activity,我们发现服务仍在运行

  • 点击停止服务

 绑定服务

  • 点击绑定服务

  • 点击返回按键销毁Activity,则会抛出异常并且有两方法被调用

 通过对比我们发现startService开启的服务是独立运行的,而通过bindService开启的服务则依赖于Activity,但Activity被销毁时绑定的服务也被销毁了

posted @ 2016-07-14 10:45  被罚站的树  阅读(266)  评论(0编辑  收藏  举报