【问题标题】:Multiple Services on Multiple Threads Lifecycle多线程生命周期上的多个服务
【发布时间】:2014-09-02 16:45:03
【问题描述】:

这些方法在扩展服务的类中实现。每次按下按钮时都会启动一项新服务。

如果按钮被按下一次,LogCat 会输出我期望的结果,其中包括“Service onDestroy”的最终输出。但是,当按钮被按下两次时,第一次服务结束前的第二次,“Service onDestroy”。当第一个服务完成时只显示一次,第二个服务打印出其余的“服务运行”日志,而不是“服务 onDestroy”。

谁能告诉我为什么?谢谢!

public int onStartCommand(Intent intent,int flags, int startId) {
    Log.i(TAG,"Service onStartCommand " + startId);

    final int currentId = startId;

    Runnable r = new Runnable() {
        public void run() {
            for (int i = 0; i < 3; i++) {
                long endTime = System.currentTimeMillis() + 10*1000;
                while (System.currentTimeMillis() < endTime) {
                    synchronized(this) {
                        try {
                            wait(endTime - System.currentTimeMillis());
                        }catch (Exception e) {

                        }
                    }
                }
                Log.i(TAG,"Service running");
            }
            stopSelf();
        }
    };

    Thread t = new Thread(r);
    t.start();


    return Service.START_STICKY;
}


@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    Log.i(TAG,"Service onBind");

    return null;
}



@Override
public void onDestroy() {
    Log.i(TAG,"Service onDestroy");
}

【问题讨论】:

    标签: android multithreading android-service


    【解决方案1】:

    在他们使用的服务指南中,扩展服务时不使用 stopSelf(),而是使用 stopSelf(startId)。第一个 stopSelf() 可能会停止您的服务的两次执行。

    请看这里:http://developer.android.com/guide/components/services.html

    编辑:此外,即使有多次执行运行,服务也只会创建和销毁一次,但它仍然是单个服务。在您的情况下(绑定服务),它只会在最后一次执行完成时被销毁。要记录每个执行结束,您可以尝试覆盖 stopSelf(int startId) 方法。

    【讨论】:

      猜你喜欢
      • 2020-10-28
      • 1970-01-01
      • 2018-09-11
      • 2016-09-08
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多