Java 为什么在我重新运行程序时服务崩溃?

Java 为什么在我重新运行程序时服务崩溃?,java,android,service,Java,Android,Service,我现在开始编写一个服务例程,每次我在不修改任何内容的情况下重新运行代码时都会收到一条错误消息 以下是服务程序: 公共类轮询服务扩展服务{ private static final String TAG = PollingService.class.getSimpleName(); private Polling updater; public boolean isRunning = false; @Override public IBinder onBind(Intent intent)

我现在开始编写一个服务例程,每次我在不修改任何内容的情况下重新运行代码时都会收到一条错误消息

以下是服务程序:

公共类轮询服务扩展服务{

private static final String TAG = PollingService.class.getSimpleName();

private Polling updater;

public boolean isRunning = false;

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

@Override
public void onCreate() {
    super.onCreate();
    updater = new Polling();
    Log.d(TAG, "On Create'd");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // Start the Polling updater
    if(!this.isRunning){
        updater.start();
        this.isRunning = true;
    }
    Log.d(TAG, "On Start'd");
    return super.onStartCommand(intent, flags, startId);
}

@Override
public synchronized void onDestroy() {
    super.onDestroy();
    // Stop the Polling updater
    if(this.isRunning){
        updater.interrupt();
    }
    Log.d(TAG, "On Destroy'd");
}

// Polling Thread
class Polling extends Thread {
    static final long DELAY = 3000;

    @Override
    public void run() {
        while (isRunning) {
            try {
                // Do something
                Log.d(TAG, "Polling run'ing");
                // Sleep
                Thread.sleep(DELAY);
            } catch (InterruptedException e) {
                // Interrupted
                isRunning = false;
            }
        }
    }

}
}

然而,当我运行我在LogCat中看到的应用程序“创建时”和“启动时”以及“轮询运行时”,我会重新运行该程序,查看我是否只在LogCat中看到“启动时”。但是我得到了这个错误:

ActivityManager:Starting:Intent{act=android.Intent.action.MAIN cat=[android.Intent.category.LAUNCHER]cmp=com.project.keegan/.StartApp} ActivityManager:警告:活动未启动,其当前任务已被置于最前面

当我查看日志时,它仍然显示“正在运行”。于是我进入模拟器:菜单->应用程序管理器->并停止了服务

当我重新运行程序时,我得到了相同的两个错误,我的应用程序启动了,但服务没有启动。但有趣的是,每当我对代码做任何修改(比如我只是按下空格键,然后退格)并单击“保存”,然后重新运行程序时,服务就会再次运行

这是我称之为的班级:

公共类StartApp扩展活动实现View.OnClickListener{

TextView disp_hello;
Button but_go2send, but_go2request;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.start_app);
    Vars();
    startService(new Intent(this, PollingService.class));
    but_go2send.setOnClickListener(this);
    but_go2request.setOnClickListener(this);
}
。 . .
}您的问题与代码无关。Eclipse足够智能,可以检测到您没有更改任何代码,并且它跳过了更换设备上的应用程序

而不是重新启动应用程序(这将涉及杀死它),它只是把它带回到前面


如果你想重新启动它,你需要存在/关闭应用程序,或者像你那样插入一个空间。

好的,谢谢,我想我明白你的意思了。我现在要在我的手机上测试一下:我要启动应用程序,停止服务,然后重新启动应用程序,服务应该会重新启动。是的,很好,谢谢你……我想这就是你所说的假警报。@KeeganForde有时会让人困惑,但不会崩溃。此外,当您离开启动服务的活动时,服务不会停止。(
return super.onStartCommand(intent,flags,startId);
告诉Android保持服务运行->直到您通过
stopService
明确停止为止)。谢谢您的提示。我不确定我希望服务在应用程序中的什么地方停止运行,但当我到达那里时,我会使用它@zapl@KeeganForde对称性通常是好的:如果您在
onCreate
中启动它,请在
onDestroy
中停止它。或者改用
onStart
/
onStop
。您甚至可以使用该模式在活动之间切换,因为您离开的活动的
onStop
是在您转到的活动的
onStart
之后调用的。此外,如果新活动在旧活动请求停止服务之前请求启动服务,则服务实际上不会停止。