【问题标题】:IntentFilter cannot receive Serializable but works for StringIntentFilter 无法接收 Serializable 但适用于 String
【发布时间】:2013-06-15 21:29:21
【问题描述】:

我有一个像这样的 Serializable:

public class Main implements Serializable {

    private static final long serialVersionUID = 5053412967314724078L; 
    private ArrayList<Carte> main = new ArrayList<Carte>();


    public Main() {}
    public Main(Carte[] cartes) {
        for (Carte carte:cartes) {
            this.main.add(carte);
        }
    }
    public Carte[] getMain() {
        return (Carte[]) main.toArray();
    }

    public String toString() {
        String result = "";
        for (Carte carte : main) {
            result += carte.toString() + " ";
        }
        return result;
    }
}

我将可序列化作为额外的意图发送:

Carte[] cards = ...// Which is initialized elsewhere and been checked, there's no problem with that.
Main mainSerial = new Main(cards);
Intent broadcast = new Intent();
broadcast.setAction("coinchutc.RECUP");
broadcast.putExtra("cards", mainSerial);
Log.d("JoueurAgent", "Sending broadcast " + broadcast.getAction() + " " + mainSerial.toString());
context.sendBroadcast(broadcast);

在Log中我可以正确打印出调试信息,也就是说我已经成功构造了serializable。

然后我尝试接收意图但没有成功:

在我已经完成的目标 Activity 的 onCreate() 中:

IntentFilter recupFilter = new IntentFilter();
recupFilter.addAction("coinchutc.RECUP");
registerReceiver(myReceiver, recupFilter);

我创建了 BroadcastReceiver 类来接收广播:

private class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("RejoindrePartieActivity", "receive");
        String action = intent.getAction();
        Log.d("RejoindrePartieActivity", "Receive action " + action);
        if (action.equalsIgnoreCase("coinchutc.RECUP")) {
            Log.d("RejoindrePartieActivity", "RECUP");
            Bundle extras = intent.getExtras();
            if (extras != null) {
                Main main = (Main) extras.getSerializable("cards");
                //String recup = extras.getString("cards");
                Log.d("RejoindrePartieActivity", "Receive " + main.toString());
            }
        }
    }

但它什么也没收到。连第一个 Log 也没有打印出来。

然后我将可序列化更改为一个简单的字符串。这一切都奏效了! 所以我想知道我是否获得了可序列化的权利,为什么意图过滤器甚至无法接收意图。

提前致谢!

【问题讨论】:

    标签: android android-intent intentfilter serializable


    【解决方案1】:
    IntentFilter recupFilter = new IntentFilter();
    recupFilter.addAction("coinchutc.RECUP");
    registerReceiver(myReceiver, recupFilter);
    

    以上代码必须在sendBroadcast()之前调用。在发送 Intent 之前调用它。


    经过 SO- 的一些澄清后-

    Carte class also needs to be `Serializable` and this does work. 
    

    【讨论】:

    • 对不起,我犯了一个错误,我已经在Activity的onCreate中完成了注册,所以它已经在sendBroadcast()之前被调用了。此外,字符串消息可以成功到达。
    • Main mainSerial = new Main(main); 为什么以及你在构造函数中传递什么?这在代码中没有定义?
    • 哦,谢谢你的评论,我忘记贴了。无论如何,这并不重要。我已经可以打印出构造的可序列化对象了
    • 如果 Carte 是你的类,那么也序列化该类。
    • 对不起,我想知道更多细节。我应该在哪里序列化 Carte?
    猜你喜欢
    • 2020-05-08
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 2014-09-20
    相关资源
    最近更新 更多