0

システムに問題があります。私は常に位置をチェックし、ユーザーが開始してからの距離と時間をカウントするサービスを実行しています。しかし、20 ~ 25 分後、他のアプリケーション サービスとの多くの対話が強制終了されます。

どうすれば防ぐことができますか?

私は私の命を維持する 2 番目のサービスを追加することを考えています。

4

3 に答える 3

2

これがうまくいくかどうかはわかりませんが、これが私がそれを実装した方法です:

私の場合、X 分ごとにバックグラウンドで実行し続けるサービスが必要でした。サービスがシャットダウンされるたびに (メモリ使用量またはメイン アクティビティがバックグラウンドになり、Android がクリーンアップするため)、次のときに再度トリガーされます。時間間隔に達します。次のコンポーネントとワークフローがありました。

  1. アクティビティ A. 主なアクティビティ、アプリケーションの開始点。
  2. サービス S. バックグラウンドで実行し、必要なことは何でも実行し、
    完了後にシャットダウンし、X 分ごとに再起動したいサービス。

アクティビティの 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);

私のアクティビティでは、「 periodicIntentSender」(上記で定義)を引数として取り、ユーザー設定(connection_Interval)に基づいてインテントを送信するAlarmManagerを実装しています。

// 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>
    }
}

お役に立てれば。

于 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 に答える