2017-01-12 8 views
0

Я хочу создать услугу намерения, которая работает все время в целом приложении (во всей деятельности) с периодом времени и выполняет эту задачу. Я использую обработчик. Я начал службу в действии. Я вижу, что только один раз сервис работает (что делать) почему? Это моя служба:Служба намерений Android для Android работает только один раз

public class SenderXML extends Service { 

    public static boolean running = false; 
    private Timer timer = new Timer(); 
    private SendXMLTask sendXMLTask; 
    private Context context; 

    static String convertStreamToString(java.io.InputStream is) { 
     java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); 
     return s.hasNext() ? s.next() : ""; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     context = getApplicationContext(); 
     Gson gson = new Gson(); 
     MainActivity.xmlList = null; 
     MainActivity.xmlList = new ArrayList<>(); 
     SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("TAG", Context.MODE_PRIVATE); 
     List<String> productFromShared1 = new ArrayList<>(); 
     String jsonPreferences1 = sharedPref.getString("TAG1", ""); 

     Type type1 = new TypeToken<List<String>>() { 
     }.getType(); 
     productFromShared1 = gson.fromJson(jsonPreferences1, type1); 
     if (productFromShared1 != null) 
      MainActivity.xmlList.addAll(productFromShared1); 
     Log.e("tworzenie serwisu ", "tworzenie"); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.e("Dziełanie serwisu ", "Dziełanie"); 
     Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 

      @Override 
      public void run() { 
       Log.e("Dziełanie serwisu 1111", "Dziełanie 111"); 
       if (!MainActivity.xmlList.isEmpty()) { 
        if (NetworkUtil.isNetworkAvailable(context)) { 
         if (!running) { 
          sendXMLTask = new SendXMLTask(); 
          sendXMLTask.execute(); 
         } 
        } 
       } 
      } 
     }, 1000 * 60 * 2); 

     return super.onStartCommand(intent, flags, startId); 
    } 

    @Override 
    public void onDestroy() { 
     if (running) { 
      timer.cancel(); 
      sendXMLTask = new SendXMLTask(); 
      sendXMLTask.cancel(true); 
      running = false; 
     } 
     Log.e("service ", "nie działa"); 
     super.onDestroy(); 
    } 

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

    class SendXMLTask extends AsyncTask<Void, Void, String> { 

     @Override 
     protected String doInBackground(Void... voids) { 
      Log.e("xml ", MainActivity.xmlList.size() +""); 
      running = true; 
      HttpClient httpclient = HttpClientUtil.getHttpClient(getApplicationContext()); 
      HttpPost httppost = new HttpPost(Util.getServerUrl(getApplicationContext()) + "/SetData"); 
      ArrayList<NameValuePair> namevaluepairs = new ArrayList<>(2); 
      namevaluepairs.add(new BasicNameValuePair("token", String.valueOf(E_Gps.TOKEN))); 
      namevaluepairs.add(new BasicNameValuePair("xml", MainActivity.xmlList.get(0))); 
      if (MainActivity.xmlList.size() > 0) { 
       MainActivity.btTransfer.setBackgroundColor(Color.YELLOW); 
      } 
      try { 
       httppost.setEntity(new UrlEncodedFormEntity(namevaluepairs)); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } 
      HttpResponse response = null; 
      try { 
       response = httpclient.execute(httppost); 
      } catch (IOException e) { 
       e.printStackTrace(); 
       return null; 
      } 
      InputStream responseInputStream = null; 
      try { 
       responseInputStream = new BufferedInputStream(response.getEntity().getContent()); 
       try { 
        int tt = ResponseParser.getResponseType(responseInputStream); 
        if (tt == 0) { 
         return null; 
        } 
       } catch (EmptyResponseException | UnknownAnswerName | XmlPullParserException e) { 
        e.printStackTrace(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      Log.e("xml", MainActivity.xmlList.get(0)); 
      Log.e("xml wys ", convertStreamToString(responseInputStream)); 
      return convertStreamToString(responseInputStream); 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
      if (s != null) { 
       MainActivity.xmlList.remove(0); 
       Gson gson = new Gson(); 
       String jsonCurProduct = gson.toJson(MainActivity.xmlList); 
       SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("TAG", Context.MODE_PRIVATE); 
       SharedPreferences.Editor editor = sharedPref.edit(); 
       editor.putString("TAG1", jsonCurProduct); 
       editor.apply(); 
      } 
      if (!MainActivity.xmlList.isEmpty()) { 
       sendXMLTask = new SendXMLTask(); 
       sendXMLTask.execute(); 
      } else { 
       MainActivity.btTransfer.setBackgroundColor(Color.GREEN); 
      } 
      running = false; 
     } 
    } 
} 

ответ

1

При вызове startService() в вашем Activity, то Service создается (если он уже не существует) и onStartCommand() называется. onStartCommand() не будет вызываться снова, если вы снова не позвоните startService().

Поскольку вы вывешивать Runnable в onStartCommand(), вы просто должны иметь свой сам Runnable REPOST для запуска после определенного периода времени (если вы хотите, чтобы это работать непрерывно).

Убедитесь, что вы остановили свой Service, когда закончите с этим.

+0

Не могли бы вы объяснить мне, как я могу это сделать? Я хочу создать службу, которая работает все время в целом приложении (во всей деятельности) и повторяет действие за раз. –

+0

В конце вашего «Runnable» просто запустите «Runnable» в «Handler», чтобы он запускался после X миллисекунд. –

+0

Я не понимаю, не могли бы вы показать мне –

1

Вы пробовали с помощью менеджера сигнализации начать Intent службы периодически? Если вы не пробовали, вы можете перейти по этой ссылке для Alarm Manager Example

Вы можете запускать свою Intent Service периодически с помощью Alarm Manager.

 Смежные вопросы

  • Нет связанных вопросов^_^