Service是android系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activity的级别差不多,区别是Service只能运行在后台不提供用户界面,并且可以和其他组件进行交互。一个Service是一个可以长期运行在后台的应用程序组件,不提供用户界面。 另一个应用程序组件可以启动一个服务,它将继续在后台运行,即使 用户切换到另一个应用程序。 此外,一个组件可以绑定到一个服务 与之交互,甚至执行进程间通信(IPC)。 例如,一个服务可以在后台处理网络交易、播放音乐、执行文件I / O,或与内容提供者交互等。
一个服务启动方式基本上有两种形式:
Started:
一个服务将被开启,当一个应用程序组件(例如,一个Activity
)启动它 调用
startService()
。一个服务一旦启动,可以无限期地在后台运行,即使启动它的组件被摧毁。通常情况下, 开始服务执行一个操作,不向调用者返回一个结果。 例如,它可能通过网络下载或上传文件。 当操作完成, 服务应该自动销毁。
Bound:
一个服务被“绑定”当一个应用程序组件绑定到它通过调用bindService()。一个绑定服务提供了一个客户端 - 服务器接口,允许组件与服务交互,发送请求,得到的结果,甚至这样做跨进程与进程间通信(IPC)。一个service可以同时和多个客户绑定,当多个客户都解除绑定之后,系统会销毁service
注意:一个服务运行在其宿主进程,该服务不会创建自己的线程,并不在一个单独的进程中运行的主线程(除非另行指定)。这意味着,如果你的服务是打算进行任何耗时操作(例如MP3播放或网络下载等),你应该在该服务中创建一个新的线程来执行该工作。通过使用一个单独的线程,你会减少应用程序的不响应(ANR)错误和应用程序的UI主线程可以继续致力于为响应用户的操作。
Service重要方法:
1、onCreate();当服务被创建时调用,只调用一次。2、onStartCommand();它与startService()对应,当服务启动后调用。如果你重写了该方法,你就必须在任务结束以后,调用stopSelf()或者stopService()来停止服务。如果你是绑定的服务,就不需重新该方法了。
3、onBind();它与bindService()对应,通过返回IBinder,来与service交流。如果你并不想绑定它,就直接返回null
4、onDestroy();当服务不再被使用时需要销毁时调用,你应该在这里用来停止线程,注销监听器,广播。
Service生命周期:
1、startService(Intent)方式启动:
onCreate()--->onStartCommand(Intent intent, int flags, int startId)
stopService(Intent)、在服务本类中调用stopSelf()关闭服务:
onDestroy()
2、bindService(Intent,ServiceConnection,int)绑定启动:
onCreate()-->onBind(Intent intent)
unbindService(ServiceConnection)解除绑定:
onUnbind(Intent intent)-->onDestroy()
与Activity一样:清单文件注册:
<service android:name=".services.MyService"/>
实例:实现Service与组件进行通信。
1、MyService继承Service
public class MyService extends Service { private Random myRandom=new Random(); private MyBinder binder=new MyBinder(); private Timer mTimer=new Timer(); private Callback callback; public MyService() { } /** * 定时器处理事件 */ TimerTask task = new TimerTask(){ @Override public void run() { // TODO Auto-generated method stub if(callback!=null){ /* * 得到随机数据 通过接口回调... */ callback.getNum(myRandom.nextInt()); } } }; public int getRandomInt(){ return myRandom.nextInt(); } @Nullable @Override public IBinder onBind(Intent intent) { Log.i("1111111","onBind-----"); return binder; } @Override public void onCreate() { Log.i("1111111","onCreate-----"); /* * 执行Timer 1000毫秒执行一次 */ mTimer.schedule(task, 0, 1000); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("1111111","onStartCommand-----flags=="+flags); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { Log.i("1111111","onDestroy-----"); mTimer.cancel(); super.onDestroy(); } @Override public boolean onUnbind(Intent intent) { Log.i("1111111","onUnbind-----"); return super.onUnbind(intent); } public interface Callback { void getNum(int num); } public void getCallBack(Callback callback){ this.callback=callback; } public class MyBinder extends Binder{ public MyService getMyService(){ return MyService.this; } } }
2、ServicesActivity中使用:onResume()时启动,onPause()时解除绑定
public class ServicesActivity extends AppCompatActivity { private MyService myService=null; private Toast mToast=null; private Handler mHandler=new Handler(){ @Override public void handleMessage(Message msg) { int num= (int) msg.obj; if(mToast==null){ mToast=Toast.makeText(ServicesActivity.this,"num=="+num,Toast.LENGTH_SHORT); }else { mToast.setText("num=="+num); } mToast.show(); super.handleMessage(msg); } }; private ServiceConnection conn=new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { MyService.MyBinder myBinder= (MyService.MyBinder) iBinder; myService=myBinder.getMyService(); int iii=myService.getRandomInt();//只会执行一次 myService.getCallBack(new MyService.Callback() { @Override public void getNum(int num) { Log.i("111111","num==="+num); Message message=new Message(); message.what=0; message.obj=num; mHandler.sendMessage(message); } }); } @Override public void onServiceDisconnected(ComponentName componentName) { Toast.makeText(ServicesActivity.this,"onServiceDisconnected===",Toast.LENGTH_SHORT).show(); Log.i("111111","onServiceDisconnected==="); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_services); } @Override protected void onResume() { bindService(new Intent(this, MyService.class),conn,BIND_AUTO_CREATE); super.onResume(); } @Override protected void onPause() { unbindService(conn); super.onPause(); } }