我是 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/