当我使用IntentService和ResultReceiver时,当我的Activity被破坏时会发生什么

我已经通过networkingsearchfind这个答案。 但没有find结果。 对不起,我是一个非常新手在Java和Android编程。

我会更详细地阐述我的问题。 假设我的Activity启动了一个IntentService,它在后台独立运行。 该服务“订阅”到ResultReceiver的callback来更新活动UI。 在服务执行长时间运行的过程中,活动被破坏。 那么如果服务通过ResultReceiver发送一个回复或进度更新给Activity,会发生什么?

因为我知道,ResultReceiver需要有一个活动的参考。

在我的项目中,我需要开发一个video剪辑消息应用程序。 当用户捕获video时,它会将数据传递给服务,服务将执行上传以及将一些信息保存到数据库中。同时通过ResultReceiver将更新进度发布到Activity UI。

用户可以按照自己的喜好退出或closures活动。 但是,当他们回到应用程序/活动,如果上传/下载仍在进行,它需要显示当前的进展..

最初我想到了Asynctask,但也有类似的问题,正如我所提到的。 它需要调用者Activity的引用。

有什么地方可以达到我提到的要求吗? 对不起,很长的职位。 希望有人能够启发我一点,有更好的代码片段。 非常感谢 :)

编辑:简而言之,是否有办法将新创build的Activitydynamic绑定到正在运行的IntentService,以便服务可以将进度更新发送到正确的Activity?

Solutions Collecting From Web of "当我使用IntentService和ResultReceiver时,当我的Activity被破坏时会发生什么"

在您的Activity上使用BroadcastReceiver,并分别在onResume()onPause()注册/取消注册。 您可以使用IntentFilterIntentService侦听Intent

在您的IntentService ,为IntentFilter创build一个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); }