2017-05-24 53 views
0

我已經構建了一個包含幾個android服務變量的單例實用類。我這樣做是爲了避免每次在類中使用方法時都需要傳入'Context'參考。將保持對服務的引用會導致任何問題?Android服務類變量

public class ConnectivityUtil { 

    // TODO: 5/24/2017 Is keeping a service as a member variable a good ida? 
    private static ConnectivityUtil instance; 
    private final ConnectivityManager connectivityManager; 
    private final WifiManager wifiManager; 

    private ConnectivityUtil(Context context) { 
     connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     wifiManager = (WifiManager) context.getApplicationContext() 
       .getSystemService(Context.WIFI_SERVICE); 
    } 

    public static void init(Context context) { 
     instance = new ConnectivityUtil(context); 
    } 

    public static ConnectivityUtil getInstance() { 
     return instance; 
    } 

    ... 
} 
+0

請記住,它會一直保留到您的整個過程被銷燬。只要你的應用程序運行,就認爲它是活着的。 –

+0

也見:https://stackoverflow.com/questions/15054416/is-it-beneficial-to-keep-a-member-reference-to-system-services-in-android –

回答

1

這取決於你通過什麼類型的Context

如果傳遞Application Context這是很好的做法:

內部服務:

ConnectivityUtil.init(MyService.this.getApplicationContext()); 

如果傳遞服務直接

ConnectivityUtil.init(MyService.this); 

你會得到內存泄漏後,服務將被銷燬。

最好做法是init的單班在應用類:

public class MainApplication extends Application { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     ConnectivityUtil.init(getApplicationContext()); 
    } 
} 

所以你Singleton將與應用程序創建的。結果是一樣的。

+0

謝謝。我從應用程序類設置類,以便傳入應用程序上下文。 – mattfred

+0

@mattfred查看更新後的帖子 – DEADMC