Service

Service简介

  1. service也有自己的生命周期,创建,和配置Service和Activity类似。
  2. 开发Service需要两个步骤
  3. 创建Service的子类,
  4. 在AndroidManifest中配置service。
  5. 还有一点和Activity相似之处是 都可以调用Context 定义的getResources(),getContentResolver(),因为它们都是从Content中派生出来的。

    生命周期

    该方法是Service的抽象方法,用于活动和服务之间进行通信。

IBinder onBind(Intent intent) 
  • 当服务被第一次创建的时候,立即回调该方法。
 onCreate()
  • 每次客户端调用startService()方法的时候,都会调用
int onStartCommand(Intent intent, int flags, int startId)

onStart()//2.0版本之前使用,废弃由onStartCommand代替,为了向前兼容,在调用//onStartCommand()的时候,仍然会调用onStart()
  1. 当该服务上所有绑定的客户端都取消绑定是,会回调该方法。
  2. boolean onUnbind(Intent intent)

    • 如果我们希望服务做些事情,只需要在onCreate(),和 onStartCommand()定义相关的业务代码就好了。
    • AndroidManifest中
      注册
//配置service可使用<service >元素,
//也可使用< intent-filter>,来注明该服务可以被那些活动启动
 <!-- 配置一个service组件 -->
        <service android:name="com.xiaoxu.administrator.myserviceapp.service.MyService">
            <intent-filter>
                <!-- 配置action-->
                <action android:name="com.xiaoxu.administrator.myserviceapp.service"/>
            </intent-filter>
        </service>>
  • Android中启动服务的两种方式,

  • startService();

    通过Context的startService()

  • 活动和服务没有关系,活动退出,服务仍在
  • 取消服务,stopService()即可取消服务。
  • bindService()

    与Service进行通信

    如果服务和访问者之间需要进行方法调用和数据交换,则应该使用bindService(),和unbindService()方法来启动服务和关闭服务。

  • 在开发Service类的时候,该Service类提供了onbind方法,在绑定本地服务的情况下,onbind()方法中返回的对象,将会返回到onServiceConnected(ComponentName name, IBinder service) service参数中,可以从参数中取出bind对象,并调用服务中的方法。
package com.xiaoxu.administrator.myserviceapp.service;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

/** * Created by Administrator on 2016/4/20. */
public class MyService extends Service {

    public DownloadBinder mBinder = new DownloadBinder();
    public class DownloadBinder extends Binder {

         public void startDownload(){

        }
        public int getProgress(){

            return 60;
        }
    }
    @Override
    public IBinder onBind(Intent intent) {

        return mBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("MyService","onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Log.d("MyService","onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }
}
  • 访问者 –活动
package com.xiaoxu.administrator.myserviceapp;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Binder;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.xiaoxu.administrator.myserviceapp.service.MyService;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
// Intent intent = new Intent();
// //intent.setAction("com.xiaoxu.administrator.myserviceapp.service");

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

       this.startService(intent);

        //flags 绑定服务的参数三 指定绑定服务的时候,是否创建服务,0 不创建服务,BIND_AUTO_CREATE 绑定是自动创建服务
        //conn 是一个ServiceConnection对象,用于监听访问者和Service之间的连接状况。
        //onServiceConnected 访问者和服务者成功连接时,会调用该方法。

        bindService(intent,conn,BIND_AUTO_CREATE);
    }

    ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {

            MyService.DownloadBinder downloadBinder  = (MyService.DownloadBinder) service;

            downloadBinder.startDownload();//伪代码 调用服务中的方法
            downloadBinder.getProgress();
        }
        @Override
        public void onServiceDisconnected(ComponentName name) {
             //onServiceDisconnected 当服务所在的宿主进程由于异常终止或其他原因导致服务和访问者之间断开连接时,调用
        }
    };

}
  • 一旦在项目中任何位置调用了Context的startService()方法,相应的服务就会启动起来,并回调onstartCommand()方法。如果这个服务之前没有创建过,onCreate()会先执行,

  • 每启动一次服务,onstartCommand()方法就会被调用一次。不管调用多少次启动服务,只需要调用一次stopService() 或者stopSelf()就可以停下来。

  • 如果只绑定服务,并没有启动服务,那么会执行onCreate() —>onServiceConnected()和onServiceDisconnected()方法里做的事情,onstartCommand()并不会执行。

  • 可以调用Context类的bindService()方法来获取一个服务持久连接,这时候就会回调服务中onBind()方法,类似的服务如果之前没有创建过,就先执行onCreate(),在执行onBind()方法。之后调用方可以获取到onBind()方法中返回的对象。这样就可以与服务进行通信了。

  • Android的系统机制,一个服务如果被启动或者被绑定之后,就会一直处于运行状态。必须要让两者条件都不满足,服务才可以被销毁。 所有这种情况下要同时调用onStop(),unbindService().

  • -

你可能感兴趣的:(Ser-Act-通信)