Вы не объяснили, зачем вам это нужно. Но это определенно плохой дизайн. Хранение ссылок на Activity - это первое, что вы не должны делать с действиями. Ну, вы можете, но вы должны отслеживать жизненный цикл Activity и выпускать ссылку после того, как вызывается onDestroy()
. Если вы этого не сделаете, вы получите утечку памяти (например, при изменении конфигурации). И, ну, после вызова onDestroy()
активность считается мертвой и, скорее всего, в любом случае бесполезной.
Так что просто не храните ссылку в Сервисе. Опишите, что вам нужно достичь вместо этого. Я уверен, что есть лучшие альтернативы.
UPDATE
Хорошо, так что вам на самом деле не нужна ссылка на Activity. Вместо этого вам нужна ссылка на Context (который в вашем случае должен быть ApplicationContext, чтобы не сохранять ссылку на Activity или любой другой компонент в этом отношении).
Предполагается, что у вас есть отдельный класс, который обрабатывает запрос WebService:
class WebService
{
private final Context mContext;
public WebService(Context ctx)
{
//The only context that is safe to keep without tracking its lifetime
//is application context. Activity context and Service context can expire
//and we do not want to keep reference to them and prevent
//GC from recycling the memory.
mContext = ctx.getApplicationContext();
}
public void someFunc(String filename) throws IOException
{
InputStream iS = mContext.getAssets().open("www/"+filename);
}
}
Теперь вы можете создавать и использовать экземпляр WebService из Service
(что рекомендуется для таких фоновых задач) или даже из Activity
(что гораздо сложнее получить, когда речь идет о вызовах веб-службы или длинных фоновых задачах).
Пример с Service
:
class MyService extends Service
{
WebService mWs;
@Override
public void onCreate()
{
super.onCreate();
mWs = new WebService(this);
//you now can call mWs.someFunc() in separate thread to load data from assets.
}
@Override
public IBinder onBind(Intent intent)
{
return null;
}
}