Service组件的基础认识

实现服务组件


由于手机屏幕的限制,通常情况下在同一时刻仅有一个应用程序处于激活状态,并能够显示在手机屏幕上,因此,应用程序需要一种机制,在没有用户界面的情况下,能够长时间在后台运行,实现应用程序的特定功能,并能够处理事件或更新数据.Android系统提供了(Service)服务组件,它不直接与用户进行交互,却能够长期在后台运行。有很多情况需要使用Service,典型的例子就是:MP3播放器。
Service非常适用于无需用户干预,且需要长期运行的后台功能。Service没有用户界面,有利于降低系统资源。而且Service比Activity具有更高的优先级,只有在系统资源极度匮乏的情况下,android系统才可能清理掉一部分service来保证系统的运行,而这种情况却又轻易不会出现。即使Service被系统终止了,在系统资源恢复后Service也将自动恢复运行状态,因此可以认为Service是在系统中永久运行的组件。Service除了实现后台服务功能,还可以用于进程间通信,解决两个不同Activity应用程序进程之间的调用和通信问题。

注册组件(Android应用要求所有的应用组件都必须显示进行配置,说的就是4大组件)

 <service android:name=".DemoService"/>
 <service android:name=".BindService"/>

public class BindService extends Service {

	private int count = 0;
	private MyBinder binder = new MyBinder();
	
	@Override
	public IBinder onBind(Intent intent) {
		LogI("onBind() is called ");
		return binder;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		LogI("onCreate() is called ");
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		LogI("onStartCommand() is called ");
		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	public void onDestroy() {
		LogI("onDestroy() is called ");
		super.onDestroy();
	}

	@Override
	public boolean onUnbind(Intent intent) {
		LogI("onUnbind() is called ");
		return true;
	}
	
	public class MyBinder extends Binder{
		public int getCount(){
			return count;
		}
	}
	
	private void LogI(String text){
		android.util.Log.i(getClass().getSimpleName(),text);
	}

}


startService

startService(Intent service)

Service如果是由activity startService启动,则经历

onCreate()--onStartCommand()----------onDestroy()

虽然Service存在的话,就不重复调用onCreate(),但是从onStartCommand()的命名应该可以看出,每次调用了startService()就会调用到它。

startService(Intent )启动过程很类似startActivity(Intent )

private Intent demoService;


demoService = new Intent(this, DemoService.class);


startService(demoService);


stopService(demoService);

bindService

bindService(Intent service, ServiceConnection conn, int flags)

Service如果是由activity bindService启动,则经历

onCreate()--onBind()--onServiceConnected()---------onUnbind()--onDestroy()

如果启动了bindServie而没有unbindService,所在的Activity退出的时候也会有onUnbind()--onDestroy()但是有异常

但是如果没有启动而unbindService也会有异常

private Intent bindService;

bindService = new Intent(this, BindService.class);

bindService(bindService, conn, Service.BIND_AUTO_CREATE);

unbindService(conn);

private ServiceConnection conn = new ServiceConnection() {
	
	@Override
	public void onServiceDisconnected(ComponentName name) {
		LogI("onServiceDisconnected is call ....");
		
	}
	
	@Override
	public void onServiceConnected(ComponentName name, IBinder service) {
		binder = (MyBinder) service;
		LogI("onServiceConnected is call ....");
	}
};

private void LogI(String text){
	android.util.Log.i(getClass().getSimpleName(),text);
}

修改Service中的值

修改Service中的值,因为Service与界面交互比较特殊,使用广播组件可以实现通信,另一方面,使用bindService可以获取的正在运行的Service组件的实例或者创建一个Service并得到实例,进而可以调用Service的公共方法或者公共属性进行数据操作;

stopService只有在所有调用过bindServie的对象中都调了unBindService以后调才能使service的onDestroy被调用。

public class MainService extends Service {
	
	private String tag = "MainService";
	private int number = 0;

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

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

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

	@Override
	public boolean onUnbind(Intent intent) {
		Log.i(tag, "onUnbind()");
		return super.onUnbind(intent);
	}

	@Override
	public void onRebind(Intent intent) {
		super.onRebind(intent);
		Log.i(tag, "onRebind()");
	}
	
	public int getNumber() {
		return number;
	}

	public void setNumber(int number) {
		this.number = number;
	}

	public class MainBinder extends Binder{
		public MainService getServiceIns(){
			return MainService.this;
		}
	}
}

来看看怎么调用上面的方法进行修改numbe值;

public class SecondActivity extends Activity {
	
	private MainService mainService;
	private ServiceConnection conn;
	private TextView textView;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		textView = new TextView(this);
		setContentView(textView);
		textView.setText("This is second Activity");
		textView.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				unbindService(conn);
				finish();
			}
		});
		conn = new ServiceConnection() {
			@Override
			public void onServiceDisconnected(ComponentName name) {

			}

			@Override
			public void onServiceConnected(ComponentName name, IBinder service) {
				MainBinder mainBinder = (MainBinder) service;
				mainService = mainBinder.getServiceIns();
				textView.setText("from Server : "+mainService.getNumber()+"\n");
				mainService.setNumber(mainService.getNumber()+1);
				textView.append("from Server : "+mainService.getNumber()+"\n");
			}

		};
		Intent intent = new Intent(this, MainService.class);
		bindService(intent, conn, Context.BIND_AUTO_CREATE);
	}

}

这样就可以修改正在运行的Service实例的变量了。

由于Service组件没有Activity组件那么频繁使用,码得也不多,故记录。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值