android - studio流程圖 - 隨處使用應用程序上下




android studio流程圖 (6)

在Android應用程序中,以下方法有什麼不妥之處:

public class MyApp extends android.app.Application {

    private static MyApp instance;

    public MyApp() {
        instance = this;
    }

    public static Context getContext() {
        return instance;
    }

}

並將其傳遞到需要上下文(並且當然不會洩漏)的地方(例如SQLiteOpenHelper)?


你正試圖創建一個包裝器來獲得應用程序上下文,並有可能返回“ null ”指針。

根據我的理解,我猜想它更好的方法來調用任何2 Context.getApplicationContext()Activity.getApplication()


應用類別:

import android.app.Application;
import android.content.Context;

public class MyApplication extends Application {

    private static Context mContext;

    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext();
    }

    public static Context getAppContext() {
        return mContext;
    }

}

在AndroidManifest中聲明應用程序:

<application android:name=".MyApplication"
    ...
/>

用法:

MyApplication.getAppContext()

我喜歡它,但我會建議一個單身人士:

package com.mobidrone;

import android.app.Application;
import android.content.Context;

public class ApplicationContext extends Application
{
    private static ApplicationContext instance = null;

    private ApplicationContext()
    {
        instance = this;
    }

    public static Context getInstance()
    {
        if (null == instance)
        {
            instance = new ApplicationContext();
        }

        return instance;
    }
}

我將使用應用程序上下文來獲取構造函數中的系統服務。 這簡化了測試和組合的好處

public class MyActivity extends Activity {

    private final NotificationManager notificationManager;

    public MyActivity() {
       this(MyApp.getContext().getSystemService(NOTIFICATION_SERVICE));
    }

    public MyActivity(NotificationManager notificationManager) {
       this.notificationManager = notificationManager;
    }

    // onCreate etc

}

然後測試類將使用重載的構造函數。

Android會使用默認的構造函數。


根據我的經驗,這種方法不應該是必需的。 如果您需要上下文來處理任何事情,您通常可以通過調用View.getContext()並使用獲得的上下文來獲取上下文,您可以調用Context.getApplicationContext()來獲取應用程序上下文。 如果你試圖從一個Activity獲取Appication上下文,你總是可以調用Activity.getApplication() ,它應該能夠作為調用SQLiteOpenHelper()所需的上下文來傳遞。

總的來說,對於這種情況,您的方法似乎沒有問題,但在處理Context時,請確保您沒有按照官方Google Android開發人員博客中的描述在任何地方洩漏內存


這是一個好方法。 我自己也使用它。 我只會建議重寫onCreate來設置單例而不是使用構造函數。

而且,由於您提到了SQLiteOpenHelper :在onCreate ()您也可以打開數據庫。

就我個人而言,我認為文檔說錯了, 通常不需要子類化應用程序 。 我認為情況正好相反:你總是應用子類。





android-context