2

我对 Android 编程比较陌生。我在工作中被分配了一项任务,我需要创建一个自定义主页活动启动器。我做了一些研究,并在 Android 开发者网站(主页示例)上找到了该示例。这是我原型的开始。

自定义 Home 活动将需要用户进行身份验证(输入一些简单的凭据)。我的想法是从 Home 活动启动一个子活动,并将意图中的结果传递回 Home 活动。我需要能够捕获有关这些凭据的信息,并且该信息将被传递回 Home 活动。但是,我在尝试这个时遇到了问题。我在 LogCat 中收到一条日志,内容如下:“活动正在作为新任务启动,因此取消活动结果。”

我知道 startActivityForResult 方法,但这似乎对我不起作用。这是我从 Home 活动启动活动的地方:

@Override
protected void onResume() {
    super.onResume();
    bindRecents();

    Intent iii = new Intent(this, Login.class);
    startActivityForResult(iii, STATIC_LOGIN_INTEGER_VALUE);
}

当该代码执行时,我从 ActivityManager 标记中获取上述日志。

我的登录活动有一个按钮,用户输入凭据后将点击该按钮。如果凭据很好,那么我尝试执行以下操作(我输入了几个日志,以便我可以尝试找出发生了什么):

public void onClick(View src) {
    // check for authentic credentials
    if(IsValid())
    {
        Intent loginAuth = new Intent("Login");
        loginAuth.putExtra("userRole", userRole);

        Log.d("LOGIN", "Setting result...");
        if (getParent() == null) {
            Log.d("LOGIN", "Parent was null");
            setResult(Activity.RESULT_OK, loginAuth);
        }
        else {
            Log.d("LOGIN", "setting result on parent...");
            getParent().setResult(Activity.RESULT_OK, loginAuth);
        }

        Log.d("LOGIN", "Finishing the activity");
        finish();
    }
}

我在清单文件中将这些活动定义如下:

    <activity android:name="Home"
            android:theme="@style/Theme"
            android:launchMode="singleInstance"
            android:stateNotNeeded="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.HOME"/>
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

    <activity android:name="Login"
              android:label="Login"
              android:launchMode="singleInstance">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.HOME" />
        </intent-filter>
    </activity>

我正在使用登录活动的意图过滤器。我最初将其设置为空。我也有 launchMode 空白(我相信默认为标准)。我已经使用了这些选项中的大多数,但似乎没有任何改变 ActivityManager 似乎想要将活动作为新任务启动并想要忽略返回的意图(我需要)的事实。

4

3 回答 3

10

问题是您使用launchMode="singleInstance" 声明了您的活动,因此Android 在启动登录活动时会创建一个新任务(即一个新进程)。不同任务中的活动不能互相返回结果。从 Activity.startActivityForResult() 文档:

例如,如果您正在启动的活动使用 singleTask 启动模式,它将不会在您的任务中运行,因此您将立即收到取消结果。

singleInstance 类似于 singleTask 但更具限制性。尝试从清单中删除 launchMode 属性,以便登录活动将在同一个任务中启动,然后在您需要在单独的任务中启动不同的活动时使用 FLAG_ACTIVITY_NEW_TASK。

巴里

于 2011-06-21T16:02:11.357 回答
1

文件说

例如,如果您正在启动的活动使用 singleTask 启动模式,它将不会在您的任务中运行,因此您将立即收到取消结果。

这是错误的。

你可以使用singleTask就好了,你不能使用的是singleInstance

让我们回到问题上来。问题是什么?

问题是当你调用startActivityForResult()一个活动时,调用者活动和你正在启动的活动必须在同一个任务上startActivityForResult()才能正常工作,这意味着你不能调用 startActivityForResult() 到使用Intent.FLAG_ACTIVITY_NEW_TASK的活动.

为什么单实例不工作?

因为“singleInstance”活动作为其任务中的唯一活动独立存在。如果它启动另一个活动,则无论其启动模式如何,该活动都将启动到不同的任务中——就好像 FLAG_ACTIVITY_NEW_TASK 在意图中一样。在所有其他方面,“singleInstance”模式与“singleTask”相同。

为什么singleTask工作?

因为 singleTask 不需要为正在启动的新活动创建新任务。

在此处输入图像描述

我引用这个答案来解释两种启动模式之间的区别。

于 2015-08-18T13:03:42.933 回答
0

您是否setResult(int resultCode, Intent data)在登录活动中声明了。Android 文档说“请注意,此方法只能与定义为返回结果的 Intent 协议一起使用。” 如果不匹配或与文档中的某些其他条件匹配Activity.startActivityForResult(),它将不会在您的任务中运行,因此您将立即收到取消结果。”

于 2011-06-21T16:01:39.253 回答