gpt4 book ai didi

android - 测试 START_STICKY 服务

转载 作者:行者123 更新时间:2023-11-30 00:43:04 25 4
gpt4 key购买 nike

I have read this answer and it's not useful in my case.

我已经创建了一个简单的服务,它除了记录方法名称外什么都不做。我从我的 Activity 中运行它并使用

杀死它
adb shell am stopservice -n serviceComponent

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

这是正确的行为吗?我经历了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()

最佳答案

START_STICKY文档:

... if this service's process is killed while it is started...

adb shell am stopservicecontext.stopService(Intent) 实际上并没有终止服务进程,而只是停止服务,同时保持应用进程运行。所以在这种情况下系统不会重启服务。

您可以尝试以下操作:创建一个包含ActivityService 的应用。然后启动 Activity ,启动服务,并通过从概览屏幕(又名最近菜单)滑动来终止应用程序。您的服务应该重新启动。

关于android - 测试 START_STICKY 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42253869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com