我并不熟悉意图标志,所以请耐心等待。
我正在做一个显示来自ViewPager中数据库的东西的应用程序。 我还有一个小部件,它不时拉出一个随机行并显示它。现在,当我点击它时,我将进入一个活动,其中显示相同的内容,现在我可以对其采取行动。
一切正常,但是当我有一个活动已经运行然后点击小部件时,它似乎会创建一个新实例,因为当我按下后退按钮时我没有退出应用程序但是被带到前一个实例或东西。
有没有办法启动活动的新实例,如果有一些先前的实例正在运行,请使用标记?
我玩了CLEAR_TOP和那些东西,但老实说我不知道我在做什么。
谢谢!
// EDIT
Intent.FLAG_ACTIVITY_CLEAR_TOP似乎没有做任何事情。 Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP似乎将前一个放到顶部而忽略了新的一个或者什么。也许让我改一下,我从启动器图标开始活动,然后我按下主页按钮并单击小部件,它应该调出一个新实例,其中ViewPager.setCurrentItem设置正确的页面(与小部件相同)。如果之前没有运行主要活动,一切都没问题,但如果它正在运行,请完成它。
MyWidgetProvider extends AppWidgetProvider
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Log.d("MainActivity", "MyWidgetProvider # onUpdate");
for (int i = 0; i < appWidgetIds.length; i++) {
int appWidgetId = appWidgetIds[i];
Intent intent = new Intent(context, MainActivity.class);
intent.putExtra("from_widget", true);
//intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
views.setOnClickPendingIntent(R.id.widget_container, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
答案 0 :(得分:9)
有几种方法可以做到这一点。如果要创建新实例并关闭当前实例(假设它位于活动堆栈的顶部),则需要设置Intent.FLAG_ACTIVITY_CLEAR_TOP
。
另一种替代方法是,如果活动已经位于堆栈顶部,则重用相同的活动实例。在这种情况下,您需要设置 Intent.FLAG_ACTIVITY_CLEAR_TOP
和Intent.FLAG_ACTIVITY_SINGLE_TOP
。如果您这样做,Android将不会创建活动的另一个实例,但会调用您活动的onNewIntent()
来传递新的Intent。
答案 1 :(得分:2)
标记其他已关闭,
Intent.FLAG_ACTIVITY_CLEAR_TOP
标记新实例,
Intent.FLAG_ACTIVITY_NEW_TASK
答案 2 :(得分:0)
我的要求是使用新实例启动活动(AbcActivity)并关闭相同活动的任何其他实例(AbcActivity)(如果有),并关闭顶部的其他活动(如果有)。对我有用的解决方案是:
<div class="bxslider">
<ul>
<li><img src="img1.jpg"></img></li>
<li><img src="img2.jpg"></img></li>
</ul>
</div>