2017-10-04 130 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