2017-03-27 12 views
1

タイトルに似た質問は検索されていますが、解決策はまだありません。 私は、次のサービスにAndroidサービスを停止する

public class MyService extends Service { 
    public MyService() { 
    } 

    private static final String TAG = 
      "ServiceExample"; 

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

    @Override 
    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 " + currentId); 
       } 
       //stopSelf(); 
      } 
     }; 

     Thread t = new Thread(r); 
     t.start(); 
     return Service.START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     Log.i(TAG, "Service onBind"); 
     return null; 

    } 

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

} 

を持っており、これは2つのボタンがあり、私の活動から呼び出された:それは

public class ServiceExampleActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_service_example); 
    } 

    public void buttonClick(View view) 
    { 
     Intent intent = new Intent(this, MyService.class); 
     startService(intent); 
    } 

    public void stopClick(View view) 
    { 
     Intent intent = new Intent(this, MyService.class); 
     stopService(intent); 
    } 

} 

しかし、これは動作しません停止するためのサービスを開始するための1つずつ。サービスは停止しません。 不思議なことに、onDestroy関数が呼び出されますが、その後は実行可能ファイルがまだ実行されています。 サービスを停止するにはどうすればよいですか?

=============================

EDIT:(それはonStartCommand内で宣言される前に)、スレッドTがクラスメンバーでなければならなかったと私はこのように実行可能な修飾onDestroy機能において

@Override 
    public void onDestroy() { 
     Log.i(TAG, "Service onDestroy"); 
     // mHandler.removeCallbacks(r); 
     t.interrupt(); 
     super.onDestroy(); 
     //Log.i(TAG, "Service Destroyed"); 
    } 

:私は最終的に次のように変更することによってそれを達成

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) { 
           return; //HERE to detect if the thread has been interrupted 
          } 
         } 
        } 
        Log.i(TAG, "Service running " + currentId); 
       } 
       stopSelf();//I have to use this otherwise it doesn't stop 
      } 
     }; 

通常、私はstopSelf中断された場合は必要ありません。私はstop自身がonDestroyを呼び出すと仮定します。

答えて

3

サービスを停止するだけでコンテキストが強制終了されます。フレームワークは、あなたが起動している可能性のある他のスレッドについては知らず、onDestroy()でそれらを殺す仕事をしていません。作成時にスレッドを保存します。 onDestroy()では、中断してください。スレッドのrunnableでは、スレッドが中断されているかどうか定期的にチェックし、そうであれば戻ります。 Thread.stop()に電話しないでください。アプリが安全でない状態になる可能性があります。

+0

ありがとうございました。あなたの助言に基づいて私が行った変更をもとに、質問を修正しました。それは今働いているようだ! – KansaiRobot

関連する問題