2016-05-13 33 views
1

我已经创建了我的Android应用程序中的Service这是工作的罚款。但是当我点击stopButton时,我想阻止它(完全死亡)。为此,我编写了此代码,但是当单击stopButton时,此代码不会停止该服务。所以请帮助。服务不停止在调用stopService()

服务

public class HelloService extends Service { 

    static boolean isRunning = false; 

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

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     isRunning = true; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       for (int i = 0; i < 20; i++) { 
        try{Thread.sleep(3000);}catch(Exception e){} 
        Log.e("Update", i + "", new Exception()); 
       } 
      } 
     }).start(); 
     return Service.START_NOT_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     isRunning = false; 
     stopSelf(); 
    } 

} 

MainActivity

Button startButton = (Button)findViewById(R.id.start); 
startButton.setOnClickListener(this); 
startButton.setOnClickListener(
    new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent startServiceIntent = new Intent(MainActivity.this, HelloService.class); 
      startService(startServiceIntent); 
     } 
    } 
); 


Button stopButton = (Button)findViewById(R.id.stop); 
stopButton.setOnClickListener(this); 
stopButton.setOnClickListener(
    new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent stopServiceIntent = new Intent(MainActivity.this, HelloService.class); 
      stopService(stopServiceIntent); 
     } 
    } 
); 
+1

我的理解是,你需要中断/杀/停止该线程自己 –

+0

您的代码看起来不错,你是如何验证该服务没有停止? – jimmy0251

+0

'onStartCommand()'中的循环在调用'stopService()'时不会停止。 @ jimmy0251 –

回答

0

我想你误会线程和服务。

new Thread(new Runnable() {}).start();后,了Runnable里面的东西在另一个线程中运行,因此它不会停止,如果主叫方停止。

如果你需要一个内部服务计时器,创建一个默认的处理程序,而不是新的线程。

0

为了停止线程,您需要在onDestroy中调用Thread.interrupt()方法,但要做到这一点,您必须从该线程获取全局引用,因为它位于onStartCommand的内部。一旦调用破解器,就会抛出一个异常,并且从那个catch block我们将立即结束您的线程的生命周期。

为了更好地理解我说的话:

public class HelloService extends Service { 

    Thread ref; 
    boolean isInterrupted = false; 

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

    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     ref = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       for (int i = 0; i < 20; i++) { 
        try { 
         Thread.sleep(3000); 
        } catch (InterruptedException e) { 
         if (isInterrupted) { 
          return; 
         } 
        } 
       } 
      } 
     }); 
     ref.start(); 
     return Service.START_NOT_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     isInterrupted = true; 
     ref.interrupt(); 
    } 

}