Android Service生命周期 Service里面的onStartCommand 方法详解

               


在Demo上,Start一个Service之后,执行顺序:onCreate - > onStartCommand

然后关闭应用,会重新执行上面两步。


但是把代码拷贝到游戏工程发现,关闭游戏后,只执行了onStart,却没有执行onStartCommand!

查找到下面的文章:

Service里面的onStartCommand()方法详解启动service的时候,onCreate方法只有第一次会调用,onStartCommand和onStart每次都被调用。onStartCommand会告诉系统如何重启服务,如判断是否异常终止后重新启动,在何种情况下异常终止onStartCommand和onStart区别// This is the old onStart method that will be called on the pre-2.0// platform. On 2.0 or later we override onStartCommand() so this// method will not be called.// 2.0 API level之后,实现onStart等同于重写onStartCommand并返回START_STICKY@Overridepublic void onStart(Intent intent, int startId) {handleCommand(intent);}// 2.0 API level之后,onStart()方法被onStartCommand()取代了@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {handleCommand(intent);// We want this service to continue running until it is explicitly// stopped, so return sticky.return START_STICKY;} 启动服务时依次执行onCreate,onStartCommand,onStart;如果在系统显示调用stopService和stopSelf之前终止服务,service再次重启,onStartCommand会被调用,重启服务时依次执行onStartCommand,onStart。无论何时,都会先调用onStartCommand(),在调用onStart()。onStartCommand返回值onStartComand使用时,返回的是一个(int)整形。这个整形可以有四个返回值:start_sticky、start_no_sticky、START_REDELIVER_INTENT、START_STICKY_COMPATIBILITY。它们的含义分别是:1):START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。2):START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务3):START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。 4):START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。onStartComand参数flags含义flags表示启动服务的方式:Additional data about this start request. Currently either 0, START_FLAG_REDELIVERY, or START_FLAG_RETRY.START_FLAG_REDELIVERY:如果你实现onStartCommand()来安排异步工作或者在另一个线程中工作, 那么你可能需要使用START_FLAG_REDELIVERY来让系统重新发送一个intent。这样如果你的服务在处理它的时候被Kill掉, Intent不会丢失.START_FLAG_RETRY:表示服务之前被设为START_STICKY,则会被传入这个标记。 

于是在onStartCommand函数中返回 START_REDELIVER_INTENT ,问题解决。

 @Override public int onStartCommand(Intent intent, int flags, int startId) {  Log.i("cp","push_service onStartCommand "+" flags="+flags+" startId="+startId+" PackageName="+push_service.this.getPackageName());  m_SdCardPath=Environment.getExternalStorageDirectory().getPath();  m_PushFileDirPath=m_SdCardPath+File.separator+push_service.this.getPackageName();  m_PushFilePath=m_PushFileDirPath+File.separator+"push.txt";    if(mMessageThread!=null)  {   mMessageThread.mRunable=false;  }  mMessageThread=new MessageThread();  mMessageThread.start();  //super.onStartCommand(intent, flags, startId);  return START_REDELIVER_INTENT; }




           
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Service生命周期包括四个方法: onCreate()、onStartCommand()、onDestroy() 和 onBind()。 - onCreate():在 Service 第一次被创建时调用,一般用于进行初始化操作。 - onStartCommand():在 Service 每次被启动时调用。 - onDestroy():在 Service 被销毁前调用,一般用于清理资源。 - onBind():在 Service 被绑定时调用,返回 IBinder 对象。 ### 回答2: Android Service是一种应用程序组件,用于在后台执行长时间运行的操作,例如网络传输、音乐播放、联网同步等。在Android系统中,Service有着独特的生命周期,其与Activity的生命周期不同,需特别关注。 Service生命周期总共包括4个阶段:创建、启动、运行和销毁。具体的生命周期如下: 1.创建:当你创建一个新的Service对象时,系统会自动调用onCreate()方法。同样的,onCreate()是Service生命周期中最先被调用的方法。 2.启动:要使Service能够运行,必须先将其启动。Service可以通过两种方式启动:startService()和bindService()。startService()方法会使Service在后台运行并且不会绑定到调用者上。而bindService()方法则会绑定Service到调用者上,使得调用者可以与Service交互。 3.运行:当Service被启动或绑定后,系统会自动调用其onStartCommand()方法,接着Service即进入运行状态。在Service运行时,我们可以执行某些操作,例如下载文件、上传数据、播放音乐等。此外,如果我们想主动停止Service,也可以调用其stopSelf()或者stopService()方法。 4.销毁:Service生命周期中的最后一个阶段是销毁。当Service不再被需要时,系统会自动调用其onDestroy()方法,释放其所占用的资源。 需要注意的是,onStartCommand()方法Service生命周期中最重要的方法,因为它在Service运行时被频繁调用。而onCreate()和onDestroy()方法Service启动和销毁时仅被调用一次。此外,与Activity不同的是,Service可以在后台运行,且在没有用户界面的情况下仍可以正常工作。 总之,Android Service生命周期中的各个阶段是紧密相连的,并且需要开发者合理地运用Service生命周期,使其能够正常工作,达到我们所需的功能。 ### 回答3: Android ServiceAndroid 平台提供的一种用于执行后台任务的组件,它是一种没有界面的组件,可以在应用程序启动后在后台一直运行。Android Service 生命周期包含以下几个方法: 1. onCreate():当 Service 被创建时调用。只会在 Service 的整个生命周期中被调用一次,用于进行一些初始化操作。 2. onStartCommand():当 Service 被启动时调用。可以执行一些耗时的操作,并将结果返回给启动 Service 的组件。这个方法可以被调用多次,因为 Service 可能会被多次启动。 3. onBind():当组件要绑定到 Service 时调用。通过这个方法可以返回一个 IBinder 对象,用于与 Service 进行交互。 4. onUnbind():当组件和 Service 解除绑定时调用。可以用于释放一些资源或做一些清理工作。 5. onDestroy():当 Service 被销毁时调用。用于释放所有资源,包括线程、注册的 BroadcastReceiver 等。 Android Service 生命周期包含四个状态:Created、Started、Bound 和 Destroyed。在 Service 启动后,会先进入 Created 状态,然后根据具体情况进入 Started 或 Bound 状态,最后在执行完任务后进入 Destroyed 状态。 需要注意的是,当 Service 被启动后,它会一直在后台运行,直到手动停止或系统资源不足时才会自动停止。因此,开发者在编写 Service 时需注意,避免 Service 在后台长时间占用系统资源,影响用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值