android 两个启动入口 打开了 两个应用程序的实例的解决方法

android 两个启动入口 打开了 两个应用程序的实例的解决办法。

首先,你可以尝试在给intent设置一些属性。

intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

如果这样还不行,可以继续往下读。


在我的应用中,会有一个按钮,用户可以通过点击按钮来启动网易新闻。因为不知道网易新闻的具体的主Activity名,首先想到的就是使用通过使用包名来启动网易新闻。得到网易新闻包名的方式很简单,使用android的ddms工具就可以查看到。包名是:"com.netease.newsreader.activity"。

第一次写的按钮的点击事件为:

Intent startapp = mContext.getPackageManager().getLaunchIntentForPackage("com.netease.newsreader.activity");
startapp.addCategory(Intent.ACTION_MAIN);
startapp.addCategory(Intent.CATEGORY_LAUNCHER);
startapp.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
mContext.startActivity(startapp);

以为这样就轻松搞定了。后来测试发现,点击我这个按钮进入的网易新闻和点击网易新闻自带的快捷方式进入的网易新闻不是同一个。很纳闷,一直都找不到原因,后来都开始怀疑是网易新闻自身的原因了。最后,一次偶然的尝试,让我找到了该问题的解决方案。

Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
intent.setComponent(ComponentName.unflattenFromString("com.netease.newsreader.activity/.MainIndexActivity"));
mContext.startActivity(intent);

相信大家也发现不一样的地方了。对了,就是不通过包名来启动,而是通过网易新闻的主activity来启动,就可以解决这个问题。

至于如何知道应用的主Activity,方法有很多,可以通过log过滤ActivityManager来看,也可以通过反编译来看。

以上只是个人的一点小方法,如有更好的方法,请大家一定要告知,谢谢。