首页 > 其他分享 >Android Service生命周期及用法!(转)

Android Service生命周期及用法!(转)

时间:2023-08-08 13:02:18浏览次数:36  
标签:生命周期 Service private public MyService import Android android



Android Service生命周期及用法!


大家好,上一节我讲解了Android Activity的生命周期,这一节我将讲解一下Service,首先我们要知道Service具体是干什么的,什么时候用到?以及它的生命周期等。

Service概念及用途:

Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,那 我们什么时候会用到Service呢?比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当我们退出播放音乐的应用,如果不用Service,我 们就听不到歌了,所以这时候就得用到Service了,又比如当我们一个应用的数据是通过网络获取的,不同时间(一段时间)的数据是不同的这时候我们可以 用Service在后台定时更新,而不用每打开应用的时候在去获取。

Service生命周期 :

Android Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法,具体的可以看下面的实例。

Service与Activity通信:

Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL)这一节我不作过多描述,当我们想获取启动的Service实例时,我们可以用到bindService和onBindService方法,它们分别执行了Service中IBinder()和onUnbind()方法。

 

为了让大家 更容易理解,我写了一个简单的Demo,大家可以模仿着我,一步一步的来。

 

第一步:新建一个Android工程,我这里命名为ServiceDemo.

第二步:修改main.xml代码,我这里增加了四个按钮,代码如下:

 




1. <?xml version="1.0" encoding="utf-8"?>  
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
3. "vertical"  
4. "fill_parent"  
5. "fill_parent"  
6.     >  
7.     <TextView  
8. "@+id/text"    
9. "fill_parent"   
10. "wrap_content"   
11. "@string/hello"  
12.         />  
13.     <Button  
14. "@+id/startservice"  
15. "fill_parent"  
16. "wrap_content"  
17. "startService"  
18.     />  
19.     <Button  
20. "@+id/stopservice"  
21. "fill_parent"  
22. "wrap_content"  
23. "stopService"  
24.     />  
25.     <Button  
26. "@+id/bindservice"  
27. "fill_parent"  
28. "wrap_content"  
29. "bindService"  
30.     />  
31.     <Button  
32. "@+id/unbindservice"  
33. "fill_parent"  
34. "wrap_content"  
35. "unbindService"  
36.     />  
37. </LinearLayout>



 

