linux手機平台 讓應用程式單例項執行

2021-04-12 12:29:59 字數 1720 閱讀 6553

[linux

手機平台

]讓應用程式單例項執行

作者****:

li xianjing

2006-12-19

和pc上的應用程式不同,手機上的應用程式一般都只允許單例項執行。當應用程式已經在執行,再次執行該應用程式時,通常只是把該應用程式的視窗提到前面來,把新的命令列引數傳遞給第乙個執行例項,而第二個例項退出。這在傳統的單程序多執行緒的手機平台中,實現是簡單而直接的,而在linux這樣的多程序平台裡,則會稍微困難一點。

記得在windows下,保證應用程式單例項執行的最簡單辦法就是建立乙個命名的mutex,第二個例項執行時建立同名的mutex會失敗,便認為當前執行例項不是第乙個了。這種方法雖然可以解決單例項執行的問題,但是無法把第二個例項的命令列引數傳遞給第乙個例項,也無法把第乙個執行例項的視窗提到前面來。在pc上,把第乙個執行例項的視窗提到前面來,完全可以讓使用者自己手工進行,而在手機上應該由程式來實現。

在我們的linux手機平台中,起動應用程式的地方主要有:開始選單、新事件檢視和檔案管理器。開始選單中起動應用程式,引數是固定的,處理最簡單。新事件檢視即檢視新簡訊、新提醒和新聯絡歷史等等,它起動應用程式時,會把新事件的記錄id作為命令列引數,傳遞給對應的應用程式。檔案管理器即可以起動應用程式,也可以用應用程式開啟其關聯的檔案,後者把資料檔案的檔名作為命令列引數,傳遞給對應的應用程式。

這實際上由三個子問題組成:應用程式單例項執行、自動把視窗提到前面和把引數傳遞給第乙個執行例項。對此我們考慮了下列方法:

方法一:遍歷/proc目錄下的程序資訊,如果應用程式對應的程序存在,則讓認為應用程式已經在執行。然後強制關閉該應用程式,用新的命令列引數重新執行它。這樣做的優點是實現簡單,到達了我們預期的目標。缺點是強制kill第乙個執行例項太野蠻,可能會造成資料丟失,另外建立新程序的開銷會讓使用者感覺反應遲鈍。

方法二:通過視窗管理器實現,根據應用程式的視窗判斷應用程式是否在執行。如果發現對應的應用程式已經在執行,把對應的視窗提到前面來。這要修改應用程式才行,只有應用程式自己才知道其擁有的視窗的關係,若不加考慮把應用程式的主視窗提到前面來,這也並不見得合適。這種方法只能解決前兩個小問題,命令列引數還是無法傳遞給第乙個執行例項。

方法三:應用程式提供乙個dbus服務物件,第乙個執行例項作為伺服器執行,第二個執行例項作為客戶端執行,第二個執行例項把命令列引數傳遞給第乙個執行例項,然後就退出。第乙個執行例項接受到新的命令列引數,作相應的處理,比如,把相應的視窗提到前面來,根據命令列引數進行處理。這是第二種方法的改進,可以實現全部的功能,缺點是要修改應用程式,不過dbus服務物件可以通過乙個公共庫來實現,應用程式的改動並不大。

我們最終決定採用方法三,並實現了乙個公共函式庫,它提供下列功能:

l判斷當前執行例項是否是第乙個例項。

l第乙個執行例項作為伺服器執行,註冊自己的命令列引數處理函式。

l第二個執行例項作為客戶端執行,更新自己的命令列引數到伺服器(即第乙個執行例項)上。

在起動時,應用程式的常規處理方法

l如果是第乙個執行例項,則作為伺服器執行,並註冊命令列引數處理的**函式,後續操作與正常相同。再次執行該應用程式時,註冊的**函式就會被dbus呼叫,並傳入新的命令列引數。在該**函式中,應用程式通常要把相應的視窗提到前面來,並根據新的命令列引數做些處理。比如,檢視新簡訊時,簡訊應用程式要開啟檢視視窗,或者把檢視視窗提到前面來,並顯示新的簡訊內容。

l

沒有想到更好的辦法,不知道別的手機是怎麼做的,希望各位高手貢獻寶貴意見。

~~end~~

應用程式單例

應用程式單例可以通過下面的幾種方法來實現 1.使用mutex類 2.使用semphore類 3.使用eventwaithandle類 其中使用semphore能控制應用程式能夠啟動的例項的個數,下面分別給出相應的實現 例子使用的都是winform應用程式.form1是乙個新建的空的窗體.1.使用mu...

WPF 單例項應用程式

例如 microsoft word,不管開啟多少個文件 也不管它們是如何開啟的 一次只能載入 winword.exe 乙個例項。這便是單例項應用程式。但是最簡單的實現方法,並且也是wpf團隊當前推薦的方法是,使用windows窗體提供的內建支援,這一內建支援最初是用於 visual basic 應用...

angular 單頁面應用程式

我們都知道angularjs是單一頁面應用程式,那什麼是單一頁面應用程式呢?單一頁面應用程式到底有什麼好處呢?下面我們來看一下 首先我覺得可以把頁面的響應模式分成這樣大概3個階段 1.最傳統的階段 什麼都得重新整理 最傳統的web站點中,客戶端向伺服器傳送請求,伺服器響應之後把生成好的html通過r...