【问题标题】:Why the check for whether a service is running or not, is giving error为什么检查服务是否正在运行会出错
【发布时间】:2012-02-01 17:10:48
【问题描述】:

我正在使用该函数在调用它之前查找服务是否已经在运行,这样如果它已经在运行,则该服务不会启动:-

private boolean iSR() {

        String sClassName;

        ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) 
        {
            sClassName = service.service.getClassName();

            if (sClassName.contains("com.abc.def.Service_name"))
            {

                  return true;
            }
        }

        return false;
}

而且我需要在单独的进程中运行服务,否则会导致应用程序变慢。因此在清单中:-

<service android:name=".Service_name" android:process=":my_process"  >  </service>

但是如果服务正在运行,并且函数被调用,它会给出这样的错误:-

..java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xyz.abc/com.xyz.abc.main}: java.lang.NullPointerException

为什么会这样?非常感谢任何帮助。

【问题讨论】:

  • 你确定 manager 不为空吗?你能在那里加一张支票吗?您提供的堆栈跟踪中没有行号,很难预测发生了什么。
  • 是的,经理不为空。当服务真正运行时函数 (iSR()) 正确返回 true 时,在执行行 Service_name.mThis.stopSelf(); 时会出现问题。 mThis 是一个公共静态变量(声明为 public static Service_name.mThis = null ; 并且在 'onStartCommand()' mThis = this ; 和 'onDestroy' mThis = null。

标签: android android-intent android-manifest android-service


【解决方案1】:

如果您第二次从客户端执行 startService,则已启动的服务(在您的情况下已创建专用进程并且已在服务组件上调用 onCreate)将不会再次“启动”(除非服务要么自行停止,要么在内存不足的情况下被系统杀死)。但是,您的服务将获得多个 onStartCommand 调用。

因此,通常您不必检查服务是否正在运行,系统将根据是否需要启动和停止服务。

而且,在一个单独的进程中运行您的服务以加速您的应用程序可能表明您在应用程序主线程中做了很多事情。您应该重新考虑您的决定,因为如果您有两个进程而不是一个进程,您的应用程序通常会对系统产生更大的影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2021-08-15
    • 2015-06-26
    • 2011-05-25
    • 2011-01-20
    • 2018-08-13
    • 2012-04-30
    相关资源
    最近更新 更多