第三步:新建一个Service,命名为MyService.java代码如下:

 


    1. package com.tutor.servicedemo;  
    2. import android.app.Service;  
    3. import android.content.Intent;  
    4. import android.os.Binder;  
    5. import android.os.IBinder;  
    6. import android.text.format.Time;  
    7. import android.util.Log;  
    8. public class MyService extends Service {  
    9. //定义个一个Tag标签  
    10. private static final String TAG = "MyService";  
    11. //这里定义吧一个Binder类,用在onBind()有方法里,这样Activity那边可以获取到  
    12. private MyBinder mBinder = new MyBinder();  
    13. @Override  
    14. public IBinder onBind(Intent intent) {  
    15. "start IBinder~~~");  
    16. return mBinder;  
    17.     }  
    18. @Override  
    19. public void onCreate() {  
    20. "start onCreate~~~");  
    21. super.onCreate();  
    22.     }  
    23.       
    24. @Override  
    25. public void onStart(Intent intent, int startId) {  
    26. "start onStart~~~");  
    27. super.onStart(intent, startId);   
    28.     }  
    29.       
    30. @Override  
    31. public void onDestroy() {  
    32. "start onDestroy~~~");  
    33. super.onDestroy();  
    34.     }  
    35.       
    36.       
    37. @Override  
    38. public boolean onUnbind(Intent intent) {  
    39. "start onUnbind~~~");  
    40. return super.onUnbind(intent);  
    41.     }  
    42.       
    43. //这里我写了一个获取当前时间的函数,不过没有格式化就先这么着吧  
    44. public String getSystemTime(){  
    45.           
    46. new Time();  
    47.         t.setToNow();  
    48. return t.toString();  
    49.     }  
    50.       
    51. public class MyBinder extends Binder{  
    52.         MyService getService()  
    53.         {  
    54. return MyService.this;  
    55.         }  
    56.     }  
    57. }



     

    第四步:修改ServiceDemo.java,代码如下:

     





      1. package com.tutor.servicedemo;  
      2. import android.app.Activity;  
      3. import android.content.ComponentName;  
      4. import android.content.Context;  
      5. import android.content.Intent;  
      6. import android.content.ServiceConnection;  
      7. import android.os.Bundle;  
      8. import android.os.IBinder;  
      9. import android.view.View;  
      10. import android.view.View.OnClickListener;  
      11. import android.widget.Button;  
      12. import android.widget.TextView;  
      13. public class ServiceDemo extends Activity implements OnClickListener{  
      14.      
      15. private MyService  mMyService;  
      16. private TextView mTextView;  
      17. private Button startServiceButton;  
      18. private Button stopServiceButton;  
      19. private Button bindServiceButton;  
      20. private Button unbindServiceButton;  
      21. private Context mContext;  
      22.       
      23. //这里需要用到ServiceConnection在Context.bindService和context.unBindService()里用到  
      24. private ServiceConnection mServiceConnection = new ServiceConnection() {  
      25. //当我bindService时,让TextView显示MyService里getSystemTime()方法的返回值   
      26. public void onServiceConnected(ComponentName name, IBinder service) {  
      27. // TODO Auto-generated method stub  
      28.             mMyService = ((MyService.MyBinder)service).getService();  
      29. "I am frome Service :" + mMyService.getSystemTime());  
      30.         }  
      31.           
      32. public void onServiceDisconnected(ComponentName name) {  
      33. // TODO Auto-generated method stub  
      34.               
      35.         }  
      36.     };  
      37. public void onCreate(Bundle savedInstanceState) {  
      38. super.onCreate(savedInstanceState);  
      39.         setContentView(R.layout.main);  
      40.         setupViews();  
      41.     }  
      42.       
      43. public void setupViews(){  
      44.       
      45. this;  
      46.         mTextView = (TextView)findViewById(R.id.text);  
      47.           
      48.           
      49.           
      50.         startServiceButton = (Button)findViewById(R.id.startservice);  
      51.         stopServiceButton = (Button)findViewById(R.id.stopservice);  
      52.         bindServiceButton = (Button)findViewById(R.id.bindservice);  
      53.         unbindServiceButton = (Button)findViewById(R.id.unbindservice);  
      54.           
      55. this);  
      56. this);  
      57. this);  
      58. this);  
      59.     }  
      60.      
      61. public void onClick(View v) {  
      62. // TODO Auto-generated method stub  
      63. if(v == startServiceButton){  
      64. new Intent();  
      65. this, MyService.class);  
      66.             mContext.startService(i);  
      67. else if(v == stopServiceButton){  
      68. new Intent();  
      69. this, MyService.class);  
      70.             mContext.stopService(i);  
      71. else if(v == bindServiceButton){  
      72. new Intent();  
      73. this, MyService.class);  
      74.             mContext.bindService(i, mServiceConnection, BIND_AUTO_CREATE);  
      75. else{  
      76.             mContext.unbindService(mServiceConnection);  
      77.         }  
      78.     }  
      79.       
      80.       
      81.       
      82. }


       

      第五步:修改AndroidManifest.xml代码(将我们新建的MyService注册进去如下代码第14行:)



        1. <?xml version="1.0" encoding="utf-8"?>  
        2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
        3. package="com.tutor.servicedemo"  
        4. "1"  
        5. "1.0">  
        6. "@drawable/icon" android:label="@string/app_name">  
        7. ".ServiceDemo"  
        8. "@string/app_name">  
        9.             <intent-filter>  
        10. "android.intent.action.MAIN" />  
        11. "android.intent.category.LAUNCHER" />  
        12.             </intent-filter>  
        13.         </activity>  
        14. ".MyService" android:exported="true"></service>  
        15.     </application>  
        16. "7" />  
        17. </manifest>


         

         

        第六步:执行上述工程,效果图如下:

        点击startServie按钮时先后执行了Service中onCreate()->onStart()这两个方法,打开Logcat视窗效果如下图:

        我们这时可以按HOME键进入Settings(设置)->Applications(应用)->Running Services(正在运行的服务)看一下我们新启动了一个服务,效果如下:

        点击stopService按钮时,Service则执行了onDestroy()方法,效果图如下所示:

        这时候我们再次点击startService按钮,然后点击bindService按钮(通常bindService都是bind已经启动的Service),我们看一下Service执行了IBinder()方法,以及TextView的值也有所变化了,如下两张图所示:

         

        最后点击unbindService按钮,则Service执行了onUnbind()方法,如下图所示:

         


        大家好,上一节我讲解了Android Activity的生命周期,这一节我将讲解一下Service,首先我们要知道Service具体是干什么的,什么时候用到?以及它的生命周期等。

        Service概念及用途:

        Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,那 我们什么时候会用到Service呢?比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当我们退出播放音乐的应用,如果不用Service,我 们就听不到歌了,所以这时候就得用到Service了,又比如当我们一个应用的数据是通过网络获取的,不同时间(一段时间)的数据是不同的这时候我们可以 用Service在后台定时更新,而不用每打开应用的时候在去获取。

        Service生命周期 :

        Android Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法,具体的可以看下面的实例。

        Service与Activity通信:

        Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL)这一节我不作过多描述,当我们想获取启动的Service实例时,我们可以用到bindService和onBindService方法,它们分别执行了Service中IBinder()和onUnbind()方法。

         

        为了让大家 更容易理解,我写了一个简单的Demo,大家可以模仿着我,一步一步的来。

         

        第一步:新建一个Android工程,我这里命名为ServiceDemo.

        第二步:修改main.xml代码,我这里增加了四个按钮,代码如下:

         


          1. <?xml version="1.0" encoding="utf-8"?>  
          2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
          3. "vertical"  
          4. "fill_parent"  
          5. "fill_parent"  
          6.     >  
          7.     <TextView  
          8. "@+id/text"    
          9. "fill_parent"   
          10. "wrap_content"   
          11. "@string/hello"  
          12.         />  
          13.     <Button  
          14. "@+id/startservice"  
          15. "fill_parent"  
          16. "wrap_content"  
          17. "startService"  
          18.     />  
          19.     <Button  
          20. "@+id/stopservice"  
          21. "fill_parent"  
          22. "wrap_content"  
          23. "stopService"  
          24.     />  
          25.     <Button  
          26. "@+id/bindservice"  
          27. "fill_parent"  
          28. "wrap_content"  
          29. "bindService"  
          30.     />  
          31.     <Button  
          32. "@+id/unbindservice"  
          33. "fill_parent"  
          34. "wrap_content"  
          35. "unbindService"  
          36.     />  
          37. </LinearLayout>



           

          第三步:新建一个Service,命名为MyService.java代码如下:

           



            1. package com.tutor.servicedemo;  
            2. import android.app.Service;  
            3. import android.content.Intent;  
            4. import android.os.Binder;  
            5. import android.os.IBinder;  
            6. import android.text.format.Time;  
            7. import android.util.Log;  
            8. public class MyService extends Service {  
            9. //定义个一个Tag标签  
            10. private static final String TAG = "MyService";  
            11. //这里定义吧一个Binder类,用在onBind()有方法里,这样Activity那边可以获取到  
            12. private MyBinder mBinder = new MyBinder();  
            13. @Override  
            14. public IBinder onBind(Intent intent) {  
            15. "start IBinder~~~");  
            16. return mBinder;  
            17.     }  
            18. @Override  
            19. public void onCreate() {  
            20. "start onCreate~~~");  
            21. super.onCreate();  
            22.     }  
            23.       
            24. @Override  
            25. public void onStart(Intent intent, int startId) {  
            26. "start onStart~~~");  
            27. super.onStart(intent, startId);   
            28.     }  
            29.       
            30. @Override  
            31. public void onDestroy() {  
            32. "start onDestroy~~~");  
            33. super.onDestroy();  
            34.     }  
            35.       
            36.       
            37. @Override  
            38. public boolean onUnbind(Intent intent) {  
            39. "start onUnbind~~~");  
            40. return super.onUnbind(intent);  
            41.     }  
            42.       
            43. //这里我写了一个获取当前时间的函数,不过没有格式化就先这么着吧  
            44. public String getSystemTime(){  
            45.           
            46. new Time();  
            47.         t.setToNow();  
            48. return t.toString();  
            49.     }  
            50.       
            51. public class MyBinder extends Binder{  
            52.         MyService getService()  
            53.         {  
            54. return MyService.this;  
            55.         }  
            56.     }  
            57. }



             

            第四步:修改ServiceDemo.java,代码如下:

             


              1. package com.tutor.servicedemo;  
              2. import android.app.Activity;  
              3. import android.content.ComponentName;  
              4. import android.content.Context;  
              5. import android.content.Intent;  
              6. import android.content.ServiceConnection;  
              7. import android.os.Bundle;  
              8. import android.os.IBinder;  
              9. import android.view.View;  
              10. import android.view.View.OnClickListener;  
              11. import android.widget.Button;  
              12. import android.widget.TextView;  
              13. public class ServiceDemo extends Activity implements OnClickListener{  
              14.      
              15. private MyService  mMyService;  
              16. private TextView mTextView;  
              17. private Button startServiceButton;  
              18. private Button stopServiceButton;  
              19. private Button bindServiceButton;  
              20. private Button unbindServiceButton;  
              21. private Context mContext;  
              22.       
              23. //这里需要用到ServiceConnection在Context.bindService和context.unBindService()里用到  
              24. private ServiceConnection mServiceConnection = new ServiceConnection() {  
              25. //当我bindService时,让TextView显示MyService里getSystemTime()方法的返回值   
              26. public void onServiceConnected(ComponentName name, IBinder service) {  
              27. // TODO Auto-generated method stub  
              28.             mMyService = ((MyService.MyBinder)service).getService();  
              29. "I am frome Service :" + mMyService.getSystemTime());  
              30.         }  
              31.           
              32. public void onServiceDisconnected(ComponentName name) {  
              33. // TODO Auto-generated method stub  
              34.               
              35.         }  
              36.     };  
              37. public void onCreate(Bundle savedInstanceState) {  
              38. super.onCreate(savedInstanceState);  
              39.         setContentView(R.layout.main);  
              40.         setupViews();  
              41.     }  
              42.       
              43. public void setupViews(){  
              44.       
              45. this;  
              46.         mTextView = (TextView)findViewById(R.id.text);  
              47.           
              48.           
              49.           
              50.         startServiceButton = (Button)findViewById(R.id.startservice);  
              51.         stopServiceButton = (Button)findViewById(R.id.stopservice);  
              52.         bindServiceButton = (Button)findViewById(R.id.bindservice);  
              53.         unbindServiceButton = (Button)findViewById(R.id.unbindservice);  
              54.           
              55. this);  
              56. this);  
              57. this);  
              58. this);  
              59.     }  
              60.      
              61. public void onClick(View v) {  
              62. // TODO Auto-generated method stub  
              63. if(v == startServiceButton){  
              64. new Intent();  
              65. this, MyService.class);  
              66.             mContext.startService(i);  
              67. else if(v == stopServiceButton){  
              68. new Intent();  
              69. this, MyService.class);  
              70.             mContext.stopService(i);  
              71. else if(v == bindServiceButton){  
              72. new Intent();  
              73. this, MyService.class);  
              74.             mContext.bindService(i, mServiceConnection, BIND_AUTO_CREATE);  
              75. else{  
              76.             mContext.unbindService(mServiceConnection);  
              77.         }  
              78.     }  
              79.       
              80.       
              81.       
              82. }



               

              第五步:修改AndroidManifest.xml代码(将我们新建的MyService注册进去如下代码第14行:)





              1. <?xml version="1.0" encoding="utf-8"?>  
              2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
              3. package="com.tutor.servicedemo"  
              4. "1"  
              5. "1.0">  
              6. "@drawable/icon" android:label="@string/app_name">  
              7. ".ServiceDemo"  
              8. "@string/app_name">  
              9.             <intent-filter>  
              10. "android.intent.action.MAIN" />  
              11. "android.intent.category.LAUNCHER" />  
              12.             </intent-filter>  
              13.         </activity>  
              14. ".MyService" android:exported="true"></service>  
              15.     </application>  
              16. "7" />  
              17. </manifest>



               

               

              第六步:执行上述工程,效果图如下:

              Android Service生命周期及用法!(转)_java

              点击startServie按钮时先后执行了Service中onCreate()->onStart()这两个方法,打开Logcat视窗效果如下图:

              Android Service生命周期及用法!(转)_android_02

              我们这时可以按HOME键进入Settings(设置)->Applications(应用)->Running Services(正在运行的服务)看一下我们新启动了一个服务,效果如下:

              Android Service生命周期及用法!(转)_移动开发_03

              点击stopService按钮时,Service则执行了onDestroy()方法,效果图如下所示:

              Android Service生命周期及用法!(转)_android_04

              这时候我们再次点击startService按钮,然后点击bindService按钮(通常bindService都是bind已经启动的Service),我们看一下Service执行了IBinder()方法,以及TextView的值也有所变化了,如下两张图所示:

               

              Android Service生命周期及用法!(转)_android_05

              Android Service生命周期及用法!(转)_java_06

              最后点击unbindService按钮,则Service执行了onUnbind()方法,如下图所示:

               

              Android Service生命周期及用法!(转)_android_07

              标签:生命周期,Service,private,public,MyService,import,Android,android
              From: https://blog.51cto.com/u_16034393/7007376

              相关文章

              • Android 12 适配之 "Android:exported"
                Android12适配之"Android:exported"将build.gradle中的targetSDKVersion和compileSdkVersion改为31,对应Android12build项目报错AppstargetingAndroid12andhigherarerequiredtospecifyanexplicitvalueforandroid:exportedwhenthecorrespondingc......
              • Android协程带你飞越传统异步枷锁
                引言在Android开发中,处理异步任务一直是一项挑战。以往的回调和线程管理方式复杂繁琐,使得代码难以维护和阅读。Jetpack引入的Coroutine(协程)成为了异步编程的新标杆。本文将深入探讨AndroidJetpackCoroutine的使用、原理以及高级用法,助您在异步编程的路上游刃有余。什么是Coroutin......
              • C# 读取带CheckBox复选框控件的表格-并集成到Windows Service里面
                最近的项目要求读取xls文件内的单元格,并且单元格旁边会有复选框标识类型。搜了下只有java的POI有例子,NOPI看项目文档好像是没有实现读取控件的功能。java实现POI POI如何解析出excel中复选框是否被选中https://blog.csdn.net/qq_29832217/article/details/104413475 C#导......
              • Java WebService如何生成PDF文件
                JavaWebService如何生成PDF文件在Web应用开发中,生成PDF文件是一项非常常见的需求。本文将介绍如何使用JavaWebService来生成PDF文件。JavaWebService如何生成PDF文件一、概述PDF(PortableDocumentFormat)是一种独立于应用软件、硬件和操作系统的文件格式,它能够保留文档的格......
              • Android平台一对一音视频通话方案对比:WebRTC VS RTMP VS RTSP
                一对一音视频通话使用场景一对一音视频通话都需要稳定、清晰和流畅,以确保良好的用户体验,常用的使用场景如下:社交应用:社交应用是一种常见的使用场景,用户可以通过音视频通话进行面对面的交流;在线教育:老师和学生可以通过音视频通话功能进行实时互动,提高教学效率;远程协助:在某些工作场景......
              • Android 平台架构
                放一张官网的图各层级描述参考官网:https://developer.android.google.cn/guide/platform?hl=zh-cnHAL层出现的原因:......
              • Android 系统 映像文件
                通过Android拉取ASOP项目源码,配好各种环境后,编译出来的文件,有如下几个:通过Android拉取ASOP项目源码,配好各种环境后,编译出来的文件,有如下几个:boot.img包含内核启动参数、内核等多个元素ramdisk.img小型的文件系统,是Android系统启动的关键system.imgAndroid系统......
              • Java Web Service Get请求使用指南
                JavaWebServiceGet请求使用指南在当今互联网时代,WebService已经成为了现代软件开发中不可或缺的一部分。而Java作为一种广泛使用的编程语言,自然也提供了丰富的工具和库来支持WebService的开发。本文将为大家介绍如何使用Java编程语言进行WebService的Get请求。JavaWebserv......
              • 【金九银十面试冲刺】Android岗面试题每日分享——Java篇
                一、Java异常机制中,异常Exception与错误Error区别这道题想考察什么?在开发时需要时候需要自定义异常时,应该选择定义Excption还是Error?编写的代码触发Excption或者Error分别代表什么?考察的知识点Java异常机制考生应该如何回答在Java中存在一个Throwable可抛出类,Throwable有两个重要的......
              • Android View动态设置有圆角的背景颜色
                valshapeDrawable=GradientDrawable()//设置形状为矩形shapeDrawable.shape=GradientDrawable.RECTANGLE//设置背景颜色shapeDrawable.setColor(Color.parseColor(item.bgColour))//创建一个圆角数组,分别表示左上......