Xamarin Android: получить информацию о состоянии одного приложения от другого - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть два приложения 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 или использование службы, которая запускается при загрузке и работает постоянно)?

1 Ответ

0 голосов
/ 19 декабря 2018

Основываясь на моих исследованиях, я думаю, что вы можете открыть Archy, прежде чем вам понадобятся данные в Mehitabel.Это демо об открытии приложения в коде.

 Intent launchIntent = PackageManager.GetLaunchIntentForPackage("NewTestApp.NewTestApp");
            if (launchIntent != null)
            {
                StartActivity(launchIntent);

            }

Примечание: NewTestApp.NewTestApp - это имя пакета Archy.

...