Как я могу запустить OnNewIntent - PullRequest
0 голосов
/ 26 мая 2020

Я не могу запустить OnNewIntent. Я прочитал десятки статей по этой проблеме и перепробовал все комбинации кода.

Независимо от того, использую ли я LaunchMode.SingleTask или SingleTop, он не срабатывает и всегда проходит через метод OnCreate.

Что я здесь делаю не так? Я что-то упускаю? Что мне нужно добавить, чтобы он заработал?

using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.OS;
using Android.Runtime;
using System;
using System.Threading.Tasks;
using Xamarin.Forms;
using static MyApp.ClipboardMgr;


namespace MyApp.Droid
{
    //[Activity(Label = "SplashActivity")]
    [Activity(LaunchMode = LaunchMode.SingleTask, Theme = "@style/Theme.Splash", 
                MainLauncher = true, NoHistory = true)]

    //Can't get this to work with LaunchMode.SingleTop or SingleTask. Always creates a new instance.
    [IntentFilter(new[] { Intent.ActionProcessText },
                Categories = new[] { Intent.CategoryDefault },
                DataMimeType = @"text/plain", Icon = "@drawable/icon", Label = "MyApp")]

    public class SplashActivity : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            try
            {
                //taking these out for readability
                //AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
                //TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
                //AndroidEnvironment.UnhandledExceptionRaiser += AndroidEnvironment_UnhandledExceptionRaiser;

                base.OnCreate(savedInstanceState);

                // Create your application 
                StartActivity(typeof(MainActivity));

                //don't want to do this here, better to do it in event
                if (Intent.Action == Intent.ActionProcessText)
                {
                    //always comes here
                    HandleProcessTextIntent();

                }
            }
            catch(Exception e)
            {
                App.LogException(e);
                throw;
            }
        }

        /// <summary>
        /// this is not firing!
        /// </summary>
        /// <param name="intent"></param>
        protected override void OnNewIntent(Intent intent)
        {
            base.OnNewIntent(intent);

            HandleProcessTextIntent();

        }

        void HandleProcessTextIntent()
        {
            string input = Intent.GetStringExtra(Intent.ExtraProcessText).Trim();

            if (input == string.Empty)
                return;

            ClipMgr.SetText(input);
        }

    }
}

1 Ответ

0 голосов
/ 01 июня 2020

Вы ничего не пропустили, поскольку, когда я тестирую с собственным намерением начать вашу деятельность, она работает хорошо, и OnNewIntent () вызывается при использовании SingleTask или SingleTop. Вот как я вызываю действие из другого проекта (я сделал это в собственном Android):

ComponentName component = new ComponentName("com.example.textHandlerDemo", "com.example.textHandlerDemo.TextHandlerActivity");
Intent intent = new Intent();
intent.setAction(Intent.ACTION_PROCESS_TEXT);
intent.setComponent(component);
startActivity(intent);

Я провел небольшое исследование и нашел кое-что, что может объяснить, почему OnNewIntent () никогда не запускается:

Согласно руководству ACTION_PROCESS_TEXT , в нем упоминается:

Вы можете использовать это как подсказку, чтобы предложить возможность вернуть измененный текст в приложение-отправитель, заменив выбранный текст. Это работает, поскольку ваше действие фактически было запущено с помощью startActivityForResult ()

Итак, когда вы щелкнете ярлык вашего приложения на панели инструментов выделения плавающего текста, Android запустит ваше действие, зарегистрированное с помощью ActionProcessText с startActivityForResult () , а при использовании startActivityForResult () ваше действие будет запущено как вспомогательное действие текущего действия (подразумевается из Android do c startActivityForResult ), то есть скажем, вместо перенаправления в ваше приложение, которое уже запущено, Android поместит вашу активность в стек текущего приложения.

Таким образом, ваша целевая активность по-прежнему будет вызываться из OnCreate (), поскольку она изолирована от вашего запущенное приложение.

Более того, панель инструментов для выделения плавающего текста используется для обеспечения быстрого взаимодействия с приложением для текстовых операций, таких как перевод, как указано в этом блоге , я не нашел никаких переключателей чтобы включить / отключить перенаправление в приложение, вам может потребоваться обработать намерение как в OnC reate () и OnNewIntent (), если вы используете LaunchMode.SingleTask или SingleTop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...