У меня есть два приложения Xamarin для Android - назовем их «Archy» и «Mehitabel».
У Archy есть некоторая постоянная информация о состоянии (которая, скажем, ради аргумента, находится в БД SQLite).).
Если с Мехитабелом что-то случится, ей нужно знать часть этой информации о состоянии.
Чтобы совершить этот подвиг, я приказал Мехитабелю отправить Арчи намерение.У Арчи есть широковещательный приемник, который его слышит, собирает необходимое состояние и отправляет другое намерение Мехитабелю.
Вот код от Арчи:
[BroadcastReceiver(Enabled = true)]
[IntentFilter(new [] { "com.example.Archy.SendStateToMehitabel"})]
public class StateQueryReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
var msg = new Intent("com.example.Mehitabel.StateFromArchy");
msg.PutExtra("ImportantStateInfo", GetSomeState());
context.SendBroadcast(msg);
}
}
А вот код от Мехитабеля:
private async Task AskArchyForState()
{
var filter = new IntentFilter("com.example.Mehitabel.StateFromArchy");
var csrc = new TaskCompletionSource<bool>();
var rcvr = new ActionBroadcastReceiver((context, intent) =>
{
State = intent.GetStringExtra("ImportantStateInfo");
csrc.TrySetResult(State != null);
});
RegisterReceiver(rcvr, filter);
var msg = new Intent("com.example.Archy.SendStateToMehitabel");
SendBroadcast(msg);
var task = await Task.WhenAny(csrc.Task, Task.Delay(Timeout));
UnregisterReceiver(rcvr);
if (task != csrc.Task)
bomb("Archy has not answered state query after {0}ms", Timeout);
if (!csrc.Task.IsCompletedSuccessfully || csrc.Task.Result == false)
bomb("failed to get all necessary state from Archy");
}
Это все прекрасно работает, при условии, что Archy действительно работает (то есть показано в «недавнем» списке).Если Archy не работает, код получателя Archy никогда не выполняется, и Mehitabel останавливается.
Я надеюсь, что я упускаю что-то простое (например, флаг в одном из атрибутов получателя или какой-то секретный соус вcom.example.Archy.SendStateToMehitabel (намерение).
Можете ли вы сказать мне, что мне здесь не хватает?
Нужно ли использовать совершенно другой подход (например, наличие Mehitabel StartActivityForResult ()действие в Archy или использование службы, которая запускается при загрузке и работает постоянно)?