您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 第七章android后台服务_电话服务_SMS_MMS
1Android后台服务,Android电话服务,SMS和MMS1.Service技术1.1.Service概念及用途:Adroid中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,那我们什么时候会用到Service呢?比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当我们退出播放音乐的应用,如果不用Service,我们就听不到歌了,所以这时候就得用到Service了,又比如当我们一个应用的数据是通过网络获取的,不同时间(一段时间)的数据是不同的这时候我们可以用Service在后台定时更新,而不用每打开应用的时候在去获取。1.2.Service的类型Service有两种类型:A.本地服务(LocalService):用于应用程序内部B.远程服务(RemoteSercie):用于android系统内部的应用程序之间本地服务用于实现应用程序自己的一些耗时任务,比如查询升级信息,并不占用应用程序比如Activity所属线程,而是单开线程后台执行,这样用户体验比较好。远程服务可被其他应用程序复用,比如天气预报服务,其他应用程序不需要再写这样的服务,调用已有的即可。1.3.启动服务两种式:A.startService(intent):用该方式启动服务,该服务不会跟启动的应用程序绑定在一起,该服务启动完之后,应用程序终止,该服务会继续在后台运行B.bindService(intent,conn,Service.BIND_AUTO_CREATE):绑定服务,该服务会跟启动的应用程序绑定在一起,该服务启动完之后,如果应用程序终止,该服务会终止运行1.4.终止服务方式:A.由其它程序来终止服务,context.stopService(intent)或者context.unbindService(conn)B.由服务自己来终止:Service.stopSelf()或者Service.stopSelfResult(startId)1.5.Service生命周期:AndroidService的生命周期并不像Activity那么复杂,只有onCreate(),2onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法,启动多次服务时,会调用onStart()方法多次,但onCreate()只被调用一次,无论onStart()方法调用多少次,停止服务服务只需调用一次即可而启动service,根据onStartCommand的返回值不同,有两个附加的模式:分析onStartCommand方法参数的作用和返回值的作用:1、根据这个方法的返回值不同可以有两种启动模式START_NOT_STICKY,START_STICKY,(当进程被杀死的时候,是否重新启动。如果是参数:START_REDELIVER_INTENT表示当服务所在进程被杀死后,重新启动,并且重新传递Intent内容,其它两个参数不会重新传递intent,都为null)2、返回START_REDELIVER_INTENT的时候,如果不论启动多少次,当重新启动的时候,也会启动多少次。3、是当前服务的标记4、第三个参数startId表示当前启动的Service的次数。3看看官方给出的比较流程示意图:官方文档告诉我们,一个service可以同时start并且bind,在这样的情况,系统会一直保持service的运行状态如果service已经start了或者BIND_AUTO_CREATE标志被设置。如果没有一个条件满足,那么系统将会调用onDestory方法来终止service.所有的清理工作(终止线程,反注册接收器)都在onDestory中完成。拥有service的进程具有较高的优先级官方文档告诉我们,Android系统会尽量保持拥有service的进程运行,只要在该service已经被启动(start)或者客户端连接(bindService)到它。当内存不足时,需要保持,拥有service的进程具有较高的优先级。41.如果service正在调用onCreate,onStartCommand或者onDestory方法,那么用于当前service的进程则变为前台进程以避免被killed。2.如果当前service已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,但是比那些不可见的进程更重要,这就意味着service一般不会被killed.3.如果客户端已经连接到service(bindService),那么拥有Service的进程则拥有最高的优先级,可以认为service是可见的。4.如果service可以使用startForeground(int,Notification)方法来将service设置为前台状态,那么系统就认为是对用户可见的,并不会在内存不足时killed。如果有其他的应用组件作为Service,Activity等运行在相同的进程中,那么将会增加该进程的重要性。1.6.Service与Activity通信:Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL)这一节我不作过多描述,当我们想获取启动的Service实例时,我们可以用到bindService和onBindService方法,它们分别执行了Service中IBinder()和onUnbind()方法。1.7.编写一个后台服务步骤:1.7.1.写一个类继承Service类1.7.2.在清单文件描述Service类1.7.3.服务不能自己启动,必须由其它程序来启动1.8.代码示例:实例一演示如何创建、启动、停止及绑定一个service程序文件/Chapter07_Service_Example/src/com/amaker/ch07/app/MainActivity.javapackagecom.amaker.ch07.app;5importcom.amaker.ch07.app.R;importandroid.app.Activity;importandroid.app.Service;importandroid.content.ComponentName;importandroid.content.Intent;importandroid.content.ServiceConnection;importandroid.os.Bundle;importandroid.os.IBinder;importandroid.util.Log;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.Toast;/***测试Service*/publicclassMainActivityextendsActivity{//声明ButtonprivateButtonstartBtn,stopBtn,bindBtn,unbindBtn;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);//设置当前布局视图setContentView(R.layout.main);//实例化ButtonstartBtn=(Button)findViewById(R.id.startButton01);stopBtn=(Button)findViewById(R.id.stopButton02);bindBtn=(Button)findViewById(R.id.bindButton03);unbindBtn=(Button)findViewById(R.id.unbindButton04);//添加监听器startBtn.setOnClickListener(startListener);stopBtn.setOnClickListener(stopListener);bindBtn.setOnClickListener(bindListener);unbindBtn.setOnClickListener(unBindListener);}//启动Service监听器privateOnClickListenerstartListener=newOnClickListener(){@OverridepublicvoidonClick(Viewv){6//创建IntentIntentintent=newIntent();//设置Action属性intent.setAction(com.amaker.ch07.app.action.MY_SERVICE);//启动该ServicestartService(intent);}};//停止Service监听器privateOnClickListenerstopListener=newOnClickListener(){@OverridepublicvoidonClick(Viewv){//创建IntentIntentintent=newIntent();//设置Action属性intent.setAction(com.amaker.ch07.app.action.MY_SERVICE);//启动该ServicestopService(intent);}};//连接对象privateServiceConnectionconn=newServiceConnection(){@OverridepublicvoidonServiceConnected(ComponentNamename,IBinderservice){Log.i(SERVICE,连接成功!);Toast.makeText(MainActivity.this,连接成功!,Toast.LENGTH_LONG).show();}@OverridepublicvoidonServiceDisconnected(ComponentNamename){Log.i(SERVICE,断开连接!);Toast.makeText(MainActivity.this,断开连接!,Toast.LENGTH_LONG).show();}};//綁定Service监听器privateOnClickListenerbindListener=newOnClickListener(){@Override7publicvoidonClick(Viewv){//创建IntentIntentintent=newIntent();//设置Action属性intent.setAction(com.amaker.ch07.app.action.MY_SERVICE);//绑定ServicebindService(intent,conn,Service.BIND_AUTO_CREATE);}};//解除绑定Service监听器privateOnClickListenerunBindListener=newOnClickListener(){@OverridepublicvoidonClick(Viewv){//创建IntentIntentintent=newIntent();//设置Action属性intent.setAction(com.amaker.ch
本文标题:第七章android后台服务_电话服务_SMS_MMS
链接地址:https://www.777doc.com/doc-1599967 .html