@universal
2018-10-09T08:36:45.000000Z
字数 3353
阅读 386
简介:Service作为Android四大组件之一,与Activity的地位是并列的,不同的是Service主要位于后台执行长时间的操作,(ep:一个Service可以在后台执行网络请求、播放音乐、执行文件读写操作)一般不需要与用户交互,也就不用依赖于UI界面。However,Service一旦启动也就具有了生命周期,用法和Activity类似。
---注意:Service和线程是两个不同的概念。Servie是系统的组件,而Thread是程序执行的最小单元。而且Service是运行在主线程里的,所以为了不出现ANR可以在服务里创建一个线程来处理复杂耗时的任务。在服务里创建线程是为了方便控制。
public class MyService extends Service {
public static final String TAG = "MyService";
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate()");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId){
Log.d(TAG, "onStartCommand()");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy() ");
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
<service android:name=".MyService" ></service>
生命周期
从图中可以看出,Service和Activity一样,都是从oncreate()开始到ondestroy()结束。
贴个实例:
public class MainActivity extends AppCompatActivity {
private Button button1;
private Button button2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1= (Button) findViewById(R.id.b_start);
button2= (Button) findViewById(R.id.b_stop);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,MyService.class);
startService(intent);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,MyService.class);
stopService(intent);
}
});
}
}
注意: startService()启动Service之后,再bindService()绑定,此时只会回调onBind()方法;若想回调Service的destory()方法,需要同时调用 stopService()和 unbindService()方法才能让服务销毁掉。
活动与服务间的通信是通过bindservice(Intent service,ServiceConnection coon,int flags)来实现的,首先我们得创建一个匿名类获取到ServiceConnection,然后重写里面的onServiceConnected()方法和onServiceDisconnected()方法,可以处理活动与服务成功绑定时的任务。比如我们可以得到服务里Binder的实例,通过这个实例,就可以在activity中去控制服务。
/Mainactivity/
private ServiceConnection serviceConnection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder ibinder) {
mybinder= (MyService.mybinder) ibinder;
mybinder.pr();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
....//其他操作
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,MyService.class);
bindService(intent,serviceConnection,BIND_AUTO_CREATE);
}
});
button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
unbindService(serviceConnection);
}
});
/MyService/
private mybinder mybinder=new mybinder();
class mybinder extends Binder{
public void pr(){
Log.d(TAG,"onBind()");
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mybinder;
}