活动生命周期 - 带附加功能的startActivity()

时间:2010-10-21 20:26:43

标签: android android-intent

我目前有两个独立的应用程序,它们都执行单独的任务,但是当我需要一个应用程序来使用另一个应用程序时,它会在有限的场合下载。

所以我使用一个函数检查所需的应用程序是否存在:

public static boolean isIntentAvailable(Context context, String action) 
{
    final PackageManager packageManager = context.getPackageManager();
    final Intent intent = new Intent(action);
    List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    return list.size() > 0;
} 

如果确实如此,那么我使用以下内容在那里开始额外的活动:

if (isIntentAvailable(ListPOI.this, "com.me.myapp.MY_MAP"))
{
    Intent i = new Intent("com.me.myapp.MY_MAP");
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.putExtra("place", true);
    startActivity(i);
}

setFlags意味着如果用户按下主页,然后他们返回第一个应用程序,它会打开,它不会打开这里调用的第二个应用程序。

这一切都很好,第一次。然而,在第二次调用它之后,第二个应用程序恢复,所以它没有获取已经通过的'额外',我怎样才能确保我得到额外的?

2 个答案:

答案 0 :(得分:8)

我的问题的最终答案是使用以下内容:

我创建了一个处理加载意图附加功能的函数:

private void handleIntent(Intent intent)
{
    Bundle extras = intent.getExtras();
    if (extras != null)
    {
        place = extras.getString("place");
    }
}

在onCreate中我使用:

handleIntent(getIntent());

然后添加以下函数以在现有活动实例传递新意图时获取意图:

public void onNewIntent(Intent intent)
{
    setIntent(intent);
    handleIntent(intent);
}

我还使用上述代码将android:launchMode="singleInstance"添加到活动清单中的活动声明中。

最后从第一个包中,我现在可以使用以下代码来启动第二个包。当第二个软件包启动时,用户可以点击第一个软件包(从主启动器)并获得他们期望的应用程序,如果他们单击以启动第二个软件包,则会显示“已在运行”的实例,但会捕获新的软件包额外的已通过:

Intent i = new Intent("com.me.myapp.MY_MAP");
i.putExtra("place", place);
startActivity(i);

希望这会对某人有所帮助 - 这可能不是最好的方法,但它对我有用。

答案 1 :(得分:1)

这不是flag_activity_new_task的意思。这些标志仅对您的流程中启动的活动有意义。启动另一个应用程序的活动将始终在新进程中以新堆栈的形式将其作为新任务启动。

显然我错了。 Activities defined in different applications can share an affinity。我不知道。我还不清楚你到底想要发生什么。

你的意思是“第二次打电话”。什么的第二次?它恢复了什么?你有什么期待?