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();
}
}