android – 从服务中获取Activity的引用

我需要从服务中获取对主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;
    }
}

相关文章

以下为个人理解,如错请评 CE: 凭据加密 (CE) 存储空间, 实际路径/data/user_ce/ DE: 设备加密 (DE) 存...
转载来源:https://blog.csdn.net/yfbdxz/article/details/114702144 用EventLog.writeEvent打的日志(或...
事件分发机制详解 一、基础知识介绍 1、经常用的事件有:MotionEvent.ACTION_DOWN,MotionEvent.ACTION...
又是好久没有写博客了,一直都比较忙,最近终于有时间沉淀和整理一下最近学到和解决的一些问题。 最近进...
Android性能优化——之控件的优化 前面讲了图像的优化,接下来分享一下控件的性能优化,这里主要是面向...
android的开源库是用来在android上显示gif图片的。我在网上查了一下,大家说这个框架写的不错,加载大的...