服务定时器调用另一个服务

时间:2016-01-09 10:28:30

标签: android android-activity android-service android-lifecycle android-timer

我使用Service管理从服务器到客户端客户端到服务器的数据。我在登录后呼叫一个Service

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

我在Service

上面调用了一个计时器

CheckAutoSyncReceivingOrder服务:

  

它在Every 1上调用另一个名为ReceivingOrderService的服务   分钟从服务器获取更新数据。

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服务:

  

它在每2.5上调用另一个名为SendingOrderService的服务   分钟将更新的数据发送到服务器。

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

两个Activity都会运行直到Internet关闭。当Internet连接可用时,它将自动再次呼叫。

主要是我遇到问题自动销毁活动服务电话

是否有任何解决方案或方法可以改变相同的流程?

提前感谢你。

2 个答案:

答案 0 :(得分:2)

来自documentation

  

当服务启动时,它的生命周期独立于启动它的组件,并且该服务可以无限期地在后台运行,即使启动它的组件被销毁也是如此。因此,当通过调用stopSelf()完成其工作时,服务应该自行停止,或者另一个组件可以通过调用stopService()来停止它。

由于您&#34;除了Activity中的onCreate()&#34; 之外没有覆盖任何其他方法,您可能会遇到以下情况:

    除非另一个应用组件调用Service,否则无法调用
  1. onDestroy() stopService() {/ 1}}
  2. 表示Timer中的结果会继续执行其工作。
  3. 根据文档停止服务。

    修改(关于您的评论):

    &#34;当我销毁活动时它开始新工作&#34; 意味着系统终止了服务,因为你没有覆盖onStartCommand()的默认返回值是START_STICKY,服务已重新创建,并且已调用其onStart()方法。

    无法更改此类系统行为。但您可以在foreground中运行该服务。

答案 1 :(得分:2)

您必须使用IntentService代替Service

  • Service在后​​台运行,但它在应用程序的主线程上运行。
  • IntentService在单独的工作线程上运行。

如果运行您服务的进程被终止,Android系统将自动重启它,这是默认行为。

因此,如果活动的主要线程被销毁,则服务将重新启动,但如果您使用IntentService并使用START_NOT_STICKY则不会重新启动您的服务。

此行为由Service实现中onStartCommand()的返回值定义。常量START_NOT_STICKY告诉Android,如果该进程在#34; kill&#34;中运行,则不会重新启动该服务。

您需要在服务类中覆盖方法onStartCommand(),并将所有代码从onStart()方法移至onStartCommand()方法。

根据Android文档:

  

对于已启动的服务,还有两种主要模式   根据他们的价值,他们可以决定参加比赛   从onStartCommand()返回:START_STICKY用于提供服务   根据需要明确启动和停止,START_NOT_STICKY   或START_REDELIVER_INTENT仅用于服务   在处理发送给他们的任何命令时保持运行

每次重新启动服务时都会调用{p> onStart()方法,但如果您返回onStartCommand(),则不会调用START_NON_STICKY方法。

有关IntentServiceService之间差异的详细信息。你可以查看this

我希望这会对你有所帮助。