使用意图标志和androidmanifest

时间:2013-07-30 12:34:16

标签: java android android-intent service

我有一项启动活动的服务(比如Activity A),如下所示:

        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
        getApplicationContext().startActivity(intent);

当我启动我的应用时,Activity A会在应用的第一个活动之前出现。

我有两种解决方案可以解决这个问题:

1)

将上述代码更改为:

        intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY
                | Intent.FLAG_ACTIVITY_NEW_TASK);
        getApplicationContext().startActivity(intent);

问题

启动活动并按下主页后,我仍然在历史堆栈中看到活动(= recent tasks)。怎么来的?

在我启动应用程序后,这两个任务合并为一个,应用程序的第一个活动位于顶部。但任何其他应用程序,创建一个新任务,Activity A的任务仍然存在。怎么来的?

2) 将上述代码更改为:

        intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY
                | Intent.FLAG_ACTIVITY_NEW_TASK);
        getApplicationContext().startActivity(intent);

并添加到清单:

   <activity
        android:name="org.achartengine.GraphicalActivity"
        android:taskAffinity="org.achartengine"
        >

其中Activity A = android:name="org.achartengine.GraphicalActivity"

问题: 我保留了不必要的任务堆栈。

我假设很少有人从服务开始这项活动。即便如此,他们也只会做一次。这意味着当用户单击home / back键时,从任何历史堆栈中清除活动会更加整洁。

首选哪个选项? (或另一个?)

2 个答案:

答案 0 :(得分:1)

快速解决方法是将android:launchMode =“singleTop”添加到清单中的活动,这样只会有一个而不是多个实例。完成同样事情的另一种方法是在启动意图之前使用以下内容。

Intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

还有其他一些可能尝试使用清单

android:noHistory="true"

并确保您正在致电

finish();

结束这种意图。

表示活动或这两个意图标志的组合

Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP

如果上述方法不起作用,我能想到的最后一件事就是

moveTaskToBack(true);

并没有解决问题。

希望这有帮助。

答案 1 :(得分:0)

这是一种将第一项活动从堆栈中移除的方法。

        Thread nohistory = new Thread () {
        public void run () {
            try {
                Intent i = new Intent(Splash.this, ActivitySplash.class);
                i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(i);
                finish();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
    nohistory.start();