0

我开发了一个应用程序,其中包含一个带有文章列表的主屏幕。如果单击它,您将在另一个屏幕中访问详细信息。

我实现了 ActionBarSherlock,所以我为此活动使用了“向上”按钮模式。

然后我向这个应用程序添加了一个小部件。当您单击小部件时,您可以直接访问详细活动。

“向上”按钮已按照 Google 的建议 ( http://developer.android.com/training/implementing-navigation/ancestral.html ) 实施。

我的问题是,在 API 级别 15 及以下,它运行良好。它调用以下代码:

@Override
public boolean shouldUpRecreateTask(Activity activity, Intent targetIntent) {
    String action = activity.getIntent().getAction();
    return action != null && !action.equals(Intent.ACTION_MAIN);
}

但是在 JellyBean 上,使用的代码是:

public boolean shouldUpRecreateTask(Intent targetIntent) {
    try {
        PackageManager pm = getPackageManager();
        ComponentName cn = targetIntent.getComponent();
        if (cn == null) {
            cn = targetIntent.resolveActivity(pm);
        }
        ActivityInfo info = pm.getActivityInfo(cn, 0);
        if (info.taskAffinity == null) {
            return false;
        }
        return !ActivityManagerNative.getDefault().targetTaskAffinityMatchesActivity(mToken, info.taskAffinity);
    } catch (RemoteException e) {
        return false;
    } catch (NameNotFoundException e) {
        return false;
    }
}

如果必须重新创建堆栈,该方法的第一部分会检索有关应加载的活动的信息。

但我仍然不明白这条线是什么:

!ActivityManagerNative.getDefault().targetTaskAffinityMatchesActivity(mToken, info.taskAffinity);

任何人都可以在这条线上帮助我,我真的需要找出如何通过初始化一切来获得 true 吗?

4

1 回答 1

0

它是一个布尔方法,它必须返回一些东西。如果它需要返回一个真正的布尔变量才能工作,你必须这样做!

来自官方文档:

Returns true if the app should recreate the task when navigating 'up' 
from this activity by using targetIntent.

If this method returns false the app can trivially call navigateUpTo(Intent)
using the same parameters to correctly perform up navigation. 
If this method returns false, the app should synthesize a new task stack by using 
TaskStackBuilder or another similar mechanism to perform up navigation.

亲和性指示活动更喜欢属于哪个任务。默认情况下,来自同一个应用程序的所有活动都彼此具有亲和性。因此,默认情况下,同一个应用程序中的所有活动都喜欢在同一个任务中。但是,您可以修改活动的默认亲和性。不同应用程序中定义的活动可以共享一个亲缘关系,或者同一应用程序中定义的活动可以分配不同的任务亲缘关系。

于 2012-12-06T11:31:27.540 回答