Android之四大组件(2)(Service)

一、Service是android的四大组件,于activity最相似,于activity的区别在于,service一直运行在后台,它没有界面,所以绝不可能跑到前台,一旦service被启动起来,它就有它自己的额生命周期。service是四大组件,也是需要到androidManifest.xml文件中配置声明。

二、开发service的两个步骤。

1、定义一个继承service的子类。

2、在androidManifest.xml文件中配置声明。

(service和ctivity还有一袋奶相识的地方就是,他们都是从context派生出来的,因此都可以调用Context中的getResources(),getContentResoler()等方法)

三、Service也定义了一系列的生命周期。

1、IBinder onBind(Intent intent):该方法是service子类必须要实现的方法,该方法返回一个IBinder对象,应用程序就可以通过IBinder对象,调用IBinder类中的方法,实现activity于service的通信。

2、void onCreate():该service第一次被创建后就立即回调该方法。

3、void onDestroy():该方法在service关闭之前调用。

4、void onStartCommand(Intent intent,int flags,int startId):该方方法每次客户端调用startService(Intent)方法启动该方法。

5、boolean onUnbind(Intent intent):方法在service上绑定所有客户端都断开时就将回调该方法。

四、在android运行service有两个方式:

1、通过context的startService()方法,该方法启动了service,访问者就和service之间就没有任何关联了,即使访问者推推出,service也运行。

(其中onCreate()方法之调用一次,其它时候启动就调用onStartCommand();)

(停止service的方法就是调用stopService()方法)

例、

Intent intent=new Intent(this,FristService.class);

startService(intent);

stopService(intent);

2、通过context中的bindService()方法,调用该方法,service就启动,访问者就和service之间绑定在一起了,访问者一但推出,service也终止。

五、绑定本地Service并与之通信

要实现service和访问者之间的通信,就需要将service和访问者绑定。

1、绑定:bindService(Intent intent,ServiceConnection conn,int flags)

intent:用intent启动service

conn:该ServiceConnection对象用于监听Service和访问者之间的连接情况。

(连接成功就回调方法:onServiceConnected(ComponentName,IBinder ibinder);该方法将ibinder导出,就可实现通信)

(连接失败回调:onServiceDisconnected(ComponentName name);)

flags:为指定绑定时是否自动创建Service,若参数为0(不自动创建),若为BIND_AUTO_CREATE(自动创建);

2、解绑:unbinService(ServiceConnection conn)

例、

重写的一个service的子类:

public class MyService extends Service {
    private int count=0;
    private boolean quit=false;

    private MyBinder binder=new MyBinder();//次对象用于方法public IBinder onBind(Intent intent)返回

    public class MyBinder extends Binder{   //定义的一个MyBinder类可调用其中的方法
        public int getCount(){
            return count;
        }
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        System.out.print("Service is Binder");
        return binder;
    }

    public void onCreate(){   //创建的时候开启一个线程
        super.onCreate();
        System.out.print("Service is Create");
        new Thread(){
            public void run() {
                while (!quit) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    count++;
                }
            }
        }.start();
    }

    public boolean onUnbind(Intent intent){  //解帮的时候回调
        System.out.print("Service is onUnbind");
        return true;
    }

    public void onDestroy(){   //销毁的时候回调
        super.onDestroy();
        this.quit=true;
        System.out.print("Service is onDestroy");
    }
}

在activity中来使用service

public class ServiceActivity extends AppCompatActivity implements View.OnClickListener{
    MyService.MyBinder myBinder;

    private ServiceConnection connection=new ServiceConnection() {//用于监听连接情况
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) { //连接成功
            System.out.print("service Connected");
            myBinder=(MyService.MyBinder)iBinder;    //将使用iBinder
        }
        @Override
        public void onServiceDisconnected(ComponentName componentName) {  //连接失败
            System.out.print("service Disconnected");
        }
    };

    protected void onCreate(Bundle saveInstanceState) {  
        super.onCreate(saveInstanceState);
        setContentView(R.layout.service_activity);

        Button bind=findViewById(R.id.bind);
        Button unbind=findViewById(R.id.unbind);
        Button state=findViewById(R.id.state);
        bind.setOnClickListener(this);
        unbind.setOnClickListener(this);
        state.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.bind:{    //绑定service
                Intent intent=new Intent(this,MyService1.class); 
                bindService(intent,connection, Service.BIND_AUTO_CREATE); //绑定的时候自动创建service
                break;
            }
            case R.id.unbind:{
                unbindService(connection);  //解绑
                break;
            }
            case R.id.state:{
                  //调用服务的方法实现通信
                Toast.makeText(ServiceActivity.this,"Count:"+myBinder.getCount(),Toast.LENGTH_SHORT).show();
                break;
            }
            default:
                break;

        }
    }
}

六、service的生命周期:

1、如果用startService启动服务

调用---->onCreate()----->onStartCommand()--->service自己运行----->onDestroy()---->service关闭

七、IntentService

对于异步的startService请求,每当客户通过Intent请求来启动该服务,Intent会将Intent加入队列中,然后开启一条新的worker线程来处理Intent,因此不会阻塞主线程。IntentService自己处理耗时的任务。

特征:

1、单独地创建worker线程来处理Intent请求;

2、单独地worker线程来处理onHandleIntent()方法实现地 ,开发者无需处理多线程问题。

3、当请求处理完成,IntentService会自动停止,开发者无需调用stopSelf()方法。

4、onBinder()方法默认实现,默认返回null

5、startCommand()地方法默认实现,实现将请求地Intent添加到队列中。

系统服务将在下一节讲到。

猜你喜欢

转载自blog.csdn.net/wenge1477/article/details/81384414