从服务或线程类通知活动类有关操作的信息

时间:2013-11-08 04:39:19

标签: android android-service android-handler

从我的服务类,我开始一个线程。如果线程类采取任何操作,那么通知活动的最佳方法是什么?我想通知我的活动类,线程采取了一些操作。问题将从以下代码中清楚

MyService类onCreate()方法

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

    if (downloadThread == null) {
        downloadThread = new DownloadThread(this);
        downloadThread.activateUserSession();
        downloadThread.start();
    }
}

我的下载主题

public void run()
{
    while (!isStopRequested) {
        if (isSessionActive && downloadNow) 
        {

            downloadNow = false;
            informActivity("Download Started");

            //do some loading work !!
            SystemClock.sleep(10000);

            informActivity("Download Finished");
        }

        SystemClock.sleep(2000);
    }
}

当downloadNow为true时,请不要详细说明等等。我只需要告知我的活动下载已开始且下载完成。 Handler需要做些什么。任何人都可以告诉我处理这种情况的最佳方法。

2 个答案:

答案 0 :(得分:1)

我建议您使用后台服务中的startActivity。所以最简单的形式就是

String theEvent = "downloadStarted";
Intent intentForActivity = new Intent(this, MyActivity.class);
intentForActivity.putExtra(THE_EVENT, theEvent);
startActivity(intentForActivity)

如果您的活动已在运行(如您所述),则输入点将为onNewIntent,您可以在此处提取THE_EVENT并逐个处理

onNewIntent(Intent intent) {
    String theEvent = intent.getExtra(THE_EVENT);
    if (theEvent.equals("downloadStarted") {
        // do your stuff
    } else if (theEvent.equals("downloadCompleted") {
        // do your other stuff 
    }
}

Handler只允许您将内容排队等待,而不会完全阻止您的线程。在你的情况下,如果你谈论大量的并发下载,这可能会有所帮助,但是没有必要开始。

答案 1 :(得分:0)

首先,您不需要使用Intent 绑定它来启动服务。一个或另一个就足够了。

在这种情况下,我建议绑定到服务,因为这使您有机会通过处理程序和信使建立通信。您可以使用ServiceConnection类的onServiceConnected方法获取在服务中定义的Messenger。有关如何执行此操作的示例,请参阅创建绑定服务下的Android docs here。在他们的示例中,它们返回对Service实例的引用,但您应该将其替换为对Messenger或Handler的引用。一旦在Activity和Service中都有Handler / Messenger,来回沟通应该是微不足道的。请注意,如果将Handler放在后台Thread中,则可能需要在Thread的构造函数中调用Looper.prepare()。