有时我看到许多应用程序,如msn,windows media player等是单实例应用程序(当用户执行应用程序运行时,将不会创建新的应用程序实例).
在C#中,我使用了Mutex类,但我不知道如何在Java中执行此操作.
为了创建单个实例应用程序,您的建议是什么,以便一次只允许一个进程运行?文件锁,互斥还是什么?
我正在使用此代码阻止我的程序的第二个实例同时运行,是否安全?
Mutex appSingleton = new System.Threading.Mutex(false, "MyAppSingleInstnceMutx");
if (appSingleton.WaitOne(0, false)) {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
appSingleton.Close();
} else {
MessageBox.Show("Sorry, only one instance of MyApp is allowed.");
}
Run Code Online (Sandbox Code Playgroud)
我担心如果有什么东西抛出一个异常并且应用程序崩溃了Mutex仍然会被保留.真的吗?
有没有办法让gVim只运行一个实例,这样当用它打开一个新文件时,它会自动在当前运行的实例的新选项卡中打开?
我知道你可以通过传递来做到这一点,--remote-tab-silent但我想配置gvim,以便这成为默认行为.即我想输入gvim filename并使其表现得好像我将--remote-tab-silent选项传递给它.
gVim 7.2
我在窗户(vista)
我正在使用WxPython中的GUI应用程序,我不确定如何确保在计算机上的任何给定时间只运行我的应用程序的一个副本.由于应用程序的性质,运行不止一次没有任何意义,并且会很快失败.在Win32下,我可以简单地创建一个名为mutex并在启动时检查它.不幸的是,我不知道Linux中可以做到这一点的任何设施.
如果应用程序意外崩溃,我正在寻找会自动发布的内容.我不想让我的用户不得不手动删除锁定文件,因为我崩溃了.
我有一个Activity,它基本上是我的主要活动,它的启动模式是单个实例.但由于singleInstance,onActivityResult()回调不会触发.如果我将清单文件中的启动模式更改为任何其他模式,它可以正常工作.
你能解释为什么这个回调不起作用吗?
我希望我的应用程序的Activity堆栈上的活动只有一个实例.我有几个是ListActivities的屏幕,当我更改ListActivity的另一个实例(添加,编辑,删除等)时,我不想经历更新ListActivity的前一个实例中的列表的痛苦和痛苦. (或者有一种简单的方法可以做到这一点吗?).
注意:我已经读过singleTop会完成这个(虽然如果你点击后退按钮会破坏Activity),但它不起作用.我有一个菜单,如果我进入我的收件箱屏幕,然后我转到我的快捷列表屏幕,然后我再次进入我的收件箱屏幕,它会创建一个新的收件箱活动.
现在,在我的ListActivities上,我将launchMode设置为singleInstance.问题是:如果我使用startActivityForResult启动另一个Activity,onActivityResult处理程序会立即触发(在创建新Activity之前).当我在下一个屏幕上执行必要的操作以返回结果时,onActivityResult处理程序不会触发.
到底是怎么回事?
以下是我如何解雇新活动:
Intent intentLaunchQuickList = new Intent(ActivityMyList.this, ActivityQuickList.class);
startActivityForResult(intentLaunchQuickList, REQUEST_QUICKLIST);
Run Code Online (Sandbox Code Playgroud)
以下是我返回结果的方法:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
QuickListItem qlItem = m_Adapter.getItem(position);
if (qlItem != null && qlItem.getQLId() != -1) {
Intent data = new Intent();
data.putExtra("ql_id", qlItem.getQLId());
if (getParent() == null) {
setResult(Activity.RESULT_OK, data);
}
else {
getParent().setResult(Activity.RESULT_OK, data);
}
}
finish();
}
Run Code Online (Sandbox Code Playgroud)
这是我的onActivityResult处理程序:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode …Run Code Online (Sandbox Code Playgroud) 我已经在StackOverflow上看到至少三种不同的方法来实现这一目标.
使用MUTEX:接受此SO问题的答案
使用Microsoft.VisualBasic库的WindowsFormsApplicationBase:对此SO问题的第二高投票答案
我相信还有更多方法可以做到这一点.
我只是想知道其中一个是否是首选的,如果我选择"错误的",可能会产生什么后果.
我需要一个单实例应用程序(根据这个答案),但它需要通过点击一次部署.
问题是我要求点击一次不会自动检测更新,尝试在应用程序运行时加载新版本.如果它正在运行,那么我需要激活另一个实例.通常,在选择Click Once链接时,它首先要做的是尝试查找更新.我想拦截这个并在启动正常更新过程之前检查已经运行的实例.
有谁知道在Click Once部署方案中这是如何实现的?
当我将启动模式设置为"singleInstance"时,我在MYApp中打开电子邮件时遇到问题.
我附加了示例Android项目,它从电子邮件附件中读取文件名并在屏幕上显示.在onCreate的情况下工作正常但在应用程序启动模式为singleInstance时在onNewIntent中抛出错误.
Launchmode.java
package your.namespace.launchmode;
public class LaunchModeActivity extends Activity {
private static final int OPEN_ACT = 2;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String name = getAttachmetName(getIntent());
if(null != name)
{
TextView textv = (TextView) findViewById(R.id.attachmentnm);
textv.setText(name);
}
}
@Override
protected void onNewIntent(Intent savedInstanceState)
{
super.onNewIntent(savedInstanceState);
String name = getAttachmetName(savedInstanceState);
if(null != name)
{
TextView textv = (TextView) findViewById(R.id.attachmentnm);
textv.setText(name);
}
}
private String getAttachmetName(Intent intent) {
final …Run Code Online (Sandbox Code Playgroud)