Service组件的基础认识

来源:互联网 发布:声音模拟的软件 编辑:程序博客网 时间:2024/06/08 13:50

实现服务组件


由于手机屏幕的限制,通常情况下在同一时刻仅有一个应用程序处于激活状态,并能够显示在手机屏幕上,因此,应用程序需要一种机制,在没有用户界面的情况下,能够长时间在后台运行,实现应用程序的特定功能,并能够处理事件或更新数据.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();@Overridepublic IBinder onBind(Intent intent) {LogI("onBind() is called ");return binder;}@Overridepublic void onCreate() {super.onCreate();LogI("onCreate() is called ");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {LogI("onStartCommand() is called ");return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {LogI("onDestroy() is called ");super.onDestroy();}@Overridepublic 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() {@Overridepublic void onServiceDisconnected(ComponentName name) {LogI("onServiceDisconnected is call ....");}@Overridepublic 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;@Overridepublic IBinder onBind(Intent intent) {return new MainBinder();}@Overridepublic void onCreate() {super.onCreate();Log.i(tag, "onCreate()");}@Overridepublic void onDestroy() {super.onDestroy();Log.i(tag, "onDestroy()");}@Overridepublic boolean onUnbind(Intent intent) {Log.i(tag, "onUnbind()");return super.onUnbind(intent);}@Overridepublic 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);textView = new TextView(this);setContentView(textView);textView.setText("This is second Activity");textView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {unbindService(conn);finish();}});conn = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {}@Overridepublic 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组件那么频繁使用,码得也不多,故记录。




0 0