安卓四大组件之Service
今天来入门一下service这个组件,这玩意是在你后台做一些必要的工作。
**
1.什么是service?
**
从google官网看的,官方的描述是这样的。
A Service is an application component representing either an application’s desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use. Each service class must have a corresponding declaration in its package’s AndroidManifest.xml. Services can be started with Context.startService() and Context.bindService().
懂英语的话就一目了然了,英语水平差点的话就可以有道了。
翻译过来就是说:
服务是应用程序组件,它表示应用程序希望执行长时间运行的操作,而不与用户交互,或为其他应用程序提供功能。每个服务类在其包的androidmanifest.xml中都必须有相应的“声明”。可以使用Context.startService()和context.bindservice()启动服务。
Service是一种在后台长期运行的。没有界面的组件,由其它组件调用进行。
服务不太会被kill,即使在内存不足的时候被kill,当内存恢复足够的时候,服务又会自己的复活。比如:下载的时候就可以放入服务中来做,启动服务,完成时,关闭服务。
2.如何创建与使用service
我们要在manifest文件里进行声明,当然我们使用as的时候我们也可以通过菜单进行快速的创建service省去手动在manifest文件添加的麻烦。会有两种方法。
第一种
第一步:创建一个service类,并且分别重写它的父类方法,并在manifest文件里面生命注册
<service android:name=".MyService"/>
public class MyService extends Service {
@Override
public void onCreate() {
Log.v("dd","onCreate");
super.onCreate();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.v("dd","onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.v("dd","onDestroy");
super.onDestroy();
}
}
仅仅是添加了log日志打印输出。看看生命周期的顺序。然后在activity_main中添加两个连个按钮控件
<Button
android:id="@+id/btn_start"
android:text="Start Service"
android:textAllCaps="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn_stop"
android:text="Stop Service"
android:textAllCaps="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
然后在activity类里面测试:
public class MyActivity extends Activity implements View.OnClickListener {
private Button btn_start;
private Button btn_stop;
private Intent intent;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
intent = new Intent(this,MyService.class);
}
private void initView() {
btn_start= (Button) findViewById(R.id.btn_start);
btn_stop= (Button) findViewById(R.id.btn_stop);
btn_start.setOnClickListener(this);
btn_stop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_start:
startService(intent);
break;
case R.id.btn_stop:
stopService(intent);
break;
}
}
}
当点击start按钮的时候,会看到控制台输入以下的文字:
06-21 06:51:15.995 3006-3006/com.does.service V/dd: onCreate
06-21 06:51:16.001 3006-3006/com.does.service V/dd: onStartCommand
当点击stop按钮的时候会调用:
06-21 06:51:22.829 3006-3006/com.does.service V/dd: onDestroy
第二种
使用bindService的方法
布局文件
<Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="StartService"
android:textAllCaps="false" />
<Button
android:id="@+id/btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="StopService"
android:textAllCaps="false" />
<Button
android:id="@+id/btn_bind"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="BindService"
android:textAllCaps="false" />
<Button
android:id="@+id/btn_unbind"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="UnBindService"
android:textAllCaps="false" />
MainActivity .java文件
public class MainActivity extends Activity implements View.OnClickListener {
private Button btn_bind,btn_unbind;
private ServiceConnection connection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initEvent();
}
private void initEvent() {
connection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
//服务连接成功的时候操作
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
//服务取消连接的时候
}
};
}
private void initView() {
btn_bind= (Button) findViewById(R.id.btn_bind);
btn_unbind= (Button) findViewById(R.id.btn_unbind);
btn_bind.setOnClickListener(this);
btn_unbind.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_start:
Intent start=new Intent(this,MyService.class);
startService(start);
break;
case R.id.btn_stop:
Intent stop=new Intent(this,MyService.class);
stopService(stop);
break;
case R.id.btn_bind:
Log.v("does","bind is clicked");
Intent bind=new Intent(this,MyService.class);
bindService(bind,connection,BIND_AUTO_CREATE);
break;
case R.id.btn_unbind:
Log.v("does","unbind is clicked");
Intent unbind=new Intent(this,MyService.class);
unbindService(connection);
break;
default:
break;
}
}
}
MyService.java
public class MyService extends Service {
@Override
public void onCreate() {
Log.v("does","onCreate");
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.v("does","onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.v("does","onDestroy");
super.onDestroy();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
当我们点击bind按钮的时候,发现
07-10 20:01:39.836 24361-24361/com.example.does.myapplication V/does: bind is clicked
07-10 20:01:39.836 24361-24361/com.example.does.myapplication V/does: onCreate
当我们点击unbind的时候,发现
07-10 20:04:09.774 24361-24361/com.example.does.myapplication V/does: unbind is clicked
07-10 20:04:09.774 24361-24361/com.example.does.myapplication V/does: onDestroy
3.service的生命周期
在上面我们看到了和activity类似差不多的方法。组件都会有生命周期。所以我们介绍一下service的生命周期。
想必,这样就很形象了吧?
第一种,
onCreate()->onStartCommand()->onDestroy()
第二种就是绑定service
onCreate()->onBind()->unBind()->onDestroy()
两种启动service和停止service的区别就是,第一种启动服务时候,当应用程序退出的时候,后台的service依旧运行,只有运行stopService的时候才停止运行service。那么bindService,整个service进程是随着整个应用程序的生命周期存活,当app的使用内存被系统回收了,那么这个service就会跟着被回收。