当前位置: 首页 > 面试题库 >

如何通过PendingIntent将自定义的Serializable对象传递给BroadcastReceiver

漆雕硕
2023-03-14
问题内容

我试图使用PendingIntent将自定义的序列化对象从我的IntentService传递到BroadcastReceiver。

这是我的自定义对象:

行.java

public class Row implements Serializable {
    private String name;
    private String address;

    public Row(BluetoothDevice device) {
        this.name = device.getName();
        this.address = device.getAddress();
    }
}

这是我的IntentService

MyIntentService.java

public class MyIntentService extends IntentService {

    public MyIntentService() {
        super("MyIntentService");
    }

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

    @Override
    protected void onHandleIntent(Intent workIntent) {
        AlarmManager alarmMgr;
        PendingIntent alarmPendingIntent;
        Intent alarmIntent;
        // The object "RowsList" is passed from my MainActivity and is correctly received by my IntentService.
        // NO PROBLEMS HERE
        Row[] arrRows = (Row[])workIntent.getSerializableExtra("RowsList");

        Log.i(TAG, "Inside Intent Service...");

        int interval = 2;
        try{
            if(interval != 0) {
                alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
                alarmIntent = new Intent(this, AlarmReceiver.class);
                alarmIntent.putExtra("IntentReason", "Reason"); // THIS GETS PASSED
                alarmIntent.putExtra("RowsList", arrRows); // THIS DOES NOT GET PASSED
                alarmPendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);

                alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + (interval * 1000), alarmPendingIntent);
                }
        }
        catch (Exception ignored){}
    }
}

MainActivity.java

// NO PROBLEMS HERE
private Intent myIntent;
myIntent = new Intent(getApplicationContext(), MyIntentService.class);
Log.i(TAG, "Starting Intent Service...");

myIntent.putExtra("RowsList", arrRows);
getApplicationContext().startService(intentListenBT);

这是我的BroadcastReceiver:

AlarmReceiver.java

public class AlarmReceiver extends BroadcastReceiver {

    Row[] arrRows;

    @Override
    public void onReceive(Context context, Intent intent) {
        this.context = context;
        String str = intent.getStringExtra("IntentReason"); // RECEIVED AS "Reason"
        arrRows = (Row[])intent.getSerializableExtra("RowsList"); // HERE IT IS null
    }
}

最烦人的部分是该代码以前在我的Nexus 6P(Lollipop 6.0 API23)上运行。一旦我将同一部手机更新为Android
7.0(牛轧糖),它便停止工作。在牛轧糖中是否有任何导致此问题的变化?

注意:

我在具有API 23的Nexus 6P上使用模拟器运行了代码,并且运行良好。


问题答案:

您很可能会遇到与自定义Parcelable实现相同的问题。从该博客文章中解释一下自己:基本上,如果核心OS进程需要修改Intent附加组件,则该过程最终会尝试重新创建Serializable对象,这是设置附加组件Bundle进行修改的一部分。该进程没有您的类,因此它获得了运行时异常

最烦人的部分是该代码以前在我的Nexus 6P(Lollipop 6.0 API23)上运行。

行为会因Android版本,使用方式PendingIntent(以及固件/ ROM)而异。不要以为您当前的实现在任何Android版本上都是可靠的。

您唯一的选择是不要Serializable直接放入Intent多余的东西。使用除Serializable(例如,嵌套的Bundle)以外的其他东西,将转换Serializablebyte[],等等。

示例应用程序演示了应用于Parcelable对象的后一种方法。在相同的基本技术应该适用Serializable。(在注释中指向AyeVeeKay的技巧提示)。



 类似资料:
  • 问题内容: 我想知道是否有可能使用jQuery AJAX函数将数组传递给php函数。我有以下作为我的JavaScript 当我尝试执行以下操作时 我在PHP中将其作为“数组”接收。如何正确发送对象,以便PHP函数可以使用它? 问题答案: 从第二个ajax中,您可以根据属性名称访问数据,例如: 是在php中以关联数组转换的js对象

  • 问题内容: 我正在尝试将自己的自定义对象传递到包中: 我得到错误: 问题答案: 一种方法是让您的自定义对象实现Parcelable接口并使用

  • 我是一个相当新的反应,这是一个我正在努力解决的问题。

  • 我使用的是spring ldap和spring boot starter安全性的组合。我已经配置了基本的设置,但仍在传递用户名和密码以进行身份验证。它总是试图验证应用程序中指定的默认凭据。财产。不管怎样,通过传递登录表单中给出的信誉,是否可以正确地做到这一点。 @覆盖受保护的无效配置(AuthenticationManagerBuilder auth)引发异常{ }

  • 我还在研究spring batch,遇到了一个需要将jobParameter传递给定制bean的场景。作业参数包含文件的路径。 这已经包含在读取器的步骤范围中,这里没有包含。 问题是。当类被实例化时,传递给bean的值是“file:#{jobparameters['path'}/filename”,而不是调用作业时传递的jobParameter的值。这让我很困惑,因为我在multiResource

  • 我在示例中看到如何将消息字符串传递给亚马逊 sns sdk 的发布方法。但是,是否有如何将自定义对象作为消息传递的示例?我尝试将“消息结构”设置为“json”,但随后我得到错误。我应该将对象值传递到参数中的哪个位置? 有什么例子吗?