2017-10-04 131 views
1

我創建了一個後臺服務,它定期打到我的服務器,但不幸的是,後臺服務在一段時間後停止。安卓後臺服務在一段時間後停止

public class LocationService extends Service{ 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    //TODO do something useful 

     new DownloadFilesTask().execute(""); 
     Toast.makeText(getApplicationContext(), "start", Toast.LENGTH_SHORT).show(); 

    return START_STICKY; 
} 


private class DownloadFilesTask extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... params) { 

    try { 
     URL url = new URL(siteurl); 
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
     try { 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
      StringBuilder stringBuilder = new StringBuilder(); 
      String line; 
      while ((line = bufferedReader.readLine()) != null) { 
       stringBuilder.append(line).append("\n"); 
      } 
      bufferedReader.close(); 
      return stringBuilder.toString(); 

     } 
     finally{ 
      urlConnection.disconnect(); 
     } 
    } 
    catch(Exception e) { 
     Log.e("ERROR", e.getMessage(), e); 
     return null; 
    } 

    } 

    @Override 
    protected void onPostExecute(String result) { 
    } 

    @Override 
    protected void onPreExecute() { 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
    } 
} 

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

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

    Intent myIntent = new Intent(getApplicationContext(), LocationService.class); 

PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, myIntent, 0); 

AlarmManager alarmManager1 = (AlarmManager) getSystemService(ALARM_SERVICE); 


alarmManager1.cancel(pendingIntent); 
Calendar calendar = Calendar.getInstance(); 

calendar.setTimeInMillis(System.currentTimeMillis()); 

calendar.add(Calendar.SECOND, 10); 

alarmManager1.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
alarmManager1.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_FIFTEEN_MINUTES, pendingIntent); 

} 
@Override 
public void onTaskRemoved(Intent rootIntent) { 
    super.onTaskRemoved(rootIntent); 

    Intent myIntent = new Intent(getApplicationContext(), LocationService.class); 

PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, myIntent, 0); 

AlarmManager alarmManager1 = (AlarmManager) getSystemService(ALARM_SERVICE); 


alarmManager1.cancel(pendingIntent); 
Calendar calendar = Calendar.getInstance(); 

calendar.setTimeInMillis(System.currentTimeMillis()); 

calendar.add(Calendar.SECOND, 10); 

alarmManager1.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
alarmManager1.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_FIFTEEN_MINUTES, pendingIntent); 


} 

} 
+1

使用作業程序器做你經常性的工作或前景的服務 – nomag

+0

我不想前臺服務,我想後臺服務,我發信息給服務器上定期,但1-2小時後我的應用服務停止。請給我的解決方案,以便我的服務沒有停止通過android操作系統 –

回答

0

隨着最新版本的Android API級別26,對後臺服務有限制。請參閱Background execution limits

+0

它不工作在Android API Level 23也 –

0

只有在代碼的任何位置調用startService時,onStartCommand纔會自動撤銷。因此僅在Manifest中聲明服務是不夠的。

所以,通過調用

startService(new Intent(context, serviceName.class)); 

按照上面的代碼onStartCommand方法將定期撤銷如果服務沒有停止運行的服務。

有關您的信息,請從近期關閉服務中刪除應用程序。並且

@Override 
public void onTaskRemoved(Intent rootIntent) { 

} 

方法正在被調用。

如果您手動啓動服務,即使正在關閉,它也會自動重新啓動。

+0

我已經使用此方法,但仍然不適合我。服務在一段時間後仍然停止 –

+0

這可能對你有幫助-https://stackoverflow.com/a/44898088/4310861 – Exigente05