首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android Home活动启动子活动

Android Home活动启动子活动
EN

Stack Overflow用户
提问于 2011-06-21 23:39:56
回答 3查看 5.8K关注 0票数 2

我对Android编程比较陌生。我在工作中接到了一个任务,需要创建一个自定义Home活动启动器。我做了一些研究,在安卓开发者网站(home sample)上找到了这个例子。这是我的原型的开始。

自定义Home活动将需要用户进行身份验证(输入一些简单的凭据)。我的想法是从Home活动中启动一个子活动,并在intent to Home活动中传回结果。我需要能够捕获有关这些凭证的信息,并且该信息将被传递回Home活动。但是,我在尝试时遇到了问题。我在LogCat中得到一个日志,上面写着:"Activity是作为新任务启动的,所以取消activity result。“

我知道startActivityForResult方法,但它似乎对我不起作用。以下是我从my Home activity启动该活动的位置:

代码语言:javascript
复制
@Override
protected void onResume() {
    super.onResume();
    bindRecents();

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

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

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

代码语言:javascript
复制
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();
    }
}

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

代码语言:javascript
复制
    <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似乎想要将活动作为一个新任务启动,并且想要忽略返回的意图(这是我需要的)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-22 00:02:11

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

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

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

巴里

票数 10
EN

Stack Overflow用户

发布于 2015-08-18 21:03:43

文档上写着

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

这是错误的

您可以很好地使用singleTask,但不能使用singleInstance.

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

问题是,当您在活动上调用startActivityForResult()时,调用者活动和要启动的活动必须在同一任务上,startActivityForResult()才能正常工作,这意味着您无法使用Intent.FLAG_ACTIVITY_NEW_TASK.对活动进行调用startActivityForResult()

为什么singleInstance不工作?

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

为什么singleTask可以正常工作?

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

我引用了this answer的话来解释两种启动模式之间的区别。

票数 1
EN

Stack Overflow用户

发布于 2011-06-22 00:01:39

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6428070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档