В Java статическая переменная или константа не будут собираться мусором.поэтому лучше избегать сохранения Context в статической переменной
public static void bindMusicService(Context c, int songPos, ArrayList<Song> songs){
context = c;//remove this line
songIndex = songPos;
songList = songs;
/*mediaPlayerServiceIntent binds our connection to the MediaPlayerService. */
if (!mServiceIsBound) {
try {
mediaPlayerServiceIntent = new Intent(c, MediaPlayerService.class);
c.bindService(mediaPlayerServiceIntent, serviceConnection, Context.BIND_AUTO_CREATE);
} catch (Exception e) {
Log.e("Main", "Service is not bound!");
}
}else{
Main.mediaPlayerService.startActionPlay(context, songList, songIndex);
}
Log.i("Main","Service is bound!");
}
. Передача Context в статический метод - это нормально, просто НЕ сохраняйте его в статической переменной.
в основном, я думаю, что вам нужен лучший способ, чем передача контекста в методы, вы можете использовать кинжал, наконец, если у вас нет выбора, лучше использовать шаблон Singleton или глобальный контекст приложения, который является традиционным.
пример кинжала:
@Module
public class MainActivityModule {
private final Context context;
public MainActivityModule (Context context) {
this.context = context;
}
@Provides //scope is not necessary for parameters stored within the module
public Context context() {
return context;
}
}
@Component(modules={MainActivityModule.class})
@Singleton
public interface MainActivityComponent {
Context context();
void inject(MainActivity mainActivity);
}
и затем
MainActivityComponent mainActivityComponent = DaggerMainActivityComponent.builder()
.mainActivityModule(new MainActivityModule(MainActivity.this))
.build();
в качестве примера шаблона Singleton
private static SingletonDemo instance;
public static SingletonDemo get() {
if(instance == null) instance = getSync();
return instance;
}
private static synchronized SingletonDemo getSync() {
if(instance == null) instance = new SingletonDemo();
return instance;
}
private SingletonDemo(){
App.get();
}
Уровень приложенияконтекст:
public class App extends Application {
private static App instance;
public static App get() { return instance; }
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
}
вы должны определить класс приложения на AndroidManifest.xml
<application
...
android:name="com.example.YourApplication" >
...
</application>