怎样让Android应用程序只运行一个实例?

怎样让Android应用程序只运行一个实例?,第1张

这个倒是没听说过

给你列出Activity的四种启动模式吧:

1. standard

模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。

2. singleTop

如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。

3. singleTask

如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。

4. singleInstance

在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。

另外:

设置Activity的启动模式,要在AndroidManifest.xml里对应的标签设置android:launchMode属性

android:name=".MyActivity"

android:launchMode="standard" />

关键字:VC如何使应用程序只运行一个实例,VC 只运行一次,只给一个程序运行

在开发网络应用程序的时候,由于端口分配和占用问题,经常出现某程序只给运行一个实例的情况.下面就介绍一下,如何使程序就只运行一个实例.

方法一:在应用程序类中使用互斥量

实现步骤:

1.用GUIDGEN.EXE产生一个全局标志,#define PROC_ID "产生的全局标志"

如本实例:#define PROC_ID "0xa9a66d98, 0x18c7, 0x447b, 0x80, 0xc, 0xa3, 0x20, 0xea, 0x4f, 0xb6, 0xe8" //注:GUIDGEN.EXE为VC自带工具,如果在开始->程序的Microsoft Visual C++ 6.0 Tools里找不到该程序可以到C:\Program Files\Microsoft Visual Studio\Common\Tools里找到.

//注:用此方法生成的串,只为保证该进程标识的唯一性,也可以自己定一个简单的串标识

2.

BOOL CEx1App::InitInstance()

{

handle=::CreateMutex(NULL,FALSE,PROC_ID)//handle为声明的HANDLE类型的全局变量

if(GetLastError()==ERROR_ALREADY_EXISTS)

{

AfxMessageBox("应用程序已经在运行")

return FALSE

}

......................//略

}

3.

在XXApp类里右件,添加ExitInstance虚函数:(函数里语句如下即可)

int CEx1App::ExitInstance()

{

CloseHandle(handle)

return CWinApp::ExitInstance()

}

///缺点:无法击活旧窗口

方法二:枚举进程法

#define ID_GUI "0xa9a66d98, 0x18c7, 0x447b, 0x80, 0xc, 0xa3, 0x20, 0xea, 0x4f, 0xb6, 0xe8"//Guidgen.exe生成保证唯一性

//添加的标识只运行一次的属性名

CString g_szPropName = ID_GUI?? //全局变量

HANDLE g_hValue = (HANDLE)1//全局变量

//添加一个枚举窗口的函数

BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)

{

HANDLE h = GetProp(hwnd,g_szPropName)

if( h == g_hValue)

{

?? *(HWND*)lParam = hwnd

?? return false

}

return true

}

BOOL CRunOnceApp::InitInstance()

{

?? //查找是否有本程序的前一个实例运行

HWND oldHWnd = NULL

EnumWindows(EnumWndProc,(LPARAM)&oldHWnd)//枚举所有运行的窗口

if(oldHWnd != NULL)

{

?? AfxMessageBox("本程序已经在运行了")

?? ::ShowWindow(oldHWnd,SW_SHOWNORMAL)??? //激活找到的前一个程序

?? ::SetForegroundWindow(oldHWnd)?? //把它设为前景窗口

?? return false??????? //退出本次运行

}

................//略

}

在XXDlg.cpp页

//声明全局变量

extern CString g_szPropName

extern HANDLE g_hValue

在主窗口的 OnInitDialog()中添加属性

//设置窗口属性

SetProp(m_hWnd,g_szPropName,g_hValue)

方法二优点:可以激活旧进程窗口

1,首先,你肯定运行了多次安装程序,每个软件的安装程序都只能一次运行一个的,意思是,不能多次运行这个安装程序,等第一次运行的那个结束了你可以再次运行,不过这是替换这个软件罢了。

2,之所以不能同时运行多次是因为他们在安装软件的过程中,要读取这个文件的,如果多个一起运行,会造成死锁,因为他们读写的文件都一样,容易出错,所以限制了一次运行多个。

3,你只要打开任务管理器,结束上一个进程,就可以再次运行了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11148813.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存