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

Sco*_*ler 1 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;
} 
Run Code Online (Sandbox Code Playgroud)

如果是,那么我使用以下内容在那里开始一个额外的活动:

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);
}
Run Code Online (Sandbox Code Playgroud)

setFlags表示如果用户按下home,然后他们返回第一个应用程序,它会打开,它不会打开这里调用的第二个应用程序.

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

Sco*_*ler 8

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

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

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

在onCreate我使用:

handleIntent(getIntent());
Run Code Online (Sandbox Code Playgroud)

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

public void onNewIntent(Intent intent)
{
    setIntent(intent);
    handleIntent(intent);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Intent i = new Intent("com.me.myapp.MY_MAP");
i.putExtra("place", place);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)

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