我需要从服务中获取对主Activity的引用.
这是我的设计:
MainActivity.java
public class MainActivity extendsActivity{ private Intent myIntent; onCreate(){ myIntent=new Intent(MainActivity.this,MyService.class); btnStart.setOnClickListener(new OnClickListener(){ public void onClick(View V){ startService(myIntent); }); }}
MyService.java
class MyService extends Service{ public IBinder onBind(Intent intent) { return null; } onCreate(){ //Here I need to have a MainActivity reference //to pass it to another object } }
我能怎么做?
[编辑]
感谢大家的答案!
这个应用程序是一个Web服务器,此时此功能仅适用于线程,我想使用服务,以使其在后台运行.
问题是我有一个负责从资产获取页面的类,要执行此操作,我需要使用此方法:
InputStream iS =myActivity.getAssets().open("www/"+filename);
此时我的项目只有一个Activity而没有服务,所以我可以直接从它自己传递main活动的引用:
WebServer ws= new DroidWebServer(8080,this);
所以,为了使这个应用程序与服务一起使用,我应该在设计中改变什么?
解决方法
你没有解释为什么你需要这个.但这绝对是糟糕的设计.存储对Activity的引用是你不应该对活动做的第一件事.好吧,你可以,但是你必须跟踪Activity生命周期并在调用onDestroy()之后释放引用.如果您不这样做,您将收到内存泄漏(例如,配置更改时).而且,在调用onDestroy()之后,Activity被认为是死的,无论如何都很可能无用.
所以只是不要将引用存储在Service中.描述你需要实现的目标.我相信那里有更好的选择.
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); } }
现在你可以创建&使用来自Service的WebService实例(推荐用于此类后台任务)或甚至来自Activity(在涉及Web服务调用或长后台任务时更难以实现).
服务示例:
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; } }