服务,作为Android四大组件之一(相信大家都知道Android的四大组件是什么了),有非常多重要的知识点,当然作为Android开发的新人,我们首先要从服务最基本的用法开始学习。还是闲言少叙,我们直奔主题,开始学习。
要学习服务,首先我们要来定义一个服务。打开Android Studio,新建一个ServiceTest1项目,然后在com.example.servicetest1上右键,然后New--Service--Service,会弹出一个窗口,MyService是这个服务的名称,其他的选项我们默认选中就可以了,点击Finish完成。这样我们就创建好了一个服务。下面是MyService这个服务中的代码:
public class MyService extends Service {
public MyService() { } @Override public IBinder onBind(Intent intent) { throw new UnsupportedOperationException("Not yet implemented"); }
}
可以看到,MyService是继承自Service类,说明这是一个服务。接下来,我们要在这个服务里面做一些事情了。也就是具体的逻辑
可以看到,我们在MyService服务里面重写了图中红框里面的内容。其中,onCreate()方法是在服务“第一次”创建的时候调用,onStartCommand()方法是在每次启动服务的时候调用,而onDestroy()方法顾名思义,就是在服务销毁的时候调用。通常情况下,可以将逻辑写在onStartCommand()方法中。 另外不要忘记,一定要在AndroidManifest.xml中注册服务。当然了,这方面Android Studio已经帮助我们自动创建号了。 这样,我们就已经将一个服务完全定义好了。
定义好了服务之后,接下来,我们来看看如何启动和停止服务。这里主要还是借助Intent来实现。
首先我们来编辑一下activity_main.xml中的代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/start_service" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Start Service" android:textAllCaps="false" /> <Button android:id="@+id/stop_service" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Stop Service" android:textAllCaps="false" /> </LinearLayout>
很简单的布局文件,就是在页面添加了两个点击按钮,分别用于启动服务和停止服务。然后再来编辑MainActivity中的代码逻辑,如下所示:public class MainActivity extends AppCompatActivity implements View.OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button startService = (Button) findViewById(R.id.start_service); Button stopService = (Button) findViewById(R.id.stop_service); startService.setOnClickListener(this); stopService.setOnClickListener(this); } @Override public void onClick(View v){ switch (v.getId()){ case R.id.start_service: Intent startIntent = new Intent(this, MyService.class); startService(startIntent); //启动服务 break; case R.id.stop_service: Intent stopIntent = new Intent(this, MyService.class); stopService(stopIntent); //停止服务 break; default: break; } } }
首先,我们在onCreate()方法里面,分别获取到了两个按钮的实例,然后给他们注册了点击事件。接着在onClick()方法中,在Start Service的点击事件里,先构建了一个Intent对象,然limian j后通过startService()来启动MyService这个服务。同样,停止服务也是相同的道理。那么我们如何确定服务已经启动或者已经停止了呢。很简单,我们在MyService的几个方法里面加上监控日志就可以了。如下所示:
@Override public void onCreate(){ super.onCreate(); Log.d("MyService", "onCreate executed"); } @Override public int onStartCommand(Intent intent, int flags, int startId){ Log.d("MyService", "onStartCommand executed"); return super.onStartCommand(intent,flags,startId); } @Override public void onDestroy(){ super.onDestroy(); Log.d("MyService", "onDestroy executed"); }
可以看到,在MyService服务中,我把每一个方法里面都加上了日志,一旦该方法执行,日志就会打印出来,我们就可以知道,服务有没有启动,有没有停止了。接下来,运行程序,主界面如图所示:
点击一下Start Service按钮,观察logcat中打印的日志,如下图所示:
可以看到,MyService服务中onCreate()和onStartCommand()方法都执行了。并且我们可以在手机开发者选项的正在运行的服务里面找到,如下图:
不知道大家有没有疑问,那就是onCreate()方法和onStartCommand()方法到底有什么区别,因为刚刚点击启动服务按钮,两个方法都执行了。其实,onCreate()方法是只有服务在第一次启动的时候才会执行,之后在点击启动服务,就会只执行onStartCommand()方法了。我们可以再次点击一下启动服务的按钮,看一下logcat日志的现实,如下图:
这样,我们的疑问就彻底解决了。到这里,关于服务的启动,停止以及服务里面所重写的方法之间的区别我们就都掌握了。