一段时间后,android后台服务停止

Posted

技术标签:

【中文标题】一段时间后,android后台服务停止【英文标题】:android background service stops after some time 【发布时间】:2017-10-04 12:13:35 【问题描述】:

我创建了一个后台服务,它会定期访问我的服务器,但不幸的是,后台服务会在一段时间后停止。

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);





【问题讨论】:

使用 Job schedular 为您做常规任务或前台服务 我不想要前台服务,我想要后台服务,它会定期向服务器发送信息,但我的应用服务会在 1-2 小时后停止。请给我解决方案,以便我的服务不会被 android OS 停止 【参考方案1】:

随着最新版本的 Android API 级别 26,后台服务受到限制。请参考Background execution limits

【讨论】:

让它成为前台,唯一的权衡是你会有通知【参考方案2】:

仅当 startService 从代码的任何位置调用一次时,onStartCommand 才会自动撤销。所以只在 Manifest 中声明服务是不够的。

所以,通过调用来运行服务

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

如果服务没有停止,上面的代码 onStartCommand 方法将被周期性地撤销。

请注意,从最近关闭服务中删除应用程序。还有

@Override
public void onTaskRemoved(Intent rootIntent) 


方法正在被调用。

如果您手动启动服务,即使正在关闭,它也会自动重新启动。

【讨论】:

我已经使用了这种方法,但仍然不适合我。一段时间后服务仍然停止

以上是关于一段时间后,android后台服务停止的主要内容,如果未能解决你的问题,请参考以下文章

iphone:一段时间后停止使用后台定位服务

Android服务在其仍处于活动状态时停止后台处理

当应用程序进入后台时停止后台服务

ios12后台定位服务停止

无法停止后台服务android

服务在真实设备上运行一段时间后停止运行(> 40 分钟)在模拟器上运行