我试图使用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
)以外的其他东西,将转换Serializable
为byte[]
,等等。
该示例应用程序演示了应用于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”,但随后我得到错误。我应该将对象值传递到参数中的哪个位置? 有什么例子吗?