2016-08-27 14 views
0

私は数秒ごとに何かを実行し、一定時間が経過するまでスリープするサービスを持っています。理想的ではありませんが、私の目的には効果的です。私は、NotifActivityの開始のためのレイアウトにボタンを持っていて、NotifServiceと呼ばれるサービスを要求したいと思っています。ここで私はNotifServiceに持っているものは基本的である:レイアウト内の他のアクティビティのボタンが押されたときにサービスを停止する方法

public class NotifService extends IntentService { 
public NotifService() { 
    super("NotifService"); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    while(true){ 
     try { 
      checkcalc(); 
      Thread.sleep(1000); 

     } catch (InterruptedException e) { 
      // Restore interrupt status. 
      Thread.currentThread().interrupt(); 
     } 
    } 
} 
public void checkcalc() { 
    //some code I am trying to run 
} 

public void notifSend(String num){ 

    //Sends a notification 
    } 
} 

、サービスを開始するために呼び出されNotifActivityのビット:

public void sendNotification(View view) { 
    Intent serviceIntent = new Intent(this, NotifService.class); 
    startService(serviceIntent); 

} 

どのように私は今、サービスを停止するのでしょうか? stopService(serviceIntent)は効果がないようですので、何をしなければなりません。

ありがとうございます!

+1

"* stopService(serviceIntent)は無効と思われます*" ...なぜですか? – Shaishav

+0

ボタンをトリガーとするメソッドの中にそのメソッドを配置しても、通知は定期的に受信されるため、通知サービスは停止していないようです。 –

答えて

2

これはチェックする必要があり続けることをサービス揮発性の静的変数を利用して簡単な回避策ソリューションであると確認し、あなたのサービスの行のいくつかの状態を続ける:

class MyService extends IntentService { 
public static volatile boolean shouldContinue = true; 
public MyService() { 
    super("My Service"); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    doStuff(); 
} 

private void doStuff() { 
    // do something 

    // check the condition 
    if (shouldContinue == false) { 
      stopSelf(); 
      return; 
     } 

    // continue doing something 

    // check the condition 
    if (shouldContinue == false) { 
     stopSelf(); 
     return; 
    } 

     // put those checks wherever you need 
    } 
} 

とあなたの活動では、この操作を行いますあなたのサービスを停止し、

MyService.shouldContinue = false; 
0

ない理想的な、しかし、私の目的のために有効。

ベストケースのシナリオでは、コードが確実に機能しません。たとえば、デバイスがスリープモードになると機能しません。

(最悪のシナリオが怒っユーザーと銃を伴う)

何を提案することがwhat the user will wantで本当にであることを確認してください。ここで

私はNotifServiceに持っているものは基本的である:あなたが無期限にそのスレッドを拘束するため

IntentServiceが設計されていません。このため、問題を解消するにはstopService()で停止しています。

どうすればサービスを停止できますか?

あなたはonStartCommand()でキックオフすることを、独自のスレッドで、あなた自身のServiceサブクラスでサービスを置き換えます。あなたのUIはstopService()と呼ばれ、onDestroy()にはそのスレッドをある意味で終了させます。例えば

は、あなたused ScheduledExecutorService場合、代わりにThread.sleep()ループの、onStartCommand()はあなたの定期的なジョブをスケジュールするだろうとonDestroy()ScheduledExecutorServiceshutdown()でしょう。 ScheduledExecutorServiceはバックグラウンド作業のためのものを提供するので、スレッドを混乱させる必要はありません。onHandleIntent()

1

あなたはこのコードを持っている:

while(true){ 
    try { 
     checkcalc(); 
     Thread.sleep(1000); 

    } catch (InterruptedException e) { 
     // Restore interrupt status. 
     Thread.currentThread().interrupt(); 
    } 
} 

実行しているから、それを停止するには何もないので、これは、実行を停止することはありません。 IntentServiceがワーカースレッドを開始しました。このワーカースレッドはonHandleIntent()を呼び出しました。 stopService()に電話しても、実行中のワーカースレッドを停止するものはありません。

アーキテクチャに欠陥があります。 IntentServiceは、この使用を目的としていません。最終的にonHandleIntent()への呼び出しが完了すると、IntentServiceを使用する必要があります。

普通のServiceを使用し、onStartCommand()を上書きしてください。 onStartCommand()には、Handlerを作成し、希望するものを投稿するRunnableを投稿してください。このRunnableの最後に、RunnablepostDelayed()を使用してHandlerに自身を送信することができます。これは(スレッドをスリープさせる代わりに)一定の遅延の後に再びRunnableを実行します。 stopService()に電話するときは、ServiceonDestroy()が呼び出され、Runnableが再び実行されないようにするにはremoveCallbacks()に電話する必要があります。

関連する問題