总结一下本地的service的启动方式

服务(service)是android四大组件之一!一般用来执行不提供用户交互界面的操作,例如:下载、播放音乐。
大致可以划分为本地service和远程service!
1.本地service: 就是和当前应用在同一个进程中的service
2.远程service: 不同进程间的service访问,不同的进程间无法使用一般的方式共享数据。主要通过AIDL接口实现。(本篇暂不总结)
第一,本地service。
主要有两种启动方式:

一.非绑定模式

       startService(Intent intent):启动一个service 
       stopService(Intent intent) :停止一个service 

·绑定模式

bindService(Intent intent, ServiceConnection conn, int flags)

unbindService(ServiceConnection conn); 


先看看非绑定模式

先贴上Service 的代码:

public class MainService extends Service {
	private static final String TAG = "MainService";

	@Override
	public void onCreate() {
		Log.i(TAG, "MainService-onCreate");  
		super.onCreate(); 
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		Log.i(TAG, "MainService-onStartCommand");  
		return super.onStartCommand(intent, flags, startId);  
	}

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		Log.i(TAG, "MainService-onBind");  
		return null;
	}
	
	@Override
	public boolean onUnbind(Intent intent) {
		Log.i(TAG, "MainService-onUnbind");  
		return super.onUnbind(intent);
	}

	@Override
	public void onRebind(Intent intent) {
		Log.i(TAG, "MainService-onRebind");  
		super.onRebind(intent); 
	}

	@Override  
	public void onDestroy() {  
		Log.i(TAG, "MainService-onDestroy");  
		super.onDestroy();  
	}  
}

下面是点击启动的代码(Activity界面)

statrBtn = (Button) this.findViewById(R.id.start_btn);
	statrBtn.setOnClickListener(new OnClickListener(){

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub	
			Log.i("MainService", "MainActivity click start"); 
			Intent mIntent = new Intent(MainActivity.this, MainService.class);
			startService(mIntent);
		}
		
	});
		
	stopBtn = (Button) this.findViewById(R.id.stop_btn);
	stopBtn.setOnClickListener(new OnClickListener(){
		@Override
		public void onClick(View v) {
			Log.i("MainService", "MainActivity click stop"); 
			// TODO Auto-generated method stub
			Intent mIntent = new Intent(MainActivity.this, MainService.class);
			stopService(mIntent);				
		}			
<span style="white-space:pre">	</span>}
);

当第一次点击statrBtn 的时候,Mainservice 的 onCreate 和onStartCommand 都做了打印

当再一次点击statrBtn Mainservice 的onCreate没有被执行,只执行了onStartCommand 

点击 stopBtn Mainservice onDestroy 被执行!

再点击statrBtn 的时候 Mainservice 的 onCreate 和 onStartCommand 又重新做了执行!

甚至按back键退出Activity, 重新再回来Activity,点击statrBtn,也只执行onStartCommand,说明startService并没有绑定Activity和Mainservice


再试试绑定模式

先贴上BindService 的代码:

public class BindService extends Service {
	private static final String TAG = "BindService";

	public void BindMethod(){
		Log.i(TAG, "BindService-->BindMethod()");
	}

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		Log.i(TAG, "BindService-onUnbind");  
		return myBinder;
	}
	
	@Override
	public boolean onUnbind(Intent intent) {
		Log.i(TAG, "BindService-onUnbind");  
		return super.onUnbind(intent);
	}

	@Override
	public void onRebind(Intent intent) {
		Log.i(TAG, "BindService-onRebind");  
		super.onRebind(intent); 
	}

	@Override  
	public void onDestroy() {  
		Log.i(TAG, "BindService-onDestroy");  
		super.onDestroy();  
	}  
	
	public class MyBinder extends Binder{
		public BindService getService(){
			return BindService.this;
		}
	}

	private MyBinder myBinder = new MyBinder();
}

注意,跟MainService不同的是 里面定义了一个Binder!

Activity的代码

先定义一个

ServiceConnection 

private boolean connFlag;
	private BindService bindService;
	private ServiceConnection conn = new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			Log.i("MainService", " onServiceDisconnected"); 
		}

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			MyBinder binder = (MyBinder)service;
			bindService = binder.getService();
			bindService.BindMethod();
			connFlag = true;
		}
	};

		bindBtn = (Button) this.findViewById(R.id.bind_btn);
		bindBtn.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent = new Intent(MainActivity.this,BindService.class);
				bindService(intent, conn, Context.BIND_AUTO_CREATE);
			}

		});

		unbindBtn = (Button) this.findViewById(R.id.unbind_btn);
		unbindBtn.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if(connFlag){
					unbindService(conn);
					connFlag = false;
				}				
			}			
		});

注意:在Activity的文件是通过onServiceConnected里获得的 bindService = binder.getService();

再通过bindService 去调用 BindService 提供的方法比如bindService.BindMethod();,达到调用的目的!


第一次点击绑定:进入onCreate和onBind 并且直接进入Activity定义的
@Override
public void onServiceConnected(ComponentName name, IBinder service) {

}
一旦绑定成功后再次或多次点击绑定没有任何作用,不进入任何的生命周期


 
点击解锁 进入onUnbind和onDestroy注意解锁的时候不会进入Activity定义的
@Override
public void onServiceDisconnected(ComponentName name) {}

它的调用时机是当Service服务被异外销毁时,例如内存的资源不足时这个方法才被自动调用。


当绑定之后,退出该Activity的时候,onUnbind和onDestroy就会被自动调用解锁


就是这样子了!呵呵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值