当我将IntentService与ResultReceiver一起使用时,我的Activity被销毁时会发生什么

时间:2015-01-06 09:54:20

标签: java android multithreading android-activity intentservice

我在网上搜索了这个答案。但没有找到结果。 对不起,我是Java和Java的新手。 Android编程。

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

因为我知道,ResultReceiver需要有一个Activity的引用。

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

用户可以根据需要退出或终止活动。但是当他们导航回app / Activity时,如果上传/下载仍在进行中,则需要显示当前进度..

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

我能在哪里达到我提到的要求吗? 对不起,很长的帖子。希望有人能够启发我一点,并且拥有一些代码片段会更好。 非常感谢:)

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

1 个答案:

答案 0 :(得分:2)

在您的活动中使用BroadcastReceiver,并分别在onResume()onPause()注册/取消注册。您可以使用IntentFilter收听Intent中的IntentService

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);
    }