我面临的奇怪问题。我想在创建活动时启动服务。这是我的服务代码(非常简单,正如您将看到的):
package com.nblmedia.service;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class ServiceSynchro extends Service {
public ServiceSynchro()
{
Log.i(XXX.LOG, "ServiceSynchro");
}
@Override
public IBinder onBind(Intent intent) {
Log.i(XXX.LOG, "onBind");
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
Log.i(XXX.LOG, "onCreate");
super.onCreate();
}
@Override
public void onDestroy() {
Log.i(XXX.LOG, "onDestroy");
// TODO Auto-generated method stub
super.onDestroy();
}
}
在我的AndroidManifest.xml中,我已将服务声明如下:
<service android:name=".ServiceSynchro"></service>
最后,为了启动我的服务,我在onCreate中调用了startService方法:
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
startService(new Intent(UserMenuActivity.this, ServiceSynchro.class));
}
没有任何反应。如果我检查设备的运行服务,则没有运行名为ServiceSyncho的服务。如果我检查Logcat,则不输出任何内容。对于断点而言,应用程序不会循环通过服务的生命周期事件。知道什么可能是我的问题吗?
答案 0 :(得分:9)
我发现了问题。在我的AndroidManifest.xml文件中,service:name属性未引用服务的完全限定类名。例如,我正在使用它:
<service android:name=".ServiceSynchro"></service>
当我需要时:
<service android:name="com.xxx.service.ServiceSynchro"></service>
对于对文档中的应用程序感兴趣的人,here is the link可以查看它。
<强>机器人:名称强> 实现服务的Service子类的名称。这应该是一个完全限定的类名(例如“com.example.project.RoomService”)。但是,作为简写,如果名称的第一个字符是句点(例如“.RoomService”),则它将附加到元素中指定的包名称。
最后,我更新了代码以覆盖onStartCommand命令,因为不推荐使用onStart方法。
public int onStartCommand(Intent intent, int flags, int startId)
答案 1 :(得分:5)
摆脱你的构造函数。永远不要在组件中实现构造函数(唯一的当前例外:IntentService
)。
此外,当你在Java中的其他地方实现构造函数时,链接到超类。
答案 2 :(得分:0)
当我的服务没有开始时,我到处寻找。 没有任何结果。第三个小时的最终调试ı发现我的包名称不是标准格式的xx.xx.xx包名。我修复了它的工作原理。 供您参考。