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组件那么频繁使用,码得也不多,故记录。
- Service组件的基础认识
- BroadcastReceiver组件的基础认识
- Android 四大组件之认识Service
- vuejs 组件的认识
- Android Service 组件基础应用
- Android基础(一):四大组件与另一个重要组件Intent的简单认识
- android的service组件
- Android的Service组件
- JMS的基础认识
- CGAffineTransform的基础认识
- Http的基础认识
- Servlet的基础认识
- 【Android基础】-Service组件使用详解
- Android基础——四大组件Service
- Android基础之四大组件---Service(一)
- 基础回顾--四大组件之一--Service
- 5.Android基础:四大组件之----->Service
- 关于web service的几点认识
- linux查看CPU位数
- MVC入门教程
- Android 4.4的栈结构变化
- work_weipa_gridview
- EditPlus Java 运行环境配置
- Service组件的基础认识
- 比较好的pdf转换成word转换器在线
- 不要为无效社交浪费时间!你自己不优秀,谈什么人脉!
- ngx_lua模块中的共享内存字典项API
- Android LayoutInflater原理分析,带你一步步深入了解View(一)
- 设计模式之一单例模式
- 【POJ】1442 Black Box 静态第k大,treap
- 特斯拉邀请黑客寻找特斯拉软件系统的漏洞
- Intent中的四个重要属性——Action、Data、Category、Extras