Android - 三星:使用配置活动创建窗口小部件失败

时间:2016-11-20 20:23:06

标签: java android widget samsung-mobile

我构建了一个可以将小部件添加到主屏幕的应用程序。该小部件正在使用我的Nexus 6P和摩托罗拉Moto G3。

使用三星手机(经过S3 mini(4.1.2),S5,S6(6.0.1)测试),根本不添加小部件或TouchWiz崩溃。

使用另一个启动器(Nova),也不会在S3 mini上创建小部件。

在logcat中,我根本没有看到任何错误消息。

我试图尽可能缩小问题范围。 如果我从counter_widget_info.xml中删除android:configure="de.cliff.strichliste.widgets.WidgetConfigurationActivity",则会创建窗口小部件。如果我想使用配置活动,TouchWiz会在Samsung S3 mini上崩溃。

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="40dp"
    android:minHeight="40dp"
    android:configure="de.cliff.strichliste.widgets.WidgetConfigurationActivity"
    android:updatePeriodMillis="1800000"
    android:initialLayout="@layout/widget_counter"
    android:resizeMode="horizontal|vertical"
    android:widgetCategory="home_screen"
    android:previewImage="@drawable/widget_preview">
</appwidget-provider>

在AndroidManifest.xml中,我使用以下行注册小部件:

<receiver
            android:name=".widgets.CounterWidgetProvider">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/counter_widget_info" />
</receiver>

在Java方面,我在WidgetConfigurationActivity中获得了以下内容:

public class WidgetConfigurationActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        WidgetConfigurationBinding binding = DataBindingUtil.setContentView(this, R.layout.widget_configuration);
        setResult(RESULT_OK);
    }
}

这在WidgetProvider类中:

public class CounterWidgetProvider extends AppWidgetProvider {
@Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        Intent intent = new Intent(context, CounterWidgetProvider.class);
        context.startService(intent);
    }
}

1 个答案:

答案 0 :(得分:2)

通过在我自己的三星设备上进行测试,似乎问题是如果结果Intent没有附加App Widget ID,TouchWiz就会窒息,即使它是RESULT_CANCELLED

来自the App Widget developer page

  
      
  • App Widget主机调用配置Activity,配置Activity应始终返回结果。结果应该包括启动活动的Intent传递的App Widget ID(在Intent extras中保存为EXTRA_APPWIDGET_ID)。
  •   

目前还不清楚您希望最终如何处理结果,但如果用户退出配置onCreate(),那么继续在Activity中设置有效结果肯定是个好主意。 。例如:

final int id = getIntent().getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0);
final Intent result = new Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id);
setResult(RESULT_OK, result);