Android - 服务保持活力

时间:2012-07-13 11:01:01

标签: android service

系统有问题。我有运行服务,它不断检查位置,并计算用户启动后的距离和时间。但是在20-25分钟之后,许多与其他应用程序服务的交互正在被杀死。

我该怎样阻止它?

我正在考虑增加第二项服务,让我活着。

3 个答案:

答案 0 :(得分:2)

不确定这是否适合您,但这是我实现它的方式:

在我的情况下,我需要一个服务,以便每隔X分钟在后台运行一次,无论何时关机(无论是由于内存使用还是主要活动转到后台并且Android清理它),它都会再次重新触发到达下一个时间间隔时。我有以下组件和工作流程:

  1. 活动A.主要活动,我的申请的起点。
  2. 服务S.服务我想在后台运行,做任何需要做的事,
    完成后关闭,并在每X分钟后重新开始。
  3. Activity onCreate方法会创建一个 PendingIntent ,并将其自身和服务S传递,如下所示:

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        // Create an IntentSender that will launch our service, to be scheduled
        // with the alarm manager.
        periodicIntentSender = PendingIntent.getService(
                  ActivityX.this, 0, new Intent(ActivityX.this, ServiceS.class), 0);
    

    在我的活动中,我实现了一个 AlarmManager ,它将“ periodicIntentSender ”(上面定义)作为参数并根据用户首选项(connection_Interval)发送意图:

    // Schedule the alarm to start
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.setRepeating(
      AlarmManager.ELAPSED_REALTIME_WAKEUP, 0, connection_Interval, periodicIntentSender);
    

    AlarmManager将确保每隔X分钟发送一次意图。 我的服务S一直在监听这个意图,每次发送这样的意图时都会被唤醒。只要再次触发服务,就会调用其 onHandleIntent 方法。

    public class ServiceS extends IntentService implements LocationListener {
    .
    .
       /*
        * (non-Javadoc)
        * 
        * @see android.app.IntentService#onHandleIntent(android.content.Intent)
       */
        @Override
        protected void onHandleIntent(Intent intent) {
          <WHATEVER YOU NEED TO DO>
        }
    }
    

    希望这有帮助。

答案 1 :(得分:1)

  

但是经过20-25分钟和许多其他应用程序的交互   服务正在被杀死。

最有可能的原因是内存使用量太大,然后自动内存管理器终止了你的进程或长时间运行的操作,如 @AljoshaBre

  

我该怎样阻止它?

所以我的第一个想法是检查Service是否在某个生命周期方法中运行,例如在onResume()中,如果没有,只需要重新启动Service并执行它试。

答案 2 :(得分:1)

1,最小化服务的内存使用量

2,使您服务前台,例如在服务的onCreate方法

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

     Notification notification = new Notification(R.drawable.icon_app_small, getText(R.string.app_name),System.currentTimeMillis());
     Intent notificationIntent = new Intent(this, [yourService].class);
     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
     notification.setLatestEventInfo(this, [name string], [notification msg string], pendingIntent);
     startForeground(Notification.FLAG_ONGOING_EVENT, notification);
}