在Service中第二次运行startActivity后,我的应用程序开始崩溃,出现Exceptions,Sigbus或Sigsegv错误

时间:2014-08-04 19:57:41

标签: android android-intent sigsegv illegalargumentexception sigbus

我正在开发一个应用程序,并且在理解或找到我遇到的错误的原因方面存在非常大的问题。完整代码可在Github上找到:https://github.com/lordgreg/Sfen。有问题的行总是在第608行(https://github.com/lordgreg/Sfen/blob/master/app/src/main/java/gpapez/sfen/BackgroundService.java

周围的startActivity(intent)

以下是我重现错误的方法:

  • 创建新的个人资料,可以有"动作"它创建了新的Shortcut(小部件) - 它实际上将Intent保存为Gson字符串(由于Uri,我必须使用(de)序列化)。
  • 我可以根据需要多次运行此配置文件(点击它只是运行所有操作),意图将毫无问题地运行。
  • 现在,有"事件"在特殊条件下触发,除了运行特定的配置文件之外不做任何其他操作(与再次点击配置文件相同)。这很有效。事件的条件得到满足,我发送广播EVENT_ENABLED,接收器获取它,它启动我们的功能,触发配置文件,运行动作和sendActivity工作与从Gson获得的意图。它的完美。
  • 问题来了,当我关闭应用程序并重新打开它时。
  • 然后,接收器向我发送信号以重新运行事件(当我点击它时它起作用并且如果我手动点击该配置文件则工作)。

这是一个错误示例:

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))!这是我唯一可以表达我对帮助我的感激之情!

谢谢!

1 个答案:

答案 0 :(得分:0)

我会回答我自己的问题,因为我终于找到了崩溃的原因。

  1. 如上所述,在保存配置文件操作时,在我们的案例中,快捷方式,我必须保存快捷方式。由于Gson抱怨Uri(java.lang.RuntimeException:无法调用没有args的私有android.net.Uri()),你必须创建自己的Serializer和Deserializer类并将它们传递给Gson对象。
  2. 之后,您最终可以使用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)