android 中组件 service

Service 是 android的一个重要组建,用到的地方也比较多。

service 和 Thread是两个不同的概念,初学者很容易把两者搞混,其实两者之间半毛钱关系都没有。
service是独立于activity存在的,有两种类型,一种是本地类型,一种是远程类型。先说本地的
本地service的运行是在主进程中main线程上,也就是UI线程上,不能直接做耗时操作,否则就造成UI线程卡顿了。
service的启动方式有两种,直接startService(intent); 或者绑定service,启动服务。
方式一:
有service类   class MyService extends Service{}
    Intent intent = new Intent(this, MyService.class);


直接执行startService(intent)方法,对应的service的生命周期,执行 onCreate() 和 onStartCommand(Intent intent, int flags, int startId)方法

此时再次或多次点击开启服务方法,即 startService(intent)方法,对应的service的生命周期,只会执行 onStartCommand(Intent intent, int flags, int startId)方法

点击停止服务按钮,即stopService(intent);  对应的service的生命周期,执行onDestroy()方法。


方式二

有service类   class MyService extends Service{
    private MyBinder mBinder ;  

@Override  
    public void onCreate() {  
        super.onCreate();  
        mBinder = new MyBinder();  
    }  

    @Override  
    public IBinder onBind(Intent intent) {  
        return mBinder;  
    }  
 
    class MyBinder extends Binder {  
 
        public void startDownload() {  
            Log.d("TAG", "startDownload");  
             
        }  
 
    }  
}
    Intent intent = new Intent(this, MyService.class);

activity中 {

    private MyService.MyBinder myBinder;  
 
    private ServiceConnection connection = new ServiceConnection() {  
 
        @Override  
        public void onServiceDisconnected(ComponentName name) {  
        }  
 
        @Override  
        public void onServiceConnected(ComponentName name, IBinder service) {  
            myBinder = (MyService.MyBinder) service;  
            myBinder.startDownload();  
        }  
    };  

}

绑定service方式启动一个服务,
bindService(intent, connection, BIND_AUTO_CREATE); ,此时,会发现service的生命周期为 onCreate()和activity中connection 的 onServiceConnected(ComponentName name, IBinder service)方法,不会执行 onStartCommand(Intent intent, int flags, int startId)方法。

解除绑定
unbindService(connection);  对应service生命周期为 onDestroy()。

bindService(intent, connection, BIND_AUTO_CREATE)方法中的常量 BIND_AUTO_CREATE表示在Activity和Service建立关联后自动创建Service


这是两种的服务启动方式,但有时候会有一种另类的混合方式,
如果点击了startService(intent); 又点击了bindService(intent, connection, BIND_AUTO_CREATE);当要停止service时会惊奇的发现,不管是单独执行stopService(intent);或者unbindService(connection);都不起作用,必须两个方法都执行才能是service销毁,执行onDestroy()方法。 这种情况,unbindService(connection);是让service和activity解除关联,stopService(intent)是让service停止。service销毁必须是解除关联状态且处于停止状态。

本地service是处于主线程中,经常用到的是和Notification一块使用,或者是和广播使用,有一种功能,估计大部分app都用到了,就是版本升级,下载apk时,在通知栏显示出一个进度条,动态显示下载的进度。这方面网上很多例子,可以搜搜。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值