1. 程式人生 > >Android的Application中onCreate執行多次解決方案

Android的Application中onCreate執行多次解決方案

       一般情況下,一個應用開啟一個程序,application會被執行一次,如果涉及多開程序,那情況就不同了,application就會被執行多次,下面筆者根據這問題對應用開啟多程序的進行分析:

android:process

       說到Android程序,我們就得了解android:process這個屬性,這個屬性有什麼作用?我們就來看看:
       在Android的幫助文件中我們可以瞭解到,一般情況下一個服務沒有自己獨立的程序,它一般是作為一個執行緒運行於它所在的應用的程序中。但是也有例外,Android宣告檔案中的android:process屬性卻可以為任意元件包括應用指定程序,換句話說,通過在宣告檔案中設定android:process屬性,我們可以讓元件(例如Activity, Service等)和應用(Application)建立並運行於我們指定的程序中。
舉個例子:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.soubw.prodemo" >//包名

<activity android:name=".LoginActivity"
    android:process=":login"/>//為activity開啟一個程序

上面就是為登入的Activity開啟一個叫login程序,只不過這個程序是在以應用預設的包名下開啟的程序,叫com.soubw.prodemo:login,在屬性中值為什麼以冒號開頭呢,因為’:’這個字首將把這個名字附加到你的包所執行的標準程序名字的後面作為新的程序名稱(只不過這個login程序為該應用私用,其他應用不能共享),上面的例子很好的講述這點。

       還有一種是不以冒號開頭而以小寫字母開頭,我們也舉個例子來說明:

<activity android:name=".RegisterActivity"
    android:process="com.wxj.register"/>//為activity開啟一個不同於應用包名的程序

這個程序將以com.wxj.register這個名字命名的運行於全域性的程序中(該程序就可以讓不同應用中的各種元件可以共享一個程序)。

解決多程序次執行多次onCreate()

如果應用中採用多程序方式,oncreate方法會執行多次,根據不同的程序名字進行不同的初始化。應用判斷程序名字進行單獨初始化,這要就可以利用程序名根據具體需求,應該載入哪些資源,執行哪些具體邏輯了。

    @Override
    public void onCreate() {
        super.onCreate();
        String processName = getProcessName(this);
        if (processName!= null) {
            if(processName.equals("com.soubw.prodemo")){
                //初始化com.soubw.prodemo以包名為程序名,專案預設的程序
            } else if(processName.equals("com.soubw.prodemo:login")){
                //初始化com.soubw.prodemo:login
            }else if(processName.equals("com.wxj.register")){
                //初始化com.wxj.register
            }else{

            }
        }
    }


    private String getProcessName(Context context) {
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
        if (runningApps == null) {
            return null;
        }
        for (ActivityManager.RunningAppProcessInfo proInfo : runningApps) {
            if (proInfo.pid == android.os.Process.myPid()) {
                if (proInfo.processName != null) {
                    return proInfo.processName;
                }
            }
        }
        return null;
    }