onReceive Android不止一次运行

时间:2016-01-10 13:06:27

标签: java android android-intent

所以我有一个名为TreeActivity()的活动,我在服务中询问一个对象。然后我在名为TreeReceptor()的私有类中得到响应,该类只有这个函数:

public void onReceive(final Context context, final Intent intent) {
    if (intent.getAction().equals(TreeReceptor.tree)) {
        CustomSerializable root;
        root = (CustomSerializable) intent.getSerializableExtra("tree");
        GenerationTree treeGen = new GenerationTree(root);
        treeGen.run();
    }
}

GenerationTree类就是这个:

private class ReportGeneration extends Thread {
    private CustomSerializable root;
    public ReportGeneration(CustomSerializable root) {
        this.root = root;
    }
    public final void run() {
        System.out.println(root.getName());
    }

}

在我的Activity中,我有一个按钮,将动作发送到服务,然后服务发送CustomSerializable对象。我正确地收到了所有内容,唯一的问题是onReceive函数被多次执行。 例如:如果是我第一次点击按钮,它就不会做任何事情。如果它第二次执行onReceive函数两次,如果它第三次执行它三次,依此类推......

这是我第一次使用Android应用而且我很丢失,任何想法可能是什么?我发现了一些其他问题,说对于某些特定设备,它不止一次执行该功能,所以仅仅为了一些信息,我在Nexus 5 API23 x86 Andriod 6.0

模拟我的项目

3 个答案:

答案 0 :(得分:0)

public void onReceive(final Context context, final Intent intent) {
    if (intent.getAction().equals(Tree.tree)) {
        CustomSerializable tree;
        **final root =(CustomSerializable)intent.getSerializableExtra("tree");**
        GenerationTree treeGen = new GenerationTree(root);
        treeGen.run();
    }
}

root对象使其成为最终对象。

抱歉英语。

答案 1 :(得分:0)

我发现了问题,就是我为每次点击创建了一个受体。现在我只创建了一个接收器,当我已经收到对象时,我确保将它从接收器列表中取出。要做到这一点,我使用这一行:unregisterReceiver(receptor);

编辑:但是找不到问题为什么我第一次点击它没有做任何事情。

答案 2 :(得分:0)

确保在onResume或onCreate方法中注册您的受体,并分别在onPause或onStop方法中取消注册。 不要在点击按钮时执行此操作。
你可以在这里看到教程

http://www.vogella.com/tutorials/AndroidBroadcastReceiver/article.html#dynamicreceiverregistration