Android Home Activity 启动子 Activity

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

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

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

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

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

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

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

我的登录 Activity 有一个按钮,用户在输入凭据后将点击该按钮。如果凭据良好,那么我会尝试执行以下操作(我输入了多个日志以便我可以尝试弄清楚发生了什么):

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();
    }
}

我在 list 文件中将这些 Activity 定义如下:

    <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 Activity 中使用 intent 过滤器。我最初将其设置为空。我也有 launchMode 空白(我相信默认为标准)。我尝试了其中的大部分选项,但似乎没有什么能改变这样一个事实,即 ActivityManager 似乎想要将 Activity 作为新任务启动并想要忽略返回的 Intent (我需要)。

最佳答案

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

For example, if the activity you are launching uses the singleTask launch mode, it will not run in your task and thus you will immediately receive a cancel result.

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

巴里

关于Android Home Activity 启动子 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6428070/

相关文章:

java - 未触发dispatchPopulateAccessibilityEvent

android - 在主屏幕上显示完整的应用程序名称

java - 获取具有 2 个或更多 Activity 的应用程序

java - 使用普通应用程序作为 Android 启动器

java - 我如何从 json 获取数据到微调器?

Android outputStream.write 发送多条消息

android - Proguard 不会混淆 gui 组件

java - 如何从 Activity 中调用 fragment 方法?

java.net.协议(protocol)异常 : method does not support a request body: GET

带有音频 Sprite 的 Android HTML5 音频元素