为什么这个简单的服务没有启动?

75

我有一个服务,其中的处理程序每5秒必须在logcat中写入“Hello”。但它在logcat上没有任何输出……好像服务没有执行,我在它上面设置了断点,调试模式从未停止在断点上。

我使用以下代码在我的应用程序的第一个活动中启动服务:

startService(new Intent(GPSLoc.this, MyServiceNotifications.class)); //enciendo el service

我确信代码中的startService被执行了,因为它在启动另一个活动之前被调用,而且其他活动已经开始。

这是我的服务代码:

public class MyServiceNotifications extends Service {

    boolean serviceStopped;

    private Handler mHandler;
    private Runnable updateRunnable = new Runnable() {
        @Override
        public void run() {
            if (serviceStopped == false)
            {
                createNotificationIcon();
            }
            queueRunnable();
        }
    };

    private void queueRunnable() {
        // 600000 : cada 10 minutos, comprueba si hay nuevas notificaciones y actualiza la
        // notification BAR
        mHandler.postDelayed(updateRunnable, 5000);

    }

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

    @Override
    public void onCreate() {
        serviceStopped = false;

        // //////////////////////////////////////MANEJADOR SIMILAR A UN HILO
        mHandler = new Handler();
        queueRunnable();
        // ///////////////////////////////////// FIN MANEJADOR
    }

    @Override
    public void onDestroy() {
        serviceStopped = true;
    }

    @Override
    public void onStart(Intent intent, int startid) {

    }

    public void createNotificationIcon()
    {
        Log.d("MyServiceNotifications", "Hello");
    }    
}

12
你在清单文件中声明了这个服务吗? - Franco
把一个 logcat 放在 onCreate() 里面,它会被使用吗?还有,在什么时候调用 updateRunnable 的 run() 方法?我看不到它被执行了。 - Jimmy
哦,对了,我忘记放在清单里了!谢谢。 - NullPointerException
还有一件事要检查,就是确保您的服务尚未运行。 在这种情况下,您需要停止服务并重新启动。 - Nikola Kosmajac
6个回答

216
你是否在AndroidManifest.xml文件中声明了该服务?

15
哇,现在我感觉很蠢 :) 我很惊讶当这种情况发生时没有像 Activities 一样记录错误。 - Ross Hambrick
2
当一个人意识到自己忘记了一些非常简单的东西,尤其是在代码上下滚动了几个小时之后,他会发出惊叹声...哈哈。 - theAnonymous
2
它也需要在<application ... <application/>部分中声明。不要问我是怎么发现的... - Eric Engel
<application> .... <service android:name=".MyServiceNotifications"/> </application> 如VenkaReddy所回答的。 - Tayyab Mazhar

69

非常重要:正确书写命名空间(name space),例如:

<service android:name="com.example.data.synchronization.SynchronizationService"/>

在我的AndroidManifest.xml文件中,之前它是错误的:

<service android:name="com.example.data.SynchronizationService"/>

没有启动服务,也没有错误信息


有点尴尬地承认,在我意识到这也是我的问题之前,我花了一个小时纠结于一些事情。 - Jared
2
也许Android Studio将更加重视识别这种问题... - Seraphim's
@Jared 我也一样,伙计。 - Paresh Dudhat
@Jared 你好奇的是,你是使用Android Studio还是Eclipse?你是用Gradle编译吗? - Seraphim's
我当时正在使用Eclipse。随着Android Studio Beta版本的发布,我们公司将在未来几天内标记我们应用程序的新版本后进行迁移。 - Jared
我刚刚在这上面浪费了几个小时 - 它已经被声明了,但是命名空间错误。谢谢! - Mick O'Hea

19

你好,你所编写的代码运行良好。可能是你忘记在应用程序标签关闭之前在清单文件中添加以下代码。

<application>
    ....
    <service android:name=".MyServiceNotifications"/>
</application>

2
我的投票是给“在关闭应用程序标记之前”的。程序员犯傻事! - Tejasvi Hegde
1
如果在清单中运行Analyze...Inspect Code,这将显示出来。 - Merk

9

2
默认值为 true - GabrielOshiro
除非在另一个清单文件中另有说明。 - dbm

3
如果使用Xamarin Droid,最简单的方法是将类标记为服务,如下所示:

如果使用Xamarin Droid,最简单的方法是像这样将类标记为服务:

[Service]
public class LongRunningTaskService : Service
{
    ...
}

那么就不需要将它放在AndroidManifest.xml中。

0

非常罕见的情况。但在处理多进程应用程序时,活动和服务需要在Manifest.xml中提到android:process

EG: RemoteServiceBindingActivity.kt

startService(Intent(this, RemoteService::class.java))

那么

<activity
    android:name=".RemoteServiceBindingActivity"
    android:process=":test" />


<service
    android:name=".RemoteService"
    android:enabled="true"/>

没起作用。我不得不像这样在清单文件中的服务中也添加android:process=":test"
<service
    android:name=".RemoteService"
    android:enabled="true"
    android:process=":test"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接