为什么我的 AccountAuthenticatorActivity 在被另一个应用程序触发时没有启动?

Why is my AccountAuthenticatorActivity not launching when triggered by another app?

我有一套应用程序,我的 AccountManager 文件位于一个中央应用程序中。我可以在那个中央应用程序中使用 AccountManager.AddAccount(),但是当我尝试从其他应用程序使用该方法时,AuthenticatorActivity 没有启动。我可以调试并看到来自 AddAccount 的所有代码都在执行,但是 activity 从未启动。

这是我的 AddAccount 方法:

public override Bundle AddAccount(AccountAuthenticatorResponse response, string accountType, string authTokenType, string[] requiredFeatures, Bundle options)
{
    var intent = new Intent(_context, typeof(MyAccountAuthenticatorActivity));
    intent.PutExtra(MyAccountAuthenticatorActivity.ARG_ACCOUNT_TYPE, accountType);
    intent.PutExtra(MyAccountAuthenticatorActivity.ARG_AUTH_TYPE, authTokenType);
    intent.PutExtra(MyAccountAuthenticatorActivity.ARG_IS_ADDING_NEW_ACCOUNT, true);
    intent.PutExtra(AccountManager.KeyAccountAuthenticatorResponse, response);

    var bundle = new Bundle();
    bundle.PutParcelable(AccountManager.KeyIntent, intent);
    return bundle;
}

我在所有应用程序中使用相同的启动画面,因此调用 AddAccount 的代码是相同的。

        _accountManager = AccountManager.Get(this);
        var accounts = _accountManager.GetAccountsByType(AccountKeys.ACCOUNT_TYPE);

        //automatically add new account if no users on device yet
        if (accounts.Length == 0)
        {
            _accountManager.AddAccount(AccountKeys.ACCOUNT_TYPE, AccountKeys.AUTH_TYPE, null, null, this, null, null);
            CheckIfFirstRun();
            Finish();
        }

MyAccountAuthenticatorActivity 位于一个应用中。如您所见,我将正确的 activity 上下文发送到 AddAccount,但仅当在拥有验证器文件的应用程序中执行这些代码时才调用 StartActivity()。

为了让我的其他应用打开 MyAccountAuthenticatorActivity,我还缺少什么?当我调用 AddAccount 时,它可能与将回调设置为 null 有关吗?我无法弄清楚如何以另一种方式执行此操作,因为我不完全理解如何使用回调,因为 java 示例中的 none 有这个。

我也试过将 MyAccountAuthenticatorActivity 添加到我的其他应用程序的清单中,如下所示:

<activity android:name="com.redacted.authenticator.MyAccountAuthenticatorActivity" />

但这并没有改变任何东西。我知道其他应用程序正在查看 AuthenticatorService,它们只是不会启动 activity.

所以我无法弄清楚为什么 AddAccount() 不会启动 activity 本身,但我找到了解决方法。我能够自己处理意图。

这是我开始添加新帐户(从任何应用)的代码片段:

            var adapter = new AccountPickerArrayAdapter(this, accounts);
            var builder = new AlertDialog.Builder(new ContextThemeWrapper(this, Resource.Style.AppTheme));
            builder.SetTitle(Resource.String.choose_account);
            builder.SetAdapter(adapter,
                (s, a) =>
                {
                    var dialog = (AlertDialog)s;
                    dialog.Dismiss();
                    GetExistingAuthToken(accounts[a.Which]);
                    FinishLogin(accounts[a.Which]);
                });
            builder.SetNeutralButton(Resource.String.add_new_account,
                (s, e) =>
                {
                    var dialog = (AlertDialog)s;
                    dialog.Dismiss();
                    var thread = new Thread(AddNewAccount);
                    thread.Start();
                    CheckIfFirstRun();
                    Finish();
                });
            builder.Create().Show();
        }

        void AddNewAccount()
        {
            var future = _accountManager.AddAccount(AccountKeys.ACCOUNT_TYPE, AccountKeys.AUTH_TYPE, null, null, null, null, null);
            var bundle = future.Result as Bundle;
            if (bundle != null)
            {
                var intent = bundle.GetParcelable(AccountManager.KeyIntent) as Intent;
                StartActivity(intent);
            }
        }

通过在 AddAccount() 中发送 null 作为 Activity,所需的意图将在一个包中返回。然后我可以直接启动该 Intent。

我还需要将 (Exported = true) 添加到我的 AccountAuthenticatorActivity 的清单条目中。这允许其他应用程序启动 activity.