3

を使用して、サーバーからクライアントクライアントからサーバーへのデータを管理していますServiceServiceその中で、ログイン後に呼び出しています:

context.startService(new Intent(LoginActivity.this, CheckAutoSyncReceivingOrder.class));
context.startService(new Intent(LoginActivity.this, CheckAutoSyncSendingOrder.class));

上記の両方で1つのタイマーを呼び出しましたService

CheckAutoSyncRecomingOrder サービス:

ReceivingOrderServiceサーバーから更新されたデータを取得するために、1分ごとに onという名前の別のサービスを呼び出します。

public class CheckAutoSyncReceivingOrder extends Service {

    Timer timer;

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        Log.i(TAG, "CheckAutoSyncReceivingOrder Binding Service...");
        return null;
    }

    @Override
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub

        if (timer != null) {
            timer.cancel();
            Log.i(TAG, "RECEIVING OLD TIMER CANCELLED>>>");
        }

        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                Log.i(TAG, "<<<<<<<<< RECEIVING AUTO SYNC SERVICE <<<<<<<<");
                if (InternetConnection.checkConnection(getApplicationContext())) {
                    if (getDatabasePath(DatabaseHelper.DATABASE_NAME).exists())
                        startService(new Intent(
                                CheckAutoSyncReceivingOrder.this,
                                ReceivingOrderService.class));
                } else {
                    Log.d(TAG, "Connection not available");
                }
            }
        }, 0, 60000); // 1000*60 = 60000 = 1 minutes
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub

        if (timer != null)
            timer.cancel();

        Log.d(TAG, "Stopping Receiving...");

        super.onDestroy();
    }
}

CheckAutoSyncSendingOrder サービス:

SendingOrderService2.5 分ごとにという名前の別のサービスを呼び出して、更新されたデータをサーバーに送信します。

public class CheckAutoSyncSendingOrder extends Service {

    Timer timer;

    @Override
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub

        if (timer != null) {
            timer.cancel();
            Log.i(TAG, "OLD TIMER CANCELLED>>>");
        }

        timer = new Timer();

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                Log.i(TAG, ">>>>>>>> SENDING AUTO SYNC SERVICE >>>>>>>>");
                if (InternetConnection.checkConnection(getApplicationContext())) {
                    if (getDatabasePath(DatabaseHelper.DATABASE_NAME).exists())
                        startService(new Intent(CheckAutoSyncSendingOrder.this,
                                SendingOrderService.class));
                } else {
                    Log.d(TAG, "connection not available");
                }
            }
        }, 0, 150000); // 1000*60 = 60000 = 1 minutes * 2.5 = 2.5 =>Minutes
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub

        if (timer != null)
            timer.cancel();

        Log.d(TAG, "Stopping Sending...");

        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

両方のアクティビティは、インターネットがオフになるまで実行されます。インターネット接続が利用可能になると、自動的に再度呼び出します。

主なことは、アクティビティサービスの呼び出しを自動的に破棄しているときに問題が発生することです。

同じことの流れを変更する解決策または方法はありますか?

よろしくお願いします。

4

2 に答える 2

2

ドキュメントから:

サービスが開始されると、それを開始したコンポーネントから独立したライフサイクルがあり、サービスを開始したコンポーネントが破棄された場合でも、サービスはバックグラウンドで無期限に実行できます。そのため、ジョブが終了したら stopSelf() を呼び出してサービスを停止するか、別のコンポーネントが stopService() を呼び出してサービスを停止できます。

問題の「onCreate()以外の他のメソッドをオーバーライドしていない」ためActivity、次のことが発生する可能性があります。

  1. Serviceは、別のonDestroy()アプリ コンポーネントが呼び出されない限り呼び出されませんstopService()
  2. つまり、Timerその仕事を実行し続けることになります。

ドキュメントに従ってサービスを停止します。

編集(コメントに関して):

「アクティビティを破棄したときに新しいジョブを開始する」onStartCommand()とは、システムがサービスを強制終了したことを意味します。デフォルトの戻り値がオーバーライドされていないためSTART_STICKY、サービスが再作成され、そのonStart()メソッドが呼び出されました。

このようなシステムの動作は変更できません。ただし、フォアグラウンドでサービスを実行できます。

于 2016-01-09T16:47:47.847 に答える