Android安卓组件——Service1.

发布时间:2024年01月04日

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()方法则是每次启动服务的时候都会调用。
文章来源:https://blog.csdn.net/shanhe_yuchuan/article/details/135277895
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。