安卓四大组件之Service

今天来入门一下service这个组件,这玩意是在你后台做一些必要的工作。


**

1.什么是service?

**
从google官网看的,官方的描述是这样的。
A Service is an application component representing either an application’s desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use. Each service class must have a corresponding declaration in its package’s AndroidManifest.xml. Services can be started with Context.startService() and Context.bindService().
懂英语的话就一目了然了,英语水平差点的话就可以有道了。
翻译过来就是说:
服务是应用程序组件,它表示应用程序希望执行长时间运行的操作,而不与用户交互,或为其他应用程序提供功能。每个服务类在其包的androidmanifest.xml中都必须有相应的“声明”。可以使用Context.startService()和context.bindservice()启动服务。

Service是一种在后台长期运行的。没有界面的组件,由其它组件调用进行。
服务不太会被kill,即使在内存不足的时候被kill,当内存恢复足够的时候,服务又会自己的复活。比如:下载的时候就可以放入服务中来做,启动服务,完成时,关闭服务。


2.如何创建与使用service

我们要在manifest文件里进行声明,当然我们使用as的时候我们也可以通过菜单进行快速的创建service省去手动在manifest文件添加的麻烦。会有两种方法。

第一种


第一步:创建一个service类,并且分别重写它的父类方法,并在manifest文件里面生命注册

<service android:name=".MyService"/>
public class MyService extends Service {
    @Override
    public void onCreate() {
        Log.v("dd","onCreate");
        super.onCreate();
    }

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

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

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


}

仅仅是添加了log日志打印输出。看看生命周期的顺序。然后在activity_main中添加两个连个按钮控件

<Button
        android:id="@+id/btn_start"
        android:text="Start Service"
        android:textAllCaps="false"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn_stop"
        android:text="Stop Service"
        android:textAllCaps="false"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

然后在activity类里面测试:

public class MyActivity extends Activity implements View.OnClickListener {
    private Button btn_start;
    private Button btn_stop;
    private Intent intent;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initView();
        intent = new Intent(this,MyService.class);
    }

    private void initView() {
        btn_start= (Button) findViewById(R.id.btn_start);
        btn_stop= (Button) findViewById(R.id.btn_stop);
        btn_start.setOnClickListener(this);
        btn_stop.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_start:
                startService(intent);
                break;
            case R.id.btn_stop:
                stopService(intent);
                break;
        }
    }
}

当点击start按钮的时候,会看到控制台输入以下的文字:
06-21 06:51:15.995 3006-3006/com.does.service V/dd: onCreate
06-21 06:51:16.001 3006-3006/com.does.service V/dd: onStartCommand
当点击stop按钮的时候会调用:
06-21 06:51:22.829 3006-3006/com.does.service V/dd: onDestroy

第二种

使用bindService的方法


布局文件

<Button
        android:id="@+id/btn_start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="StartService"
        android:textAllCaps="false" />
    <Button
        android:id="@+id/btn_stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="StopService"
        android:textAllCaps="false" />
    <Button
        android:id="@+id/btn_bind"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="BindService"
        android:textAllCaps="false" />
    <Button
        android:id="@+id/btn_unbind"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="UnBindService"
        android:textAllCaps="false" />

android的服务什么时候执行ondestory_android

MainActivity .java文件

public class MainActivity extends Activity implements View.OnClickListener {

    private Button btn_bind,btn_unbind;
    private ServiceConnection connection;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initEvent();
    }

    private void initEvent() {
        connection=new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            //服务连接成功的时候操作

            }

            @Override
            public void onServiceDisconnected(ComponentName componentName) {
            //服务取消连接的时候
            }
        };
    }

    private void initView() {
        btn_bind= (Button) findViewById(R.id.btn_bind);
        btn_unbind= (Button) findViewById(R.id.btn_unbind);
        btn_bind.setOnClickListener(this);
        btn_unbind.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_start:
                Intent start=new Intent(this,MyService.class);
                startService(start);
                break;
            case R.id.btn_stop:
                Intent stop=new Intent(this,MyService.class);
                stopService(stop);
                break;
            case R.id.btn_bind:
                Log.v("does","bind is clicked");
                Intent bind=new Intent(this,MyService.class);
                bindService(bind,connection,BIND_AUTO_CREATE);
                break;
            case R.id.btn_unbind:
                Log.v("does","unbind is clicked");
                Intent unbind=new Intent(this,MyService.class);
                unbindService(connection);
                break;
            default:
                break;
        }
    }
}

MyService.java

public class MyService extends Service {
    @Override
    public void onCreate() {
        Log.v("does","onCreate");
        super.onCreate();
    }

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

    }

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

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

当我们点击bind按钮的时候,发现
07-10 20:01:39.836 24361-24361/com.example.does.myapplication V/does: bind is clicked
07-10 20:01:39.836 24361-24361/com.example.does.myapplication V/does: onCreate
当我们点击unbind的时候,发现
07-10 20:04:09.774 24361-24361/com.example.does.myapplication V/does: unbind is clicked
07-10 20:04:09.774 24361-24361/com.example.does.myapplication V/does: onDestroy


3.service的生命周期

在上面我们看到了和activity类似差不多的方法。组件都会有生命周期。所以我们介绍一下service的生命周期。

android的服务什么时候执行ondestory_应用_02

想必,这样就很形象了吧?
第一种,
onCreate()->onStartCommand()->onDestroy()
第二种就是绑定service
onCreate()->onBind()->unBind()->onDestroy()

两种启动service和停止service的区别就是,第一种启动服务时候,当应用程序退出的时候,后台的service依旧运行,只有运行stopService的时候才停止运行service。那么bindService,整个service进程是随着整个应用程序的生命周期存活,当app的使用内存被系统回收了,那么这个service就会跟着被回收。