Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 每次在三星设备上更新应用程序时,小部件都会消失_Android_Widget_Samsung Touchwiz - Fatal编程技术网

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

Android 每次在三星设备上更新应用程序时,小部件都会消失,android,widget,samsung-touchwiz,Android,Widget,Samsung Touchwiz,我的应用程序中有两个小部件。两者具有完全相同的功能,但布局不同。 它们在每台设备上都能正常工作,但三星设备上似乎存在问题。每次我发布新版本的应用程序时,小部件都会从用户屏幕上删除。这看起来像是三星TouchWiz的bug,但用户告诉我其他应用程序没有这个问题。 知道发生了什么吗 顺便说一句,我想了一会儿,我在这篇博文中找到了一种解决方法: 但我不是手动打电话 updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 相反

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

顺便说一句,我想了一会儿,我在这篇博文中找到了一种解决方法: 但我不是手动打电话

updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
相反,我在打电话

ComponentName cn=新的ComponentName(上下文,clazz); AppWidgetManager.getInstance(context).updateAppWidgetManager(cn,视图)

为了更新我的小部件

更多我的代码:

    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;
        }
    }
public static final int layout=R.layout.widget\u large\u layout;
公共静态最终BitmapQualityEnum thumbnailQuality=BitmapQualityEnum.HIGH_RES;
公共静态最终类clazz=LargeWidgetProvider.Class;
@凌驾
公共void onUpdate(上下文上下文,AppWidgetManager AppWidgetManager,int[]AppWidgetId){
if(context!=null&&appWidgetIds!=null&&appWidgetIds.length>0){
//为了防止任何ANR超时,我们在服务中执行更新
startService(新意图(context,LargeWidgetProvider.UpdateService.class));
}
}
@凌驾
公共void onReceive(上下文、意图){
if(上下文!=null&&intent!=null){
布尔值doUpdate=true;
if(“android.appwidget.action.appwidget_UPDATE”.equals(intent.getAction())){
final int[]widgetIds=intent.getIntArrayExtra(AppWidgetManager.EXTRA\u APPWIDGET\u id);
doUpdate=(widgetIds!=null&&widgetIds.length>0);
}
如果(更新){
接收(上下文、意图、分类、布局、缩略图质量);
}
super.onReceive(上下文、意图);
}
}
公共静态类UpdateService扩展服务{
私有int-serviceStartId=-1;
@凌驾
公共布尔onUnbind(意图){
stopSelf(this.serviceStartId);
返回true;
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
this.serviceStartId=startId;
//将此小部件的更新推送到主屏幕
更新数据(本);
返回开始时间;
}
@凌驾
公共无效OnConfiguration已更改(配置newConfig){
super.onConfigurationChanged(newConfig);
//int oldOrientation=this.getResources().getConfiguration().orientation;
//if(newConfig.orientation!=oldOrientation){
//更新小部件){
更新数据(本);
//          }
}
@凌驾
公共IBinder onBind(意向){
//我们不需要绑定到此服务
返回null;
}
}

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

    <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>


我在三星设备上也遇到了小部件(和图标)消失的问题,结果是以编程方式启用/禁用我的应用程序中的组件(与小部件本身无关的组件)打乱了TouchWiz。如果你发布更多的小部件代码(如onReceive/onUpdate),我可以检查它是否存在潜在问题。我明白这个论点“你的应用程序有这个问题,但其他应用程序没有”很多。相反的论点可能是“我的十万用户中99.9%没有这个问题,那么你的设备有什么问题?”;-)。如果200个应用程序中有一个有问题(0.5%),而10万个安装中有5个有这个问题(0.005%)显然,设备出现问题的可能性要高于应用程序出现问题的可能性。当然,事实通常介于两者之间,而且通常是多种因素的综合。@Emanuel Moecklin只有少数用户出现问题并不重要。是的,在500K+中,可能有20个用户报告了问题,但他们都有samsung设备的共同点。此外,大多数用户没有使用应用程序小部件,大多数用户也没有抱怨他们可能存在的问题。因此,是的,我想解决这个问题;)这里也可以看到我的答案:根据这一点,如果接收者有意图过滤器,则导出的标志应自动设置为true,因此我猜这是另一个TouchWiz错误。