每次在三星设备上更新应用程序时,小部件都会消失

Posted

技术标签:

【中文标题】每次在三星设备上更新应用程序时,小部件都会消失【英文标题】:Widget disappearing every time the app is updated on Samsung devices 【发布时间】:2014-06-06 21:50:31 【问题描述】:

我的应用中有 2 个小部件。两者都具有完全相同的功能,但布局不同。 它们在每台设备上都能正常工作,但三星设备上似乎存在问题。每次我发布应用程序的新版本时,小部件都会从用户屏幕中删除。看起来这是一个三星 TouchWiz 错误,但用户告诉我其他应用程序没有这个问题。 知道发生了什么吗?

顺便说一句,我想了一会儿,我在这篇博文中找到了解决它的方法:https://medium.com/the-wtf-files/the-mysterious-case-of-the-disappearing-widget-f4177a8e2c2b 但我没有手动调用

updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);

相反,我正在打电话

ComponentName cn = new ComponentName(context, clazz); AppWidgetManager.getInstance(context).updateAppWidget(cn, views);

为了更新我的小部件

我的更多代码:

    public static final int layout = R.layout.widget_large_layout;
    public static final BitmapQualityEnum thumbnailQuality = BitmapQualityEnum.HIGH_RES;
    public static final Class<?> clazz = LargeWidgetProvider.class;

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
        if (context != null && appWidgetIds != null && appWidgetIds.length > 0) 
            // To prevent any ANR timeouts, we perform the update in a service
            context.startService( new Intent(context, LargeWidgetProvider.UpdateService.class));
        
    


    @Override
    public void onReceive(Context context, Intent intent) 
        if (context != null && intent != null) 
            boolean doUpdate = true;
            if ("android.appwidget.action.APPWIDGET_UPDATE".equals(intent.getAction())) 
                final int[] widgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
                doUpdate = (widgetIds != null && widgetIds.length > 0);
            

            if (doUpdate) 
                WidgetProviderHelper.receive(context, intent, clazz, layout, thumbnailQuality);
            
            super.onReceive(context, intent);
        
    

public static class UpdateService extends Service 

        private int serviceStartId = -1;

        @Override
        public boolean onUnbind(Intent intent) 
            stopSelf(this.serviceStartId);
            return true;
        

        @Override
        public int onStartCommand(Intent intent, int flags, int startId) 
            this.serviceStartId = startId;
            // Push update for this widget to the home screen
            updateData(this);
            return START_STICKY;
        

        @Override
        public void onConfigurationChanged(Configuration newConfig) 
            super.onConfigurationChanged(newConfig);
            //          int oldOrientation = this.getResources().getConfiguration().orientation;
            //          if (newConfig.orientation != oldOrientation) 
            // Update the widget) 
            updateData(this);
            //          
        


        @Override
        public IBinder onBind(Intent intent) 
            // We don't need to bind to this service
            return null;
        
    

【问题讨论】:

我也遇到了三星设备上消失的小部件(和图标)的问题,结果以编程方式启用/禁用我的应用程序中的组件(与小部件本身无关的组件)搞砸了 TouchWiz。如果您发布更多小部件代码(例如 onReceive/onUpdate,我可以检查它是否存在潜在问题。 我经常听到“你的应用程序有这个问题,但其他应用程序没有”的说法。反驳的理由可能是“我的数十万用户中有 99.9% 没有这个问题,那么你的设备出了什么问题?” ;-)。如果假设 200 个应用程序中有一个存在问题 (0.5%),而 100,000 个安装中有 5 个设备存在该问题 (0.005%),那么显然该设备存在问题的可能性高于应用程序存在问题.当然,真相通常介于两者之间,通常是多种因素的组合)。 @Emanuel Moecklin 是否只有少数用户遇到问题并不重要。是的,也许有 20 个用户报告了 500K+ 的问题,但他们都有一个共同的三星设备。此外,大多数用户没有使用应用程序小部件,并且大多数用户不会抱怨可能遇到的问题。所以是的,我想解决这个问题;) 也可以在这里查看我的回答:***.com/a/49136980/550393 【参考方案1】:

我终于设法解决了我的问题。 需要导出小部件提供者接收器!!

    <receiver
        android:name=".widget.HorizontalWidgetProvider"
        android:exported="true" >
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            <action android:name="com.customEvent" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/widget_horizontal_provider" />
    </receiver>

【讨论】:

根据developer.android.com/guide/topics/manifest/…,如果接收者有意图过滤器,导出的标志应该自动设置为 true,所以我猜这是另一个 TouchWiz 错误。

以上是关于每次在三星设备上更新应用程序时,小部件都会消失的主要内容,如果未能解决你的问题,请参考以下文章

应用更新后小部件消失了

重启或升级应用程序后,我的 Android 小部件停止更新

多个 Android Widget 实例仅更新最后一个小部件

如何在通知中心频繁更新今日小部件?

在哪里只更新一次通知小部件的 UI

解决 三星Note3 桌面小部件不实时更新/不刷新 的问题