安卓学习笔记之service(一)

来源:互联网 发布:淘宝联盟佣金 编辑:程序博客网 时间:2024/06/03 19:11

安卓四大组件之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" />

这里写图片描述

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的生命周期。这里写图片描述

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

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