如何在运行服务时停止服务?

时间:2014-08-07 14:35:38

标签: android service android-asynctask

在我的应用程序中,我使用以下代码在后台运行服务。

Service myser=new Intent(EmailRegistrationActivity.this, BackgroundService.class);
startService(myser);

在我的服务类中,我正在使用AsyncTask类。在那个AsyncTask类中,我必须从设备获取sms和mms并发布到我的本地服务器。在进程之间,用户想要注销。所以在那个注销方法中我想停止服务。

这是服务类

public class BackgroundService extends Service{
@Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
@Override
    public void onCreate() {
        super.onCreate();
}
 @SuppressLint("NewApi")
    public int onStartCommand(Intent intent, int flags, int startId) {

        if(startId>1)
        {
            if(CheckInternetConnection.isOnline(BackgroundService.this))
            {
         dob=new Doinback();
         dob.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        }else{
            //check2=preferences.
        SharedPreferences.Editor editor = preferences.edit();
        editor.putBoolean("checkbackground", true);
        editor.commit();

        }
        }

      return 1;
    }
    public void onStart(Intent intent, int startId) {

    }
    public IBinder onUnBind(Intent arg0) {
        return null;
    }

    public void onStop() {

        this.stopSelf();

    }
    public void onPause() {

    }

    @Override
    public void onDestroy() {

         super.onDestroy();

         Log.e("Destroy=======@@@@@@@","method calling");
         dob.cancel(false);

          while(strtId>0){
              this.stopSelf(strtId);
              strtId--;
          }

         onStop();
    }

    @Override
    public void onLowMemory() {

    }
}

这是asynctask类

class Doinback extends AsyncTask<URL, Integer, Long>{
    protected void onPreExecute() 
    { 

    }
    protected Long doInBackground(URL... arg0) {

    if(!isCancelled())
    {
    try {   
        strResLastmessage_time = UrltoValue.getValuefromUrl(DataUrls.lastmessage_time + "userid="+strUserId);
        JSONObject jsonObj = new JSONObject(strResLastmessage_time);
        strLastMessage_time = jsonObj.getString("lastdatetime");            
        preferences = PreferenceManager.getDefaultSharedPreferences(BackgroundService.this);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putLong("msgtime", Long.parseLong(strLastMessage_time));
        editor.commit();
        } catch (Exception e) {
    //      e.printStackTrace();
        }
        messages.clear();
        readSmsFromDevice();
        checkMessages();    
     }
     return null;
    }
    protected void onCancelled() {    
    }

    protected void onPostExecute(Long result) {
        //check=preferences.getBoolean("checkbackup", true);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putBoolean("checkbackup", true);
        editor.putBoolean("checkbackground", true);     
        editor.commit();     
    }
}//async class

在这个asyntask类中我使用readsmsfromdevice方法和checkmessages方法从设备获取数据并发布到服务。但我的要求是每当用户想要注销时,服务必须停止。所以我使用的是以下代码停止服务并停止asynctask。

BackgroundService.dob.cancel(true);
getActivity().stopService(new Intent(getActivity(), BackgroundService.class));

但它不起作用,仍然在后台继续进行。请建议我如何停止此服务。谢谢提前......

2 个答案:

答案 0 :(得分:0)

您正在调用正确的方法&#34; this.stopSelf()&#34;。我曾经有过这个问题,并在添加返回Service.START_NOT_STICKY之后就可以了。您可以在onStartCommand方法上添加此代码并检查它是否有效:

return Service.START_NOT_STICKY;

答案 1 :(得分:0)

您需要的是IntentService。From docs:

  

IntentService是处理异步的Services的基类   请求(表示为Intents)。客户端发送请求   通过startService(Intent)调用;该服务根据需要启动,   使用工作线程依次处理每个Intent,并自行停止   当它用完了。

请参阅此链接,了解如何使用IntentService:

http://code.tutsplus.com/tutorials/android-fundamentals-intentservice-basics--mobile-6183