Android安卓组件——Service1.

1.Service(服务)简单介绍:

Service(服务)是安卓中的四大组件之一,它通常用作在后台处理耗时的逻辑,与Activity一样,它存在自己的生命周期,也需要在AndroidManifest.xml配置相关信息。

Service通常位于后台运行,是一个专门在后台处理长时间任务的Android组件,它没有UI。

  • Service启动方式:

它有两种启动方式,startServicebindService

  • startService启动

只是启动Service,启动它的组件(如Activity)和Service并没有关联,只有当Service调用stopSelf或者其他组件调用stopService服务才会终止。

当第一次调用的时候,方法顺序是:

构造方法——oncreate()——onStartCommand()

当第二次被调用的时候,直接调用onStartCommand()

结束:stopService():——>onDestory()

  • bindService启动

调用bindService(),即可回调服务中的onBind()方法,调用方可以获取到onBind()方法里的IBinder对象的实例,只要没有断开连接,服务就可一直保持连接状态。

第一次调用:

构造方法——oncreate()——onBind()——onServiceConnected()

结束:unbindService():如果当前有Activity与Service相连——>onUnbind()——>onDestory()

  • 需要注意的是: 如果一个服务既调用了startService()方法,又调用了bindService()方法,需要同时调用stopService()和unbindService()方法onDestory()方法才可执行。

 2.Service_IBinder:

IBinder:在android中用于远程操作对象的一个基本接口,可以实现进度监控

  • 从客户端绑定到一个service,必须:

(1)实现ServiceConnection.

必须重写两个回调方法:

onServiceConnected()

系统调用这个来传送在service的onBind()中返回的IBinder.

OnServiceDisconnected()

Android系统在同service的连接意外丢失时调用这个.比如当service崩溃了或被强杀了.当客户端解除绑定时,这个方法不会被调用.

(2)调用bindService(),传给它ServiceConnection的实现.

(3)当系统调用onServiceConnected()方法时,就可以使用接口定义的方法们开始调用service了.

(4)与service断开连接,调用unbindService().

  • 使用ServiceConnection,客户端可以绑定到一个service,把它传给bindService().例如:

(1)第一个bindService()的参数是一个明确指定了要绑定的service的Intent.

(2)第二个参数是ServiceConnection对象.

(3)第三个参数是一个标志,它表明绑定中的操作.它一般应是BIND_AUTO_CREATE,这样就会在service不存在时创建一个.其它可选的值是BIND_DEBUG_UNBIND和BIND_NOT_FOREGROUND,不想指定时设为0即可.

3.Service的使用——使用活动控制服务

  • 创建一个服务,并重写方法。

服务需要销毁,否则占用内存,若没有点击销毁服务按键,则可以在MyService任意位置调用stopSelf(); 方法让服务自己停止。

(1)stopSelf():表示直接停止服务(所有次数)

(2)stopSelf(startId):表示停止startId次的服务,其他次数不停止。一般用于多次启动服务。

                                              startId:表示启动服务的次数

//MyService
public class MyService extends Service {
    private DownloadBinder mbinder = new DownloadBinder();

    static class DownloadBinder extends Binder {
        public void startDownload() {
            Log.d("MyService", "startDownload");
        }
        //获取进度
        public int getProgress() {
            Log.d("MyService", "getProgress executed");
            return 0;
        }
    }

    public MyService() {
        stopSelf();   //服务自己停止
    }

    //服务创建时调用
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("MyService", "onCreate executed");
    }
//    每次服务启动的时候调用
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("MyService", "onStartCommand executed");
        return super.onStartCommand(intent, flags, startId);
    }
//    服务销毁的时候调用
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("MyService", "onDestroy executed");
    }

    //绑定方法
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
//        throw new UnsupportedOperationException("Not yet implemented");
        return mbinder;
    }
}
//MainAvtivity
    private MyService.DownloadBinder downloadBinder;
    private ServiceConnection connection = new ServiceConnection() {
        //Android系统在同service的连接意外丢失时调用这个.比如当service崩溃了或被强杀了.当客户端解除绑定时,这个方法不会被调用.
        @Override
        public void onServiceDisconnected(ComponentName componentName) {        }
        //系统调用这个来传送在service的onBind()中返回的IBinder.
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            downloadBinder = (MyService.DownloadBinder) iBinder;
            downloadBinder.startDownload();
            downloadBinder.getProgress();
        }
    };
  • 构建Intent对象来调用Service的方法

public void onClick(View view){
        switch (view.getId()){
            case R.id.btn_start:
                Intent startIntent = new Intent(this,MyService.class);
                startService(startIntent);  //启动服务
                break;
            case R.id.btn_stop:
                Intent stopIntent = new Intent(this,MyService.class);
                stopService(stopIntent); //停止服务
                break;
            case R.id.btn_bind:
                //调用bindService(),传给它ServiceConnection的实现
                Intent bindintent = new Intent(this,MyService.class);
                bindService(bindintent,connection,BIND_AUTO_CREATE);//绑定服务
                //Intent
                break;
            case R.id.btn_unbind:
                //与service断开连接,调用unbindService().
                try {
                    unbindService(connection);  //解绑服务
//                    Log.d("MainActivity", "解绑服务");
                }catch (Exception e){
                    Toast.makeText(this,"服务已解绑",Toast.LENGTH_LONG).show();
                }
                break;
            default:
                break;
        }

    }
需要注意的是:onCreate()方法是在服务第一次创建的时候调用的,而onStartCommand()方法则是每次启动服务的时候都会调用。
  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shanhe_yuchuan

如果对你有用的话,那真是太好了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值