再次运行服务,但一旦当前执行完成

时间:2018-04-21 07:48:56

标签: java android multithreading concurrency

我会尽量保持简短。我有foreground service A broadcast receiver。有时它会两次调用Service B

我希望service B首先完成执行,如果再次运行另一个请求,它应该等待直到执行完毕。这就是为什么我创建服务B为IntentService。但由于呼叫记录仍未更新,我正在服务B睡2秒钟。

但是当我在IntentService中实现runnable时,它保留了原来的行为,如果有另一个请求,两个请求都会同时运行Service B.

我的服务广播接收器:

Log.d("RECEIVER X: ", "CALL ENDS HERE...");
Intent SendSMS = new Intent(context, SendSMS.class);
startService(SendSMS);

我的IntentService:

    public class SendSMS extends IntentService
    {
    public Boolean IsRunning = false;

    public SendSMS()
    {
    super("SendSMS");
    Log.d("SendSMS : ", "\nOnCreate...");
    }

    @Override
    protected void onHandleIntent(Intent intent)
    {

        new Thread(new Runnable()
        {
            public void run()
            {

                if(IsRunning == false)
                {
                    IsRunning = true;
                    Thread.sleep(2000);
                    // perform operations here...
                }
            }
        }).start();
    }
    }

我的操作应该执行两次,但是在第一次完成睡眠2秒后。任何帮助将不胜感激。高级感谢你

1 个答案:

答案 0 :(得分:1)

我的应用程序的目标是来自api 17的api level 26.但是在Oreo及其上面,它不允许实现静态接收器。 (很少有像BOOT_COMPLETED这样的意图行为仍被接受。但我想实现PHONE_STATE。根据文档,我已经在前台服务中实现了它。如下所示:

前台服务中的运行时接收器:

private BroadcastReceiver mCallBroadcastReceiver = new BroadcastReceiver()
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        String action = intent.getAction();

        if (action.equalsIgnoreCase("android.intent.action.PHONE_STATE"))
        {
            if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING))
            {
                Log.d("RECEIVER X: ", "INCOMING CALL...");
            }
            if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE))
            {
                Log.d("RECEIVER X: ", "CALL ENDS HERE...");
                Intent Dispatcher = new Intent(context, CatchNumbers.class);
                startService(Dispatcher);
            }
            if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK))
            {
                Log.d("RECEIVER X: ", "ACTIVE CALL GOING ON...");
            }
        }
    }
};

在这里你可以看到,我正在呼叫我的CatchNumbers。是的,我只是打电话,但只有在Android 5.0和5.1谷歌BUG,它触发ALL_STATES两次两次。 Hence was the above question Posted here如何禁止运行相同服务的两个并发线程.. !!

CatchNumbers内:

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    new Thread(new Runnable()
    {
        public void run()
        {
            try
            {
                Thread.sleep(2000);
                Log.d("CatchNumbers : ", "\nDispatched Call ...");

                Intent SendSMS = new Intent(CatchNumbers.this, SendSMS.class);
                startService(SendSMS);
            }
            catch (InterruptedException e)
            {
                Log.d("CatchNumbers : ", "Thread : InterruptedException Error in service...\n");
                Log.e("CatchNumbers : ", "Exception is : ", e);
            }
        }
    }).start();

    return super.onStartCommand(intent, flags, startId);
}

在对同一个SendSMS服务进行并发调用之前,这里可以在2秒内运行睡眠,然后只调度它来运行IntentService工作线程......

  

现在因为Intent Service不允许运行多个实例......其他请求仍在等待,直到第一次SendSMS执行完成。现在,亲爱的XY LOVER ..,因为android 5.0和5.1触发两次相同的事件,所以调用任何服务都会有问题..这导致数据丢失......所以决定从CALL_LOG中取而代之。一旦呼叫状态变为IDLE。同样对该意图服务的并发调用问题也解决了这个问题。我也尝试在Intent服务中实现runnable,但由于它,Intent服务失去了保持下一个请求等待当前执行结束的属性。并且这两个请求都在运行IntentService并发导致数据丢失

现在,我的意图服务没有Runnable方法。