Android Home活动启动子活动

时间:2011-06-21 15:39:56

标签: android android-activity android-launcher android-homebutton subactivity

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

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

我知道startActivityForResult方法,但这对我来说似乎没有用。这是我从我的家庭活动中启动活动的地方:

@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>

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

3 个答案:

答案 0 :(得分:10)

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

  

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

singleInstance就像singleTask,但更具限制性。尝试从清单中删除launchMode属性,以便Login活动将在同一任务中启动,然后在需要在单独任务中启动其他活动时使用FLAG_ACTIVITY_NEW_TASK。

百里

答案 1 :(得分:0)

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

答案 2 :(得分:0)

文档说

  

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

这是错误的

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

让我们回到问题所在。有什么问题?

问题是,当您在某项活动上调用startActivityForResult()时,您正在启动的来电者活动和活动必须执行相同的任务才能使startActivityForResult()正常工作,这意味着您不能使用 Intent.FLAG_ACTIVITY_NEW_TASK 将startActivityForResult()调用到活动。

为什么 singleInstance 无效?

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

为什么 singleTask 正在运作?

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

enter image description here

我引用this answer来解释两种发射模式之间的区别。