我会尽量保持简短。我有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秒后。任何帮助将不胜感激。高级感谢你
答案 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方法。