我正在开发一个应用程序,并且在理解或找到我遇到的错误的原因方面存在非常大的问题。完整代码可在Github上找到:https://github.com/lordgreg/Sfen。有问题的行总是在第608行(https://github.com/lordgreg/Sfen/blob/master/app/src/main/java/gpapez/sfen/BackgroundService.java)
周围的startActivity(intent)以下是我重现错误的方法:
这是一个错误示例:
08-04 21:27:50.065 21621-21621/gpapez.sfen E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: gpapez.sfen, PID: 21621
java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.wifi.STATE_CHANGE flg=0x4000010 (has extras) } in gpapez.sfen.Receiver@44b7a678
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:791)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:212)
at android.app.ActivityThread.main(ActivityThread.java:5151)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException
at android.os.Parcel.nativeAppendFrom(Native Method)
at android.os.Parcel.appendFrom(Parcel.java:436)
at android.os.Bundle.writeToParcel(Bundle.java:1679)
at android.os.Parcel.writeBundle(Parcel.java:641)
at android.content.Intent.writeToParcel(Intent.java:7026)
at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2084)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1419)
at android.app.ContextImpl.startActivity(ContextImpl.java:1079)
at android.app.ContextImpl.startActivity(ContextImpl.java:1061)
at android.content.ContextWrapper.startActivity(ContextWrapper.java:311)
at gpapez.sfen.BackgroundService.runProfileActions(BackgroundService.java:647)
at gpapez.sfen.BackgroundService.runEventActions(BackgroundService.java:749)
at gpapez.sfen.BackgroundService.EventFinder(BackgroundService.java:346)
at gpapez.sfen.Receiver.onReceive(Receiver.java:189)
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:781)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:212)
at android.app.ActivityThread.main(ActivityThread.java:5151)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
at dalvik.system.NativeStart.main(Native Method)
或另一个:
08-04 21:38:30.950 22971-22971/gpapez.sfen E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: gpapez.sfen, PID: 22971
java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.wifi.STATE_CHANGE flg=0x4000010 (has extras) } in gpapez.sfen.Receiver@451087f0
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:791)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:212)
at android.app.ActivityThread.main(ActivityThread.java:5151)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException
at android.os.Parcel.nativeAppendFrom(Native Method)
at android.os.Parcel.appendFrom(Parcel.java:436)
at android.os.Bundle.writeToParcel(Bundle.java:1679)
at android.os.Parcel.writeBundle(Parcel.java:641)
at android.content.Intent.writeToParcel(Intent.java:7026)
at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2084)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1419)
at android.app.ContextImpl.startActivity(ContextImpl.java:1079)
at android.app.ContextImpl.startActivity(ContextImpl.java:1061)
at android.content.ContextWrapper.startActivity(ContextWrapper.java:311)
at gpapez.sfen.BackgroundService.runProfileActions(BackgroundService.java:647)
at gpapez.sfen.BackgroundService.runEventActions(BackgroundService.java:749)
at gpapez.sfen.BackgroundService.EventFinder(BackgroundService.java:346)
at gpapez.sfen.Receiver.onReceive(Receiver.java:189)
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:781)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:212)
at android.app.ActivityThread.main(ActivityThread.java:5151)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
at dalvik.system.NativeStart.main(Native Method)
当发生这种情况时,我的应用程序变得无法使用,我必须进入系统设置并清除应用程序本身的数据。之后,我可以重新运行,再次创建配置文件,创建显示配置文件的事件,然后我可以触发运行此代码的快捷操作:
/**
* get Intent from saved setting
*
* http://stackoverflow.com/questions/22533432/create-object-from-gson-string-doesnt-work
*/
class UriDeserializer implements JsonDeserializer<Uri> {
@Override
public Uri deserialize(final JsonElement src, final Type srcType,
final JsonDeserializationContext context) throws JsonParseException {
return Uri.parse(src.getAsString());
}
}
Gson gsonIntent = new GsonBuilder()
.registerTypeAdapter(Uri.class, new UriDeserializer())
.create();
Intent intent = gsonIntent.fromJson(act.getSetting("shortcut_intent"), Intent.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
System.out.println("*** Opening intent\n" + act.getSetting("shortcut_intent"));
startActivity(intent);
错误显示的行
at gpapez.sfen.BackgroundService.runProfileActions(BackgroundService.java:647)
正是:
startActivity(intent);
如果我然后尝试重新打开应用程序,我总是会遇到异常。现在这里是扭曲...等待一段时间后崩溃(+ 1分钟)重新打开应用程序没有问题我可以继续打开所有内容,直到下一次崩溃。
请帮我解释为什么会发生这种情况......我甚至愿意向发现并解决错误的人付费(非法论据异常和错误接收广播意图这两个导致行startActivity(intent))!这是我唯一可以表达我对帮助我的感激之情!
谢谢!
答案 0 :(得分:0)
我会回答我自己的问题,因为我终于找到了崩溃的原因。
之后,您最终可以使用Gson将Intent对象保存到String。它看起来像这样:
{
"mAction": "android.intent.action.VIEW",
"mData": "http://www.amazon.com/",
"mExtras": {
"mParcelledData": {
"mOwnsNativeParcelObject": true,
"mNativePtr": -1197637952
},
"mHasFds": false,
"mFdsKnown": true,
"mAllowFds": true
},
"mFlags": 0
}
在您需要转换为Intent的字符串之后,您可以将其称为:
Intent intent = new Gson().fromJson(act.getSetting(MY_INTENT_STRING, Intent.class);
由于这没有造成任何问题,因此创建了Intent,一切都比预期更好,但是,在设置断点并逐行检查代码2天之后,这里是实际的fromGson()字符串我们得到:
{
"mAction": "android.intent.action.VIEW",
"mData": "http://www.amazon.com/",
"mExtras": {
"mMap": {
"com.android.browser.application_id": "-2531992419148236456"
},
"mHasFds": false,
"mFdsKnown": true,
"mAllowFds": true
},
"mFlags": 0
}
如您所见,即使我们实现了Serializer和Deserializer,也会出现一些差异。
建议?
永远不要使用GSON来保存意图。无论意图如何,您都可以将其存储到字符串中并通过以下方式很好地接收:
// like this to save intent
String mySavedIntent = intent.toUri(Intent.URI_INTENT_SCHEME)
和
// like this to retrieve intent from string
intent = Intent.parseUri(mySavedIntent, Intent.URI_INTENT_SCHEME)