将意图从服务发送到活动

Posted

技术标签:

【中文标题】将意图从服务发送到活动【英文标题】:send intent from service to activity 【发布时间】:2012-10-11 10:31:09 【问题描述】:

我正在尝试使用意图将结果从 IntentSerivce 返回到 mainactivity,但我无法让它工作。 IntentService 毫无问题地从活动接收到意图,完成它并获得JSONstring。现在剩下的唯一问题就是将此字符串发送回活动。

这是mainactivity中的方法:

public String RTConn(String query)
    System.out.println("Querying Rotten Tomatoes.");
    Intent rtIntent = new Intent(MainActivity.this, RTConnection.class);
    rtIntent.putExtra("query", query);
    bindService(rtIntent, RTConnection, Context.BIND_AUTO_CREATE);
    startService(rtIntent);
    String json = getIntent().getStringExtra("json");
    return json;

这里是 IntentService:

public void onStart(Intent intent, int startId)
    System.out.println("intent Received");
    String jsonString = rottenTomatoesSearch(intent.getStringExtra("query"));
    Intent RTRetur = new Intent(RTConnection.this, MainActivity.class);
    RTRetur.putExtra("json", jsonString);
    startActivity(RTRetur);

显然 startActivity 不起作用,但还有什么可以使用的? (我宁愿不使用广播接收器)。 问候彼得 L。

更新

这是 MainActivity 的外观:

public static final String RECEIVE_JSON = "student.kau.RECEIVE_JSON";
private BroadcastReceiver RTReceiver = new BroadcastReceiver() 
    @Override
    public void onReceive(Context context, Intent intent) 
        System.out.println("broadcast Received: "+intent.getAction());
        if(intent.getAction().equals(RECEIVE_JSON))
            System.out.println("JSON Received.");
            String serviceJsonString = intent.getStringExtra("json");
        
    
;

这段代码是onCreate:

LocalBroadcastManager bManager = LocalBroadcastManager.getInstance(this);
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(RECEIVE_JSON);
    bManager.registerReceiver(RTReceiver, intentFilter);

这是方法:

public void onStart(Intent intent, int startId)
    System.out.println("intent Received");
    String query = intent.getStringExtra("query");
    String jsonString = rottenTomatoesSearch(query);
    System.out.println("Fetching done");
    Intent RTRetur = new Intent(MainActivity.RECEIVE_JSON);
    System.out.println("action: "+RTRetur.getAction());
    RTRetur.putExtra("json", jsonString);
    sendBroadcast(RTRetur);


logcat 中的最后一个跟踪是System.out.println("action: "+RTRetur.getAction()");

-action: 

    student.kau.RECEIVE_JSON

【问题讨论】:

【参考方案1】:

为此,您可以在Activity 中使用BroadcastReceiver

Here is a great example I use 在Service 之间持续通信 Activity 使用BroadcastReceivers

Here is another great exampleServiceActivity之间的通信。它使用MessengerIncomingHandler

广播接收器

我会为你的情况做一个简单的例子。

这是您的 Activity 的 BroadcastReceiver。它将收到您的字符串:

//Your activity will respond to this action String
public static final String RECEIVE_JSON = "com.your.package.RECEIVE_JSON";

private BroadcastReceiver bReceiver = new BroadcastReceiver() 
    @Override
    public void onReceive(Context context, Intent intent) 
        if(intent.getAction().equals(RECEIVE_JSON)) 
            String serviceJsonString = intent.getStringExtra("json");
            //Do something with the string
        
    
;
LocalBroadcastManager bManager;

在您的onCreate() 活动中

bManager = LocalBroadcastManager.getInstance(this);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(RECEIVE_JSON);
bManager.registerReceiver(bReceiver, intentFilter);

在活动的onDestroy() 中,确保取消注册广播接收器。

bManager.unregisterReceiver(bReceiver);

最后,在您的Service onStart() 中,执行以下操作:

System.out.println("intent Received");
String jsonString = rottenTomatoesSearch(intent.getStringExtra("query"));
Intent RTReturn = new Intent(YourActivity.RECEIVE_JSON);
RTReturn.putExtra("json", jsonString);
LocalBroadcastManager.getInstance(this).sendBroadcast(RTReturn);

您的 Activity 将额外收到带有该 json 的 Intent

【讨论】:

感谢您的快速回答,但是当您只想将字符串从服务发送到预先指定的活动时,使用广播接收器真的是“最佳实践”吗? 当然,这不是唯一的方法,我不知道这是否是最佳实践,但它很容易设置。我会给你一些其他的 Service Acitivty 之间通信的例子 “private broadcastReceiver breceiver = new BroadcastManager()”这行不行,不应该是“private BroadcastReceiver breceiver = new BroadcastReceiver()”吗? 很高兴知道我当时并没有完全迷失。糟糕的是,我仍然无法让我的接收器接收任何广播.. :( 我更新了我的代码。 intentFilter 构造函数可能存在问题。立即尝试

以上是关于将意图从服务发送到活动的主要内容,如果未能解决你的问题,请参考以下文章

将数据从通知发送到活动类而不重新启动意图

如何将意图发送到正在运行的服务或后台活动?

将意图从工作人员发送到单独应用程序中的活动

如何使用意图将哈希图值发送到另一个活动

如何通过意图将数据从静态方法发送到另一个类?

将 listView 数据从一个活动发送到另一个活动