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 に答える