Started Service就是启动之后可以在后台无限期的运行,比如通过Activity组件的startService方法启动之后,如果不用指定方法关闭,这个Service就会一直运行。
下面说一下怎么来实现这种Service:
(在主界面设置两个按钮,来实现启动和停止Service,当启动Service后,在后台打印从0开始的数据的累加日志,以便我们观察)
布局,不说了,上图在File->new->Service->Service中新建一个Service,并重写里面的方法,一般来说要实现onCreate()、onBind()、onStartCommand()和onDestroy()这四个方法。
public class MyService extends Service {
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
//Service创建时调用
@Override
public void onCreate() {
//Log.i("Service","Service创建");
super.onCreate();
}
//Service启动时调用
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//Log.i("Service","Service启动");
new Thread(new Runnable() {
@Override
public void run() {
int i=0;
while(isRunning()){
Log.i("Service",String.valueOf(++i));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
//Service停止时调用
@Override
public void onDestroy() {
Log.i("Service","Service凉了");
super.onDestroy();
}
//这个方法是用来判断后台是否有Service在运行的
public boolean isRunning(){
ActivityManager activityManager=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
//获取所有正在运行的Service
ArrayList runningService= (ArrayList) activityManager.getRunningServices(30);//30代表最大值
for (int i=0;i<runningService.size();i++){
if (runningService.get(i).service.getClassName().toString().equals("com.example.demo.MyService")){
return true;
}
}
return false;
}
}
然后在MainActivity中启动Service
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Intent intent=new Intent(MainActivity.this,MyService.class);
Button start= (Button) findViewById(R.id.startbutton);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startService(intent);
}
});
Button stop= (Button) findViewById(R.id.stopbutton);
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopService(intent);
}
});
}
在运行程序后点击启动按钮在Log面板中效果如下,就算是你关闭应用后台依然在不断刷新,除非点击停止按钮。————————————————————————————————————————————
Started Service的生命周期:
在上面的例子中,把注释掉的Log.i()恢复,可以发现
在点击启动按钮时会调用onCreate()和onStartCommand()方法。
在点击停止按钮时会调用onDestroy()方法。
可以看下图
作者:织田、信长