将活动实例传递给IntentService

时间:2014-05-27 00:18:05

标签: java android

我正在尝试将我的活动实例传递给意向服务。原因是意图服务进行了大量后台服务器通信,如果出现网络错误或服务器返回错误,我想显示弹出消息。

当我创建服务时,我使用此

    Intent service = new Intent(this, SyncService.class);
    Bundle b2 = new Bundle();
    b2.putParcelable(StringsConfig.OBJECT_DELIVERABLES, objects);
    service.putExtras(b2);
    startService(service);

有没有办法将Activity的实例传递给它。我在SyncService类中也有一个接受Activity的方法,但我不知道如何创建同步服务类的实例,通过该方法传递活动,然后启动同步服务。

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

将Activity实例传递给Intent Service并不是一个好主意。如果长时间运行的后台服务需要显示对话框消息,那么最好将其建模为Intent。

只是做:

Intent dialogIntent = new Intent(getApplicationContext(), YourDialogActivity.class);
dialogIntent.putStringExtra(Constants.TITLE, "Your Dialog Title");
dialogIntent.putIntExtra(Constants.MESSAGE, R.string.yourErrorMessageId);
startActivity(dialogIntent);

这样,服务合同就更清晰了。

答案 1 :(得分:1)

IntentService与活动进行通信的推荐方法是通过BroadcastReceiver。看一下这个例子:

在您希望IntentService与之通信的活动中,创建一个侦听特定意图操作(String)的BroadcastReceiver。这里我的示例名为batchProcessReceiver,并侦听BATCH_PROCESS_RECEIVER操作。 BATCH_PROCESS_RECEIVER可以是Activity中的公共静态常量。

private BroadcastReceiver batchProcessReceiver = new BroadcastReceiver() {
    @Override public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(BATCH_PROCESS_RECEIVER)) {
            // do what you need to do here
        }
    }
};

在您的活动onResume:

registerReceiver(batchProcessReceiver, new IntentFilter(BATCH_PROCESS_RECEIVER));

的onPause:

unregisterReceiver(batchProcessReceiver);

然后在你的IntentService中,你可以做到

sendBroadcast(new Intent(MyActivity.BATCH_PROCESS_RECEIVER));

触发您要在活动中执行的操作。