chromecustomtab xamarin android MainActivity утекла ServiceConnection CustomTabsServiceConnectionImpl @ 43a61ad, который был изначально привязан здесь - PullRequest
0 голосов
/ 22 ноября 2018

Я использовал chromecustomtab в своем проекте xamarin android, я могу связать сервис с помощью класса CustomTabActivityManger, но нет возможности отменить привязку сервиса в этом классе.

и, поскольку я не отменяю привязку, он всегда выбрасывает меняошибка утечки памяти.

Я использую Nuget - xamarin.Android.Support.CustomTabs версия 26.1.0.1

код, как показано ниже

namespace Android.Support.CustomTabs
{
  public class CustomTabsActivityManager
  {
    public CustomTabsActivityManager(Activity parentActivity);

    public CustomTabsSession Session { get; }
    public Activity ParentActivity { get; }
    public CustomTabsClient Client { get; }

    public event CustomTabsServiceDisconnectedDelegate CustomTabsServiceDisconnected;
    public event CustomTabsServiceConnectedDelegate CustomTabsServiceConnected;
    public event ExtraCallbackDelegate ExtraCallback;
    public event NavigationEventDelegate NavigationEvent;

    public static CustomTabsActivityManager From(Activity parentActivity, string servicePackageName = null);
    public bool BindService(string servicePackageName = null);
    public void LaunchUrl(string url, CustomTabsIntent customTabsIntent = null);
    public bool MayLaunchUrl(string url, Bundle extras, List<string> otherLikelyUrls);
    public bool Warmup(long flags = 0);

    public class ExtraCallbackEventArgs
    {
        public ExtraCallbackEventArgs();

        public string CallbackName { get; set; }
        public Bundle Args { get; set; }
    }

    public delegate void NavigationEventDelegate(int navigationEvent, Bundle extras);
    public delegate void ExtraCallbackDelegate(object sender, ExtraCallbackEventArgs e);
    public delegate void CustomTabsServiceConnectedDelegate(ComponentName name, CustomTabsClient client);
    public delegate void CustomTabsServiceDisconnectedDelegate(ComponentName name);
}

1 Ответ

0 голосов
/ 26 ноября 2018

Я могу связать сервис, используя класс CustomTabActivityManger, но нет возможности отменить привязку сервиса в этом классе

Анализировать:

Обычно мы можем напрямую использовать unbindService , чтобы отменить привязку Service.Но в исходном коде CustomTabActivityManger мы не нашли там метода UnBindService().И вы не можете получить экземпляр CustomTabsServiceConnection извне, так что трудно отсоединить службу в вашем Activity:

public class CustomTabsActivityManager
{
    ...
    CustomTabsServiceConnectionImpl connection;
    ...

    public bool BindService (string servicePackageName = null)
    {
        ...

        connection = new CustomTabsServiceConnectionImpl {
            CustomTabsServiceConnectedHandler = (name, client) => {
                Client = client;
                var evt = CustomTabsServiceConnected;
                if (evt != null)
                    evt (name, client);
            },
            OnServiceDisconnectedHandler = (name) => {
                var evt = CustomTabsServiceDisconnected;
                if (evt != null)
                    evt (name);
            }
        };

        return CustomTabsClient.BindCustomTabsService (ParentActivity, servicePackageName, connection);
    }
} 

class CustomTabsServiceConnectionImpl : CustomTabsServiceConnection
{
     ...
}

Решение :

Вы можете создать пользовательский CustomTabsActivityManager class и добавьте UnBindService() метод:

public class MyCustomTabsActivityManager
{
     CustomTabsServiceConnectionImpl connection;

     public Activity ParentActivity { get; private set; }
     public CustomTabsClient Client { get; private set; }

     CustomTabsSession session = null;

     ...

     public void UnBindService()
     {
         if (connection != null)
         {
             ParentActivity.UnbindService(connection);
             Client = null;
             session = null;
          }
     }
}

Затем вы можете использовать это UnBindService() в вашем Activity:

protected override void OnDestroy()
{
    myCustomTabsActivityManager.UnBindService();
    base.OnDestroy();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...