- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在跟踪器上添加链接问题: https://code.google.com/p/android/issues/detail?id=216581&thanks=216581&ts=1468962325
所以我今天在我的 Nexus 5X 上安装了 DP5 Android 7.0 版本。我一直在开发一个使用 Android 的 AlarmManager 类在特定时间安排本地通知的应用程序。在此版本之前,代码在运行 KitKat、Lollipop 和 Marshmallow 的设备上运行良好。
以下是我如何安排警报:
Intent intent = new Intent(context, AlarmManagerUtil.class);
intent.setAction(AlarmManagerUtil.SET_NOTIFICATION_INTENT);
intent.putExtra(AlarmManagerUtil.REMINDER_EXTRA, Parcels.wrap(reminders));
intent.putExtra("time", when.getMillis());
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
if (alarmManager != null) {
if (Build.VERSION.SDK_INT >= 23) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, when.getMillis(), pendingIntent);
} else if (Build.VERSION.SDK_INT >= 19) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, when.getMillis(), pendingIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, when.getMillis(), pendingIntent);
}
我的“SET_NOTIFICATION_INTENT”的 AlarmManagerUtil @onReceive 看起来像这样:
public void fireNotification(Context context, Intent intent) {
List<Reminder> reminderToFire = Parcels.unwrap(intent.getParcelableExtra(REMINDER_EXTRA));
long timeToFire = intent.getLongExtra("time", 0L); //.... }
奇怪的是“reminderToFire”在这里仅在 Android N 设备上为空,但 timeToFire 是正确的。
我认为它与 Parceler 库有关?我正在使用 Java 1.8 进行编译并以 Android API 24 为目标。
我确实在网上四处寻找这个问题的答案,但我的情况有点独特,因为代码 100% 适用于所有先前版本的 Android(N 预览版以下的所有内容)...所以我正在关注尽我所能回答以下问题:
How can I correctly pass unique extras to a pending intent?
还有其他人有这个问题吗?
最佳答案
对于任何最终在 AlarmManager 上大发雷霆(还没有放弃并转向 JobScheduler)的人来说,Google 在生产 API 24 构建中不支持将 Parcelable 对象传递到 AlarmManager。
我解决这个问题的方式:如果您需要将列表(或单个对象)发送到 AlarmManager,请将该项目作为字符串存储到 SharedPreferences 中。 (Gson.toJson(object, type)) 如果对象是一个接口(interface),那么有很多接口(interface)适配器解决方案。我发现一个漂浮在 S/O 周围:
public final class InterfaceAdapter<T> implements JsonSerializer<T>, JsonDeserializer<T> {
public JsonElement serialize(T object, Type interfaceType, JsonSerializationContext context) {
final JsonObject wrapper = new JsonObject();
wrapper.addProperty("type", object.getClass().getName());
wrapper.add("data", context.serialize(object));
return wrapper;
}
public T deserialize(JsonElement elem, Type interfaceType, JsonDeserializationContext context) throws JsonParseException {
final JsonObject wrapper = (JsonObject) elem;
final JsonElement typeName = get(wrapper, "type");
final JsonElement data = get(wrapper, "data");
final Type actualType = typeForName(typeName);
return context.deserialize(data, actualType);
}
private Type typeForName(final JsonElement typeElem) {
try {
return Class.forName(typeElem.getAsString());
} catch (ClassNotFoundException e) {
throw new JsonParseException(e);
}
}
private JsonElement get(final JsonObject wrapper, String memberName) {
final JsonElement elem = wrapper.get(memberName);
if (elem == null)
throw new JsonParseException("no '" + memberName + "' member found in what was expected to be an interface wrapper");
return elem;
}
}
设置好适配器后,如果您正在使用某种 DI 框架(即 Dagger2),则无需每次都使用 TypeAdapter 设置 GS0N...
@Singleton
@Provides
public Gson providesGson() {
return new GsonBuilder()
.registerTypeAdapter(YourInterfaceClass.class, new InterfaceAdapter<YourInterfaceClass>())
.create();
所以你所要做的就是运行......
/**
* stores yourInterfaceClass in shared prefs
*/
public void setNextReminder(List<YourInterfaceClass> yourInterfaceClass) {
Type type = new TypeToken<List<YourInterfaceClass>>() {}.getType();
sharedPrefs.edit().putString(YOUR_KEY, gson.toJson(yourInterfaceClass, type)).apply();
}
希望这对您有所帮助。当然,当您需要从共享首选项中获取此对象时......
String json = sharedPrefs.getString(YOUR_KEY, "No object found");
执行典型的 List object = gson.fromJson(json, type) 应该可行。
干杯。
关于android - DP5 7.0 - 向未决 Intent 添加额外内容会失败吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38466080/
我知道未决 Intent 的概念,但标志令人困惑。 连android文档都很难看懂 有人可以通过示例提供未决 Intent 标志的解释,特别是 FLAG_ONE_SHOT 和 FLAG_NO_CREA
试图显示来自 json 的数据。 当我在控制台上运行我的函数时,它显示: Promise {} 和 [[PromiseState]]:“已完成” 但实际上并没有返回任何东西。 getJobs = as
我的代码是这样的,点击按钮我执行 Calendar calendar = Calendar.getInstance(); calendar.setTimeInMil
function f () { return new Promise(function (resolve, reject) { resolve(4); }) } fun
我有两个 Activity A 和 B。A 在应用程序启动时启动。我有一个从 A 启动的服务。 这是我在 Activity A 中的代码。 Button btnStart = (Button) fin
我正在开发一个应用程序,我想在其中设置自定义闹钟。但是在设置闹钟时间后没有任何反应。我正在分享我的代码。如果我的代码中缺少某些内容,请帮助和指导我。 在我的 MainActivity.java 中
我正在使用 fetch 来获取数据,但它一直将 promise 返回为待处理。我看过很多关于这个问题的帖子,并尝试了所有的可能性,但没有解决我的问题。我想知道为什么 fetch 简要地返回 promi
你好,我有以下在我的应用程序中显示通知的功能,但是我突然开始遇到一个问题,当我单击通知时它不会将我带到我在 .setContentIntent() 中指定的 Activity ,这是我的代码: @Ta
我正在创建一个数据处理程序,作为该过程的一部分,我需要下载一个文件,然后作为处理程序的一部分进行解析和使用。 我将对文件的请求包装在一个 promise 中,并从其他方法异步调用该方法 我已经包含了来
我想做的是通过intent传递数据, >创建者 intent = new Intent(this, AlarmReceiverActivity.class); intent.putExtra("id"
我正在使用 PingService.java 的代码 https://github.com/android/platform_development/blob/master/samples/train
我需要在用户靠近给定地点时通知他。我为此使用地理围栏 API。当我使用模拟位置在 Android 模拟器上测试应用程序时,一切正常。与模拟位置的真实设备相同。但是当我走路并且我的手机处于深度 slee
我有一个显示随机数的简单小部件。点击时它会刷新并显示另一个随机数。这是 AppWidgetProvider 的 onUpdate 方法的代码 public void onUpdate(Context
PendingIntent 中的一个新 PendingIntent 字段是 FLAG_IMMUTABLE。 在31中,必须指定MUTABLE或IMMUTABLE,否则不能创建PendingIntent
我是一名优秀的程序员,十分优秀!