AppWidgetHost 崩溃 android.os.TransactionTooLargeException

3

我正在制作一个自定义的Android启动器。在我添加了一些小部件(三星相册,收藏夹直拨)之后,每次重新启动应用程序时都会崩溃。以下是代码:

public static final int APPWIDGET_HOST_ID = 128;

    public final class Launcher extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        mAppWidgetManager = AppWidgetManager.getInstance(this);
        mAppWidgetHost = new AppWidgetHost(this, APPWIDGET_HOST_ID);
        mAppWidgetHost.startListening(); //Here it crash
        ...
    }
}

这是错误日志:
    java.lang.RuntimeException: Unable to start activity ComponentInfo{custom.launcherpro/custom.launcher.launcher.Launcher}: java.lang.RuntimeException: system server dead?
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
    at android.app.ActivityThread.access$900(ActivityThread.java:161)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:157)
    at android.app.ActivityThread.main(ActivityThread.java:5356)
    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:1265)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
    at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.RuntimeException: system server dead?
    at android.appwidget.AppWidgetHost.startListening(AppWidgetHost.java:166)
    at custom.launcher.launcher.Launcher.onCreate(Launcher.java:181)
    at android.app.Activity.performCreate(Activity.java:5426)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
    ... 11 more
 Caused by: android.os.TransactionTooLargeException
    at android.os.BinderProxy.transact(Native Method)
    at com.android.internal.appwidget.IAppWidgetService$Stub$Proxy.startListening(IAppWidgetService.java:465)
    at android.appwidget.AppWidgetHost.startListening(AppWidgetHost.java:162)

这种情况发生在Android 4.4(甚至在旧版本的Android上也会出现)。

这是什么意思?我该如何防止它发生?

谢谢, Vincenzo

1个回答

1
请参阅文档中的 TransactionTooLargeException。如果您查看 AppWidgetHost 的源代码,您会在跟踪信息中找到这段代码:
ArrayList<RemoteViews> updatedViews = new ArrayList<RemoteViews>();
// ....
updatedIds = sService.startListening(mCallbacks, mPackageName, mHostId, updatedViews);

在这种情况下,updatedViews是一个RemoteViews数组。如果它们包含大量图像,则它们可能会非常大。你是否有一些包含巨大图像的小部件?

是的,你说得对,“Favorite Direct Dial”包含一些图片。那么,我们该如何解决这个问题呢?我认为一个小部件不应该导致启动器崩溃,但即使是原生启动器也没有处理异常的任何操作...(事实上,如果我添加超过2个“Favorite Direct Dial”的实例,它会崩溃)。 - Vlatego
我相信防止这种情况取决于Widget实现者。AppWidgetManager提供了一些部分更新的方法,可以查看一下。 - satur9nine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接