首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从活动启动IntentService,并在IntentService完成时刷新活动

从活动启动IntentService,并在IntentService完成时刷新活动
EN

Stack Overflow用户
提问于 2012-01-31 22:58:29
回答 5查看 18.4K关注 0票数 28

在我的Android应用程序中,我有一个带有适配器的简单列表视图。有一个繁重的查询,即用数据填充列表视图。所以我把它放到一个运行在另一个线程中的IntentService中。

IntentService通常单独运行,只需查询一些数据并将其插入SQLite数据库。

但现在我希望有以下可能性:

  1. 该活动使用IntentService ()启动startService()。
  2. IntentService做了繁重的工作。
  3. 当IntentService完成时,它应该将结果通知活动,以便可以刷新该活动以显示新的数据。

这个是可能的吗?我在这里读到了很多关于堆栈溢出的问题。但在每一个问题上,都有另一个解决办法。所以我想问大家:哪种解决方案最适合我的目的?

  • 将IntentService绑定到活动似乎不是最好的解决方案,因为可能会与活动的配置更改发生冲突,对吗?
  • 这篇博客文章建议在Parcelable中使用AIDL --对我来说这听起来非常复杂。有更简单的方法,不是吗?
  • 您可以在活动中设置广播接收器,并在IntentService中完成该广播。
  • 有些人说你应该使用createPendingResult()传递PendingIntent到IntentService。如果IntentService在它的附加程序中发现了PendingIntent,它就会使用它来触发活动中的onActivityResult()。这就是选择的方式吗?
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-01 00:23:46

例如,我使用ResultReceiver在我的Activity (扩展ListActivity)的适配器上调用notifyDataSetChanged()。它可以用来做你需要做的任何事情。

ResultReceiver代码:

代码语言:javascript
复制
public class MyResultReceiver extends ResultReceiver {

    private Context context = null;

    protected void setParentContext (Context context) {
        this.context = context;
    }

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

    @Override
    protected void onReceiveResult (int resultCode, Bundle resultData) {

        // Code to process resultData here

        ((BaseAdapter) ((ListActivity)context).getListAdapter()).notifyDataSetChanged();
    }
}

MyActivity代码:

代码语言:javascript
复制
public class MyActivity extends ListActivity {

    private MyResultReceiver theReceiver = null;

    ...

    private void callService () {
        theReceiver = new MyResultReceiver(new Handler());
        theReceiver.setParentContext(this);
        Intent i = new Intent("com.mycompany.ACTION_DO_SOMETHING");

        // Code to define and initialize myData here

        i.putExtra("someData", myData);
        i.putExtra("resReceiver", theReceiver);
        startService(i);

    }
}

IntentService代码:

代码语言:javascript
复制
Bundle resultBundle = new Bundle();
ResultReceiver resRec = intent.getParcelableExtra("resReceiver");

// Do some work then put some stuff in resultBundle here

resRec.send(12345, resultBundle);
票数 24
EN

Stack Overflow用户

发布于 2013-10-06 05:30:34

当IntentService完成时,它应该使用LocalBroadcastManager向任何注册的活动发送意图。

IntentService将包含如下代码:

代码语言:javascript
复制
private void sendBroadcast() {
    Intent intent = new Intent("myBroadcastIntent");
    intent.putExtra("someName", someValue);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

接收通知的活动将包含如下代码:

代码语言:javascript
复制
@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...
    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String someValue = intent.getStringExtra("someName");
            // ... do something ...
        }
    };
    LocalBroadcastManager.getInstance(this)
        .registerReceiver(receiver, new IntentFilter("myBroadcastIntent"));
}

有关更深入的内容,请参见博客文章在服务中使用LocalBroadcastManager进行活动通信

票数 14
EN

Stack Overflow用户

发布于 2014-03-20 14:53:06

其他答案都没有提到官方的android文档。

https://developer.android.com/training/run-background-service/report-status.html

这清楚地表明,对于活动-IntentService通信,“推荐的发送和接收状态的方法是使用LocalBroadcastManager,它将广播意图对象限制在您自己的应用程序中的组件”!

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9088315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档