Android四大组件之服务--Service

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值