• android之service(一)


    我们有两种方式(start与bind)启动一个Service,每一种方式启动的Service生命周期是不一样的,这篇贴子主要写的是 start service。

    它的生命周期中只有三个阶段:onCreate, onStartCommand(取代原来的onStart方法), onDestroy。如下图:

     

    需要注意的有:

    ① 如果是 调用者 直接退出而没有调用 stopService 的话,那么被启动的 Service 会一直在后台运行,直至其stopService 方法被调用,或者它自己调用stopSelf 方法。

    ② 在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStartCommand()方法。如果调用startService() 方法前服务已经被创建,那么会直接调用onStartCommand()方法。也就是说,多次调用startService()方法并不会导致多次创建服 务。另外,不管被 start 多少次,只需一次 stop 便可将相应的service关闭。 ③ 具体的操作应该放在 onStartCommand() 里面 以下通过截图来看:


    上图的中的四个按钮均是针对于同一个Service进行的操作,此时去 application ,可以查看到 "Running Service" 的列表如下:

     

     

    这个,我们去点击上面的按钮(分别点击startservice 1 和 2 各两次),结果如下:

     从图中,我们可以看出, onCreate() 方法只在第一次创建服务的时候被调用了。

    现在,通过“返回键”来退回至主界面,然后再去 application 的 running service中去查看,可得下面的截图:

     从此图中,我们可以看出,虽然Activity被finish掉了,但是由它启动的service仍然在后台运行着。

    此时,重新打开该应用,然后直接点击 stop service 1 和 2 按钮各两次(不需再新点击 start service按钮),可以如下截图:

     从此图中我们可以看出,只有第一次停止服务的时候,才会调用 onDestroy() 方法。

    此时,再去 application 的 running service中去查看,可得下面的截图,发现服务确实已经被停止了:

     

    下面附上部分源码(具体地请参见附件):

    Java代码  收藏代码
    1. // 四个按钮的响应事件  
    2.   
    3. private OnClickListener btnListener = new OnClickListener() {  
    4.         @Override  
    5.         public void onClick(View v) {  
    6.             switch (v.getId()) {  
    7.                 case R.id.startSer1:  
    8.                     updateLog("Start Service 1 pressed");  
    9.                      // 启动服务(如果想传递数据,也可以将其封装进该intent)  
    10.                     startService(intent);  
    11.                     break;  
    12.                 case R.id.startSer2:  
    13.                     updateLog("Start Service 2 pressed");  
    14.                     startService(intent);  
    15.                     break;  
    16.                 case R.id.stopSer1:  
    17.                     updateLog("Stop Service 1 pressed");  
    18.                     // 停止服务  
    19.                     stopService(intent);  
    20.                     break;  
    21.                 case R.id.stopSer2:  
    22.                     updateLog("Stop Service 2 pressed");  
    23.                     stopService(intent);  
    24.                     break;  
    25.                 default:  
    26.                     break;  
    27.             }  
    28.         }  
    29.     };  
    Java代码  收藏代码
    1. // service 的实现  
    2. public class MyService extends Service {  
    3.     private static final String TAG = "MyService";  
    4.   
    5.     @Override  
    6.     public void onCreate() {  
    7.         super.onCreate();  
    8.         MyServiceActivity.updateLog(TAG + " ----> onCreate()");  
    9.     }  
    10.   
    11.     @Override  
    12.     public int onStartCommand(Intent intent, int flags, int startId) {  
    13.         MyServiceActivity.updateLog(TAG + " ----> onStartCommand()");  
    14.         return START_STICKY;  
    15.     }  
    16.   
    17.     @Override  
    18.     public IBinder onBind(Intent intent) {  
    19.         MyServiceActivity.updateLog(TAG + " ----> onBind()");  
    20.         return null;  
    21.     }  
    22.   
    23.     @Override  
    24.     public void onDestroy() {  
    25.         super.onDestroy();  
    26.         MyServiceActivity.updateLog(TAG + " ----> onDestroy()");  
    27.     }  
    28. }  

       

                                                                                                                                             
               
    • ServiceDemo.zip (49.7 KB)
    •                    
    • 下载次数: 173
    •        
                                                                                                   
  • 相关阅读:
    .net core 之Hangfire任务调度
    .net core 在扩展中使用接口实例之IServiceProvider
    .net core webapi 配置swagger调试界面
    c# async/await异步编程死锁的问题
    c# 关于async/await异步编程的浅析和使用
    后端向服务器发送客户端请求--HttpWebRequest
    FluentAPI关系映射配置
    FluentAPI配置
    AutoFac与ASP.NET MVC结合使用
    Log4Net快速配置
  • 原文地址:https://www.cnblogs.com/LiaoHao/p/3312026.html
Copyright © 2020-2023  润新知