测试START_STICKY服务

时间:2017-02-15 15:44:48

标签: android android-service

  

我已阅读this回答,但在我的案例中没用。

我创建了一个简单的服务,它只会记录方法名称。我从我的活动中运行它并使用

杀死它
adb shell am stopservice -n serviceComponent
服务时调用

onDestroy()。现在我从Service.START_STICKY返回了onStartCommand();我等待系统重启 该服务并且从不重新启动。

这是正确的行为吗?我已经解决了this问题,但无法找到可靠的答案。

public class SampleService extends Service {

    private static final boolean LOG = true;

    public static final String CALLER = "sample.service.caller";

    /**
     * called once when service is created.
     */
    @Override
    public void onCreate() {
        super.onCreate();
        if(LOG){
            log("onCreate() -> thread: %s", Thread.currentThread().getName());
        }
    } // onCreate

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if(LOG){
            log(">>>>>> onStartCommand()");
        }
        if(LOG){
            log("thread: %s", Thread.currentThread().getName());
        }

        if(LOG){
            log("caller[%s]", intent.getStringExtra(CALLER));
        }

        if(LOG){
            log("<<<<<< onStartCommand()");
        }
        return Service.START_STICKY;
    } // onStartCommand

    @Override
    public void onDestroy() {
        super.onDestroy();
        if(LOG){
            log("onDestroy() -> thread: %s", Thread.currentThread().getName());
        }
        Toast.makeText(this, "destroying", Toast.LENGTH_SHORT).show();
    } // onDestroy


    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    } // onBind

    private void log(String format, Object... args){
        Utils.log("SampleService", String.format(format, args));
    } // log

} // SampleService

这是我到目前为止所尝试的内容

  • 我通过使用此代码

    来启动服务
      Intent intent = new Intent(this, SampleService.class);
    intent.putExtra(SampleService.CALLER, "main activity");
    if(null == startService(intent)){
        if(LOG){
            log("startService -> %s", "service not found!");
        }
    
    } // 
    
  • 启动服务后,adb shell dumpsys activity services | grep "com.mallaudin"会返回此

    ServiceRecord{8bc884d u0 com.mallaudin.services/.SampleService}
    intent={cmp=com.mallaudin.services/.SampleService}
    packageName=com.mallaudin.services
    processName=com.mallaudin.services
    baseDir=/data/app/com.mallaudin.services-2/base.apk
    dataDir=/data/user/0/com.mallaudin.services
    app=ProcessRecord{b1c1c5a 32017:com.mallaudin.services/u0a94}
    
  • 现在我通过调用adb shell am stopservice -n com.mallaudin.services/.SampleService来停止服务。它会停止服务并且onDestroy是 调用。当我从手机中的服务列表中终止服务时,会发现相同的行为。

    Stopping service: Intent { cmp=com.mallaudin.services/.SampleService }
    Service stopped
    
  • 当我使用adb shell force-stop com.mallaudin.services命令时,服务已停止,但未调用onDestroy()

1 个答案:

答案 0 :(得分:1)

START_STICKY文档:

  

...如果此服务的进程在启动时被终止......

context.stopService(Intent)Activity实际上并没有终止服务进程,而只是在保持应用程序进程运行的同时停止服务。因此,在这种情况下系统不会重启服务。

您可以尝试以下操作:创建一个包含Service^\/projects* 的应用。然后启动活动,启动服务,并通过从概览屏幕(也就是最近的菜单)滑动来杀死应用程序。您的服务应该重新启动。