2017-03-21 10 views
1

私は同様の質問をすべて読んで試しましたが、私は問題を解決できません。私は5秒ごとにこのサービスショートーストのメッセージを作成します。しかし、私はこのサービスを止めることはできません。あなたは私に修正や異なる方法を手伝ってもらえますか?ありがとうございました。サービス停止 "ハンドラループコード"が機能しません

public class myservice extends Service { 
@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    go2sec(); 
    return super.onStartCommand(intent, flags, startId); 
} 

private void go2sec() { 
    new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      Toast.makeText(myservice.this, "hello", Toast.LENGTH_LONG).show(); 
      go2sec(); 
     } 
    }, 5000); 
} 

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

--- --- Mainactivity

私はサービスを開始することができます。

サービスを停止することはできません。

stopService(new Intent(this, myservice.class)); 

答えて

0

サービス内のハンドラコールバックを削除する必要があります。そしてサービスを中止するためにstopSelf()に電話してください。ここで

は、コードは次のとおりです。

public class Myservice extends Service { 

    final Handler handler = new Handler(); 

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

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     go2sec(); 
     return super.onStartCommand(intent, flags, startId); 
    } 

    private Runnable task = new Runnable() { 
     public void run() { 
      Toast.makeText(Myservice.this, "hello", Toast.LENGTH_LONG).show(); 
      go2sec(); 
     } 
    }; 

    private void go2sec() { 
     handler.postDelayed(task, 5000); 
    } 

    @Override 
    public void onDestroy() { 
     handler.removeCallbacks(task); //remove handler 
     stopSelf(); //stop the service 
     super.onDestroy(); 
    } 

} 
+0

おかげアフマドけど "stopService();" をもううまくいきませんか? –

+0

ありがとうございました。 –

+0

あなたはwlcomeです...幸せなコーディング – rafsanahmad007

0

ハンドラを停止する必要があります。

onDestroyメソッドのhandlerremoveCallbacksに電話する必要があります。

サービスを正しく停止する必要があります。

0

は、ソリューション検索:

public class VolumeService extends Service { 
     boolean running; 
     Thread t; 

     } 

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

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

     @Override 
     public void onDestroy() { 
      Log.d("service destroyed", "destroyed"); 
      running = false; 
      super.onDestroy(); 
     } 
     @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     running = true; 
     t = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       while (running) { 

         if ("check your condition when you want to start the job") { 
          Log.d("Service", "Service:Started"); 
          try { 
           startJob(); 
           waitForSometime(); 
          } catch (Exception e) { 
           e.printStackTrace(); 
          } 
         } else { 
          t.interrupt(); 
          Log.d("ServiceStop", "Service:Stopped"); 
          running = false; 
         } 

       } 
      } 
     }); 
     t.start(); 
     return START_STICKY; 
    } 

    private void startJob() { 
     Handler handler = new Handler(Looper.getMainLooper()); 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 

       // your logic/business implementation 
      } 
     }); 
    } 


    } 
関連する問題