【问题标题】:Android service is executing twiceAndroid服务正在执行两次
【发布时间】:2015-03-12 19:44:06
【问题描述】:

我正在制作一个安卓应用程序。 我通过在主 Activity 的 onCreate 方法中调用 startService 方法在启动活动中启动服务

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.getActionBar().hide();
    setContentView(R.layout.activity_main);
    starService();
}


 private void starService() {
        startService(new Intent(getBaseContext(), HelenaService.class));
 }

当我敬酒以查看在我的服务中如何调用这些方法时。我看到这个方法被调用了两次..

@Override
public void onStart(Intent intent, int startId) {
  Toast.makeText(this, "service started", Toast.LENGTH_SHORT).show();
}

我的意思是,我可以看到第一个 toast 立即被调用,几秒钟后出现完全相同的 toast 消息。

如何确保 onStart 方法只被调用一次。尝试了一个标志,但变量被重新启动。

有什么帮助吗?或建议?

【问题讨论】:

  • 你能发布更多的服务吗?另外,你在哪里调用 startService()?
  • 我在启动器活动的 onCreate 方法中调用 starService()。该服务在方法中只有 toast msg:onStartCommand 和 OnStart
  • 检查我的答案,看看它是否准确。
  • 你的意思是我看到两次 Toast 消息,因为我在两种方法中都放了两个 Toast 消息?我做到了,但是每个 toast 都有一个不同的消息,“toast in start”和“toast in startCommand”,我在几秒钟内看到这两次..
  • 啊,看到这些是最初需要提供的细节。你做了Log.e吗?会发生什么?

标签: android service handler


【解决方案1】:

标志变量正在“重新启动”,因为您在 starService() 中启动了一个新服务

在没有看到更多代码的情况下,我可以看到的解决方案是在 starService() 中放置一个标志

private Boolean flag = true;

然后:

private void starService() {
 if (flag){
    startService(new Intent(getBaseContext(), HelenaService.class));
    flag = false;
    }
}

【讨论】:

  • 试过了,还是可以看到服务执行了两次。
  • 您需要发布您的代码,从您发布的 sn-ps 无法判断。
【解决方案2】:
String TAG = CLASSNAME.class.getConicalName();

在各自的方法中放置 Log.e(TAG, "---onStart()---");Log.e(TAG, "---onStartCommand()---");

检查“错误”下的 LogCat,如果您同时看到这两个日志,则说明这两种方法都被调用了。

如果这两个方法在服务启动时都被调用,并且它们都包含一个 toast,那么这就是您看到两次 toast 的原因。

此外,如果在您关闭应用程序后服务继续运行,您可能希望强制停止/清除应用程序设置中的数据。您将需要实现停止服务的逻辑,例如 stopSelf();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    相关资源
    最近更新 更多