Service相关

1.启动服务:
1.1 启动服务的方法:

1.创建一个类继承Service,只有onBind方法是必须重写的;

public class MyService extends Service {

	@Override
    public void onCreate() {
        super.onCreate();
    }
    
	@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }
    
 	@Override
    public void onDestroy() {
        super.onDestroy();
    }
    
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

2.在Manifest文件中声明该Service:

 <service android:name=".MyService"
            android:enabled="true"							
            android:exported="true"							允许除了当前程序之外的其他程序访问这个服务
            android:icon="@drawable/background_blue"
            android:label="string"
            android:process="string"						运行的进程
            android:permission="string">					
 </service>

3.启动/关闭服务:

	Intent intnet = new Intent(this,MyService.class);
	startService(intnet);

	stopService(intnet);
1.2 启动服务的生命周期:

在正常的开启关闭服务情况下生命周期为:onCreat->onStartCommand->onDestory;
连续多次开启同一个服务只有第一次会执行onCreat,以后只会执行onStartCommand;

启动的服务即使客户端被销毁也不影响Service继续运行

1.3 onStartCommand方法的返回值:

1.START_STICKY:
当前服务终止后,系统会尝试重建Service,但之前的Intent不会保留(意思是重启时onStartCommand的Intent参数为null)
2.START_NOT_STICKY:
当前服务终止后,系统不会尝试重建Service
3.START_REDELIVER_INTENT:
当前服务终止后,系统会尝试重建Service,并保留之前的Intent;
4.START_STICKY_COMPATIBILITY:
START_STICKY的兼容版本,但不保证服务被终止后一定能重启。

2.绑定服务:
2.1 绑定服务的方法:

1.需要创建一个Binder对象对外提供服务的接口:

class MyBinder extends Binder {
	public void function1() {
	}
	public void function2() {
	}
}

2.在onBinder中返回这个Binder对象,

public class MyService extends Service {
	private MyBinder mBinder = new MyBinder();
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
}

3.创建一个ServiceConnection对象作为绑定/解绑时候的回调

	 MyBinder mBinder;
	 ServiceConnection connection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                mBinder= (MyService)service;				//这里的service就是onBind方法给返回的binder对象
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
				//当服务意外中断时会执行这个方法,正常取消绑定不会执行
            }
        };

4.绑定/解绑Service:

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

	unbindService(connection);
2.2 绑定服务的生命周期:

bindService时Service的onCreate和onBind方法会执行,但onStartCommand方法不会执行;
unbindService时Service的onDestory方法会执行;

绑定的服务在客户端被销毁后也停止运行

2.3 通过Messenger绑定服务:

Service端:

public class MyService extends Service {
	Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Messenger client = msg.replyTo;
            ...                  
      		//这里在Service端处理Client发来的消息
      		client.send(replyMsg);
        }
    };
    private Messenger messenger = new Messenger(mHandler);

    @Override
    public IBinder onBind(Intent intent) {
          return messenger.getBinder();
    }
}

Client端:

public class mActivity extends Activity {
	private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
      		//这里在Clinet端处理Service发来的消息
        }
    };
    //Client端用这个Messenger发送消息
    private Messenger clientMessenger= new Messenger(mHandler);
    
	private Messenger serviceMessenger = null;
 	private ServiceConnection connection = new ServiceConnection() {
          @Override
          public void onServiceConnected(ComponentName name, IBinder service) {
                mService = new Messenger(iBinder);	
          }

          @Override
          public void onServiceDisconnected(ComponentName name) {
				//当服务意外中断时会执行这个方法,正常取消绑定不会执行
           }
    };
	
	private void sendMsg(){
		  Message message = Message.obtain();
		  msg.replyTo = clientMessenger;
		    ....
		  mService.send(msg)
	}
}
3.前台服务:

只要在Service中调用startForeground方法即可启动前台进程:

public class MyService extends Service {

	@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
     	NotificationCompat.Builder builder=new NotificationCompat.Builder(this);
     	//设置Notification属性,略
    	Notification notification = builder.Builder(this);
    	//第一个参数int是Notification的ID,有多个Notification的话ID不同就可以
    	startForeground(1,notification);		
        return super.onStartCommand(intent, flags, startId);
    }

	@Override
    public void onDestroy() {
    	stopForeground(true);
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}
4.IntentService

IntentService继承自Service,任务完成后自动停止,不在主线程处理任务,可用于执行耗时任务。由于它是一个Service,它的优先级比线程要高,不易被系统杀死;

源码:

public class IntentService extends Service {
	private Handler mServiceHandler;
	
	public void onCreate() {
		HandlerThread thread = new HandlerThread();
		thread.start();
		mServiceLooper = thread.getLooper();
		//继承了Handler,任务实际都是通过它调用onHandleIntent去处理
		mServiceHandler = new ServiceHandler(mServiceLooper);
	}
	
	//onStartCommand()会调用onStart()这个方法
	//intent中包含了外部传递给Service执行任务需要的参数
	public void onStart(Intent intent,int startId) {
		Message msg = mServiceHandler.obtainMessage();
		msg.arg1 = startId;
		msg.obj = intent;
		//发送的消息都会传递给ThreadHandler处理
		//ThreadHandler处理任务时就会调用onHandleIntent()方法
		mServiceHandler.sendMessage();
	}
	
	protected abstract void onHandleIntent();
}

使用:
继承IntentService :

public class MyIntentService extends IntentService {
	public MyIntentService() {
	}
	@override
	protected void onHandlerIntent(Intent intent){
		//处理耗时任务
	}
}

像普通Service一样启动:

	Intent intent = new Intent(this,MyIntentService.class);
	//...向intent中传入参数
	startService(intent);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值