实现服务组件
由于手机屏幕的限制,通常情况下在同一时刻仅有一个应用程序处于激活状态,并能够显示在手机屏幕上,因此,应用程序需要一种机制,在没有用户界面的情况下,能够长时间在后台运行,实现应用程序的特定功能,并能够处理事件或更新数据.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组件那么频繁使用,码得也不多,故记录。