当我使用带有ResultReceiver的IntentService时,如果我的Activity被销毁会发生什么?

9
我已经搜索了互联网,但没有找到答案。很抱歉我是Java和Android编程的新手。
我想更详细地描述我的问题。比方说,我的Activity启动了IntentService并在后台独立运行。服务“订阅”ResultReceiver回调以更新Activity UI。当服务正在执行长时间运行的过程时,Activity被销毁。那么,如果服务通过ResultReceiver向Activity发送答复或进度更新会发生什么?
因为我知道,ResultReceiver需要引用Activity。
在我的项目中,我需要开发一个视频消息应用程序。当用户捕捉视频时,它将传递数据到服务,并且服务将执行上传,并将一些信息保存到数据库中……同时,通过ResultReceiver不断地向Activity UI发布进度更新。
用户可以随意退出或杀死Activity。但是,当他们再次导航到应用程序/ Activity时,如果上传/下载仍在进行,则需要显示当前进度。
最初我考虑使用Asynctask,但它也有类似的问题,就像我所提到的那样。它需要调用者Activity的引用。
是否有任何地方可以实现我所提到的要求?非常抱歉这是一个很长的帖子。希望有人能给我一些启示,最好还有一些代码片段。非常感谢:)
编辑:简单地说,是否有一种方法可以动态地将新创建的Activity绑定到正在运行的IntentService,以便服务可以向正确的Activity发送进度更新?

1
我这里也遇到了同样的问题。你找到解决办法了吗? - Kavin Prabhu
我也有同样的问题。 - has19
1个回答

2

在你的Activity中使用BroadcastReceiver,并在onResume()onPause()中分别注册和注销它。你可以使用IntentFilter来监听来自IntentServiceIntent

在你的IntentService中,为IntentFilter创建一个Action值,并在需要更新时发送具有该Action的广播:

public static final String ACTION = "com.example.yourapp.action.ACTION_TAG";

private void handleResult() {
    if (BuildConfig.DEBUG) {
        Log.v(TAG, "handleResult");
    }

    // Broadcast result
    Intent intent = new Intent(ACTION);
    intent.putExtra("your_extra", someValue);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

在您的Activity中:
private BroadcastReceiver mYourReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (BuildConfig.DEBUG) {
                Log.v(TAG, "onReceive");
            }



            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                // Update with content from bundle
            }
        }
    };

     @Override
     public void onResume() {
         super.onResume();

         if (BuildConfig.DEBUG) {
             Log.v(TAG, "onResume");
         }

         // Register broadcast receiver
         LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mYourReceiver, new IntentFilter(YourIntentService.ACTION));
    }

    @Override
    public void onPause() {
         super.onPause();
         if (BuildConfig.DEBUG) {
             Log.v(TAG, "onPause");
         }

         // Unregister broadcast receiver
         LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mYourReceiver);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接