Android四大组件之服务--Service

来源:互联网 发布:app生成器软件 编辑:程序博客网 时间:2024/06/05 19:11

1.概念:

  (1).Service可以说是一个在后台运行的Activity。它不是一个单独的进程,它只需要应用告诉它要在后台做什么就可以了。

  (2).它要是实现和用户的交互的话需要通过通知栏或者是通过发送广播,UI去接收显示。

  (3).它的应用十分广泛,尤其是在框架层,应用更多的是对系统服务的调用。

  2.作用:

  (1).它用于处理一些不干扰用户使用的后台操作。如下载,网络获取。播放音乐,它可以通过Intent来开启,同时也可以绑定到宿主对象(调用者例如Activity上)来使用。

  (2).如果说Activity是显示前台页面的信息,那么Service就是在后台进行操作的。如果Service和前台UI进行交互的话可以通过发送广播或者通知栏的方式。

2.Service的生命周期

图片来自网络:


注意:本地服务中,onStart已经被onStartCommand方法取代

Service有两种启动方式:

1.通过startService()开启服务

生命周期:

第一次开启服务:onCreate()-->onStartCommand()

除了第一次以后每一次开启服务都是:onStartCommand()

通过startService()开启的服务,只能通过stopService()方法结束


2.bindService开启服务:将服务的生命周期和调用者的生命周期绑在一起
  第一次开启服务:onCreate()-->onBind()
  第二次之后的每一次:什么都不执行
  通过bindService开启的服务一定要在activity销毁的时候或销毁前解绑,并且绑定一次解绑一次,不能多次解绑
 
  startService开启服务、bindService开启服务的区别:
  startService开启服务只能通过stopService()结束
  bindService和activity生命周期绑在一起
 
 bindService可以实现与调用者的交互(Activity和广播可以开启Service)
 startService:一般用于后台下载
 bindService:一般用于音乐播放器

下面是实现的具体代码:

    /**     * service与activity交互的步骤     * 1.在service中创建Binder的实现类(编写一个类继承Binder)     * 2.在实现类中写具体方法     * 3.在onBinder方法中返回实现类的对象     * 4.在调用者中声明Binder实现类的对象     * 5.在onServiceConnected中拿到Binder对象     * 6.调用Service中的方法     */

MainActivity:

public class MainActivity extends AppCompatActivity {    Button but_start, but_stop, but_bind, but_unbind, but_myExample,but_link;    MyServiceConnection conn;    MyService.MyBinder myBinder;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        /**开启服务*/        // startService(new Intent(MainActivity.this, MyService.class));        conn = new MyServiceConnection();        init();    }    private void init() {        but_start = (Button) findViewById(R.id.but_start);        but_stop = (Button) findViewById(R.id.but_stop);        but_bind = (Button) findViewById(R.id.but_bind);        but_unbind = (Button) findViewById(R.id.but_unbind);        but_myExample = (Button) findViewById(R.id.but_myExample);        but_link= (Button) findViewById(R.id.but_link);        but_start.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                /**开启服务*/                startService(new Intent(MainActivity.this, MyService.class));            }        });        but_stop.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                /**停止服务*/                stopService(new Intent(MainActivity.this, MyService.class));            }        });        but_bind.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                /**绑定服务                 * 参数一:Intent service                 * 参数二:ServiceConnection conn 监听服务连接状态                 * ServiceConnection 是一个接口 需要写一个类实现它                 * 参数三:int flags :连接的方式                 *  Service.BIND_AUTO_CREATE自动创建连接*/                bindService(new Intent(MainActivity.this, MyService.class), conn, Service.BIND_AUTO_CREATE);            }        });        but_unbind.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                /**解绑服务*/                unbindService(conn);            }        });        //例子        but_myExample.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                myBinder.myExample();            }        });        //连用        but_link.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //开启                Intent intent=new Intent(MainActivity.this, MyService.class);                startService(intent);                //绑定                bindService(intent,conn,Service.BIND_AUTO_CREATE);            }        });    }    public class MyServiceConnection implements ServiceConnection {        //服务连接        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            myBinder = (MyService.MyBinder) service;        }        //服务未连接        @Override        public void onServiceDisconnected(ComponentName name) {        }    }    //销毁    @Override    protected void onDestroy() {        super.onDestroy();        unbindService(conn);    }}
MyService:

public class MyService extends Service {    //第一次开启服务时调用    @Override    public void onCreate() {        super.onCreate();        Log.i("MyService", "onCreate");    }    //绑定    @Nullable    @Override    public IBinder onBind(Intent intent) {        Log.i("MyService", "onBind");        return new MyBinder();    }    //解绑    @Override    public boolean onUnbind(Intent intent) {        return super.onUnbind(intent);    }    //开始    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        Log.i("MyService", "onStartCommand");        return super.onStartCommand(intent, flags, startId);    }    //销毁    @Override    public void onDestroy() {        super.onDestroy();        Log.i("MyService", "onDestroy");    }    public void examples() {        Toast.makeText(this, "我是例子examples", Toast.LENGTH_SHORT).show();    }    public class MyBinder extends Binder{        public void myExample(){            examples();        }    }}
activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" ><Button    android:id="@+id/but_start"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="开启"/>    <Button        android:id="@+id/but_stop"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="停止"/>    <Button        android:id="@+id/but_bind"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="绑定"/>    <Button        android:id="@+id/but_unbind"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="解绑"/>    <Button        android:id="@+id/but_myExample"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="例子"/>    <Button        android:id="@+id/but_link"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="开启和绑定"/></LinearLayout>

参考地址:http://www.3lian.com/edu/2015/06-06/219880.html