2017-01-12 5 views
0

期間全体の全アプリケーション(すべてのアクティビティ)で常に動作するインテントサービスを作成して、タスクを実行したいと考えています。私はハンドラを使用します。私は活動で奉仕を始めました。私はそれが唯一の時間はサービス仕事(それはタスクを行う)を参照してくださいなぜですか? これは私のサービスです。Javaアンドロイドインテントサービスは1回のみ動作します

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

ActivitystartService()を呼び出すと、Serviceが作成されます(存在しない場合)。onStartCommand()が呼び出されます。 startService()に再度電話しない限り、onStartCommand()は再度呼び出されません。

RunnableonStartCommand()に転記しているので、一定期間後に(自分がこれを継続して実行したい場合は)Runnable再送信する必要があります。

完了したらServiceを停止してください。

+0

どうすればいいのか説明できますか?私はアプリケーション全体(すべてのアクティビティ)で常時動作し、一度にアクションを繰り返すサービスを作成したいと考えています。 –

+0

'Runnable'の最後に' Runnable'を再度 'Handler'にポストするだけで、Xミリ秒後に実行されます。 –

+0

あなたが私を見せてくれるのか分からない –

1

あなたが定期的にあなたのテントのサービスを開始するにはアラームマネージャを使用してみましたか? あなたは試していない場合、あなたはあなたがアラームマネージャで定期的にあなたの意思サービスを開始することができます Alarm Manager Example

ために、このリンクをたどることができます。

関連する問題