2012-01-18 70 views
17

我在带有图标的应用程序上有一个通用菜单。点击一个图标将开始一个活动。有没有办法知道一个活动是否已经在运行,并防止它多次(或从多个条目)启动?我也可以将处于onPause状态的活动带到前面吗?防止多次打开活动

+0

我没有做过Android开发在一段时间内,但我敢肯定,Android会调出你的'Activity'的现有实例,而不是启动一个新的实例。 – 2012-01-18 07:16:23

回答

30

使用此:

intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 

同时开始Activity

documentation

如果传递给Context.startActivity()的意图设置,这个标志将 导致启动的活动被带到其任务的 历史堆栈的前面,如果它已经是运行。

14

在清单文件的活动宣言,​​添加标签android:launchMode="singleInstance"

+0

从startActivityForResult的文档中,如果您正在启动的活动使用singleTask启动模式,它将不会在您的任务中运行,因此您将立即收到取消结果。 – 2013-08-03 06:27:42

+0

我有多个入口点,这对我很有用 – 2015-07-09 11:44:21

+0

事实上,我不是“singleInstance”的粉丝,因为它会导致活动在单独的窗口中运行,就好像它是一个单独的应用程序,用户打开应用程序视图时的用户体验。 – 2017-04-09 08:08:25

0

创建活动,你不想开始多次像

Class ExampleA extends Activity { 
public static Activity classAinstance = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    classAinstance = this; 
} 

} 

现在在以往任何时候ü要的实例crosscheck我的意思是防止它启动多次,像这样检查

if(ExampleA.classAinstance == null) { 
     "Then only start your activity" 
} 
+1

请注意,这样可以防止垃圾收集活动。此外,如果Activity是从其他不能访问(甚至不知道)静态活动引用的其他组件(例如,另一个应用程序)启动的,则这将无济于事。 – lxgr 2015-06-08 15:54:51

0

Add给你的Activity定义Androidmanifest.xml ...

android:launchMode = "singleInstance" 
0

只需使用

Intent i = new Intent(ActivityA.this, ActivityB.class); 
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
startActivity(i); 
-1

添加此

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    finish(); 
} 

launchmode到singleTask /单模

总是通过清除栈

+2

请给你的答案添加一些解释。 – ItamarG3 2017-05-19 12:21:48

+0

**来自复审队列:**我可以请求您在请求答案时添加更多的上下文。仅有代码的答案很难理解。如果您可以在帖子中添加更多信息,它可以帮助提问者和未来的读者。 – 2017-05-19 17:46:37

2

我把它做以下工作完全打开新的活动。 在(甚至是从其他应用程序)

Intent launchIntent = getPackageManager().getLaunchIntentForPackage(APP_PACKAGE_NAME); 

//the previous line can be replaced by the normal Intent that has the activity name Intent launchIntent = new Intent(ActivityA.this, ActivityB.class); 

     launchIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT|Intent.FLAG_ACTIVITY_NEW_TASK); 

startActivity(launchIntent); 

,并在接收器的工作的清单呼叫者活动或服务(我想阻止开放两次)

<activity android:name=".MainActivity" 
      android:launchMode="singleTask" 
      >