Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通知活动类来自服务或线程类的操作_Android_Android Service_Android Handler - Fatal编程技术网

Android 通知活动类来自服务或线程类的操作

Android 通知活动类来自服务或线程类的操作,android,android-service,android-handler,Android,Android Service,Android Handler,从我的服务类,我开始一个线程。如果线程类执行了任何操作,那么通知活动的最佳方式是什么?我想通知我的活动课,线程已经采取了一些操作。问题将从下面的代码中明确 MyService类onCreate()方法 我的下载线程 public void run() { while (!isStopRequested) { if (isSessionActive && downloadNow) { downloadNow = f

从我的服务类,我开始一个线程。如果线程类执行了任何操作,那么通知活动的最佳方式是什么?我想通知我的活动课,线程已经采取了一些操作。问题将从下面的代码中明确

MyService类onCreate()方法

我的下载线程

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为真时,请不要详细说明。我只需要如何通知我的活动下载已开始,下载已完成。有些事情需要处理。有人能告诉我处理这种情况的最佳方法吗。

我建议您在后台服务中使用
startActivity
。以最简单的形式,你可以

String theEvent = "downloadStarted";
Intent intentForActivity = new Intent(this, MyActivity.class);
intentForActivity.putExtra(THE_EVENT, theEvent);
startActivity(intentForActivity)
如果您的活动已经在运行(如您所述),那么入口点将是
onNewIntent
,您可以在那里拉出
事件
,并逐个处理

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

一个
处理程序
只允许您在不完全阻塞线程的情况下为以后排队。在您的情况下,如果您正在谈论大量的并发下载,这可能会有所帮助,但不必开始使用。

首先,您不需要启动服务并绑定到它。一个或另一个就足够了


在这种情况下,我建议绑定到服务,因为这样您就有机会通过处理程序和信使建立通信。您可以使用ServiceConnection类的onServiceConnected方法获取服务中定义的Messenger。有关如何执行此操作的示例,请参见“创建绑定服务”下的。在他们的示例中,它们返回对服务实例的引用,但您应该将其替换为对Messenger或处理程序的引用。一旦在活动和服务中都有了一个处理程序/信使,来回通信就不那么重要了。请注意,如果在后台线程中放置处理程序,则可能需要在线程的构造函数中调用Looper.prepare()。

启动服务时是否有意图或绑定到它?(你应该绑定。)我通过意图从应用程序类启动服务,并将服务绑定到我的活动,我称之为MainActivity。我不确定最佳解决方案,但你可以使用处理程序。是的,我知道,我甚至在我的问题中添加了这一点。但是如何在我的服务和/或服务类中使用该处理程序来通知我有关事件的活动请检查此示例以获取答案,但我已经启动了我的应用程序。我的活动处于运行模式。我可以这样说,假设在那个活动中,当我点击一个按钮时,它检查了一些条件,然后从服务开始下载线程。因此,当下载开始时,我想通知我的活动下载已开始,当下载完成时,我会相应地通知。不要被名称所愚弄:它被称为
startActivity
,但它的功能是向正在运行的活动发送消息。然后,活动将执行一个名为
onNewIntent
的函数,而不是
onCreate
。明白了。但我仍然不理解将意图发送到硬编码的活动名称,因为我可能还需要将相同的内容用于其他目的。处理程序是专门用来接电话的东西。因此,最好使用专门用于特定目的的东西。如果工作正常,仍然会用这种方法进行测试。是的,为了更通用,您可以使用
sendBroadcast
而不是
startActivity
,并为您的活动实现一个
BroadcastReceiver
。这将使用一个
IntentFilter
来挑选广播,例如,带有特定动作或类别的广播。Hey thanx是答案。任何演示或代码片段都会很有帮助,可以演示工作。嘿,我看到了你的代码,但我想这个方法会从我的服务类返回消息,但我需要服务实例,因为还有其他几个过程是通过服务完成的。有没有一种方法可以让我们在我的活动类中同时获取实例在文档示例中,它获取服务的一个实例。您可以在服务中定义方法以获取所需的任何内容。在我看来,您只需要与线程通信,所以我建议只需设置与处理程序或信使的通信。
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 
    }
}