前面一个帖子,小编和大家大概了解了一下AsyncTask的多线程编程技术,今天我想聊一聊Android的四大组件(神器)之一的Service。
要想精通Service的相关知识点,还是需要学习很多东西的,当然小编今天写的这篇文章只能算是让新手快速了解何为Service、如何快速上手并且快速掌握Service的使用方法,算是入门级的教程。好了,老规矩了,废话不多说,我们直接上代码来看看Service如何使用。
PS:在这边小编想插一句嘴,如果大家还在用Eclipse和ADT开发项目,强烈介意尝试或转向AS(Android Studio),至于原因,你问度娘,反正小编自从用了AS,像吃了麦炫,手指停不下来。
----------------------------------------------------------------------------------------------------------------------------------------
【定义一个服务】
首先,我们定义一个MyService.java类,当然作为一个服务类,必须要继承Service(android.app.Service),看代码:
- public class MyService extends Service{
- @Nullable
- @Override
- public IBinder onBind(Intent intent) { // 这是一个抽象方法,那么子类是必须要重写的
- return null;
- }
- }
Service --> public abstract IBinder onBind(Intent intent) 这是一个抽象方法,必须被子类重写!
ok,服务定义好了,不能就这么空吧,光溜溜的总得放点干货,不然这个服务就是个摆设,那么下面我们就让这个服务发挥它的作用!
我们在服务里面重写Service中的另一些常用的方法,看代码:
- public void onCreate() { // 服务创建时调用
- super.onCreate();
- }
- public int onStartCommand(Intent intent, int flags, int startId) { // 服务启动时调用
- return super.onStartCommand(intent, flags, startId);
- }
- public void onDestroy() { // 服务销毁时调用
- super.onDestroy();
- }
这边不得不重点提一下onStartCommand()这个方法,因为我们服务所需要处理的逻辑代码都写在这个方法中。
和添加Activity一样,我们添加了一个服务,那么在AndroidManifest.xml文件中必须进行注册才能生效,而且我需要告诉你,这是Android四大组件所共有的特点!!!
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.xin02ma.myapplication">
- <application
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- ......
- <activity android:name=".MainActivity">
- ......
- </activity>
- <service android:name=".MyService" />
- </application>
- </manifest>
【启动和停止服务】
服务定义好了,下面我们就直接上代码,来看看这个服务如何启动和停止。
(1)先添加两个Button(activity_main.xml)
- <Button
- android:id="@+id/start_service"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/start_service" />
- <Button
- android:id="@+id/stop_service"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/stop_service" />
(2)接下来,修改主函数MainActivity的代码:
- public class MainActivity extends Activity implements View.OnClickListener{
- private Button startService;
- private Button stopService;
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main); // 采用布局
- startService = (Button) super.findViewById(R.id.start_service); // 取得Button实例
- stopService = (Button) super.findViewById(R.id.stop_service); // 取得Button实例
- startService.setOnClickListener(this); // 监控Button,注册按钮事件
- stopService.setOnClickListener(this); // 监控Button,注册按钮时间
- }
- 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;
- }
- }
- }
上面的代码真的是太简单了,主要作了以下工作:
(1)取得startService和stopService两个按钮实例,并且注册了点击事件;
(2)通过Intent对象,调用Activity的startService()和stopService()方法来启动和停止服务。
Notice:你们有没有发现一个问题?这里的活动的启动和停止完全是由活动本身控制的,如果我们start了服务,但是没有点击stop,那么服务会一直处于运行状态,此时服务如何让自己停止下来?
庆幸的是,我们可以在不点击stopService按钮的前提下,调用stopSelf()这个方法就能让服务停下来!这么说不明白?没关系,下面我们会通过代码告诉你怎么用它。
----------------------------------------------------------------------------------------------------------------------------------------
【小测试】
既然上面的代码已经能够完成服务的启动和停止的逻辑流程了,那么口说无凭,也很难让人信服,那小编就打个Log给你看看,我们一起看看Service是如何运作的,来,上代码!
- .....
- private static final String TAG = "MyService";
- ...
- public void onCreate() { // 服务创建时调用
- super.onCreate();
- Log.d(TAG, "onCreate executed");
- }
- public int onStartCommand(Intent intent, int flags, int startId) { // 服务启动时调用
- Log.d(TAG, "onStartCommand executed");
- return super.onStartCommand(intent, flags, startId);
- }
- public void onDestroy() { // 服务销毁时调用
- super.onDestroy();
- Log.d(TAG, "onDestroy executed");
- }
这个代码也太简单了吧,添加了3行Log,目的就是看:在我们点击两个按钮的时候,整个Service什么时候创建,什么时候启动,什么时候毁灭!
请相信我,虽然代码很简单,逻辑也很low,但是这样的学习和思考的过程在以后你编写代码的时候,了解Service的生命周期是很很很重要的!
我们来看一下执行结果,运行程序,查看Logcat中的打印日志:
(1)第一次点击StartService按钮后,MyService中的onCreate()和onStartCommand()方法都执行了,图中黄色箭头所示!
此时,我们可以在手机 --> 设置 --> 应用 --> 运行中看到这个服务,小编给您截个图体验一下:
(2)然后我们点击stopService按钮后,MyService中的onDestory()方法被执行,图中蓝色箭头所示!
(3)此时可能你会有一个疑问?当我们点击了startService按钮以后,onCreate()和onStartCommand()方法同时被执行,这两个方法有什么区别?
OK!图中的红色箭头给了我们答案:onCreat()方法是在服务第一次创建的时候调用的,而onStartCommand()方法则在每次启动服务的时候都会被调用。
当我们在服务未启动的时候,点击startService按钮,则此时会执行两个方法;
但是服务启动完成之后,再次点击(随便你点几次)startService按钮,你会发现只有onStartCommand()方法被执行。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。