在活动被销毁后访问启动已启动服务的活动

时间:2012-07-20 18:45:28

标签: android

我想我可以传递一个开始Started Service的活动的引用。由于该服务具有Activity的引用,因此它可以调用该引用的方法。

现在,如果Activity被销毁,但服务仍然在后台运行,那么如果服务调用活动引用的方法会发生什么?

1 个答案:

答案 0 :(得分:1)

你绝对应该避免存储对活动的引用。如果是这样,你必须在活动的onDestroy()中释放它,否则你可能会发生内存泄漏。您在服务中存储引用的原因是什么?

EDIT:

您可以使用Toast通知或状态栏通知来通知用户后台工作已完成。这是一种常见的做法。如果您需要与Activity进行通信,有几种方法可以实现它。您可以绑定到Activity,使用Intents或使用AIDL。您可以查看更多详细信息here

我使用IntentsResultReceiver来描述其中一个选项。

Service在应用程序的主线程中运行,因此如果您正在执行阻塞操作,则应在服务中启动一个新线程。在这种情况下,您可以使用IntentService来简化您的工作,并且已经实现了线程化工作。

我将从ResultReceiver扩展自定义ServiceResultReceiver。我在Activity中实现其界面,并在启动Service时将接收器对象传递给IntentService

自定义ResultReceiver

public class ServiceResultReceiver extends ResultReceiver {

    private Receiver mReceiver;

    public ServiceResultReceiver(Handler handler) {
        super(handler);
    }

    public void setReceiver(Receiver receiver) {
        mReceiver = receiver;
    }

    public interface Receiver {
        public void onReceiveResult(int resultCode, Bundle resultData);
    }

    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        if (mReceiver != null) {
            mReceiver.onReceiveResult(resultCode, resultData);
        }
    }
}

您的Activity

public class MyActivity extends Activity implements ServiceResultReceiver.Receiver {
    private ServiceResultReceiver mReceiver;
    ...

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        mReceiver = new ServiceResultReceiver(new Handler());
        mReceiver.setReceiver(this);
        // starting a service
        final Intent intent = new Intent(this, MyService.class);
        intent.putExtra("receiver", mReceiver);
        startService(intent);
    }
    ...

    @Override
    public void onReceiveResult(int resultCode, Bundle resultData) {
        // here you can handle data which came from your service.
        Toast.makeText(this, "onReceiveResult()", Toast.LENGTH_SHORT).show();
    }

您的Service

public class MyService extends IntentService {
    ...
    @Override
    protected void onHandleIntent(Intent intent) {
        // executing your task
        ...
        // getting the receiver and sending back data in Bundle (here in this example we are sending no data)
        final ResultReceiver receiver = intent.getParcelableExtra("receiver");
        if (receiver != null) {
            receiver.send(0, null);
        }
    }
}
相关问题