0

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

我该如何预防?

我正在考虑添加第二项服务,这将使我保持活力。

4

3 回答 3

2

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

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

  1. 活动 A. 主要活动,我的应用程序的起点。
  2. Service S. 我想在后台运行的服务,做它需要做的任何事情,
    完成后关闭,每隔 X 分钟重新启动一次。

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 分钟发送一次意图。我的 Service S 一直在监听这个 Intent 并在每次发送这样的 Intent 时被唤醒。一旦再次触发服务,就会调用其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>
    }
}

希望这可以帮助。

于 2012-07-13T11:50:26.610 回答
1

但在 20-25 分钟后,与其他应用程序服务的许多交互被终止。

最有可能是由于内存使用过多,然后自动内存管理器杀死了您的进程或长时间运行的操作,就像@AljoshaBre 一样

我该如何预防?

所以我的第一个想法是检查你Service是否以某种生命周期方法运行,例如onResume(),如果没有,你应该重新启动Service并再次执行它。

于 2012-07-13T11:05:18.380 回答
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);
}
于 2012-07-13T11:34:32.347 回答