Android - 三星:使用配置 activity 创建小部件失败
Android - Samsung: Creating Widget with configuration activity fails
我构建了一个可以将小部件添加到主屏幕的应用程序。该小部件适用于我的 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"
,就会创建小部件。如果我想使用配置 activity 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 中的这个 class:
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);
}
}
从我自己的三星设备上测试来看,问题似乎是如果结果 Intent
没有附加 App Widget ID,即使它是 RESULT_CANCELLED
,TouchWiz 也会卡住。
来自the App Widget developer page:
- The App Widget host calls the configuration Activity and the configuration Activity should always return a result. The result should include the App Widget ID passed by the Intent that launched the Activity (saved in the Intent extras as EXTRA_APPWIDGET_ID).
不清楚您希望最终如何处理结果,但在 onCreate()
中设置有效结果绝对是个好主意,以防用户退出配置 [=14] =].例如:
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);
我构建了一个可以将小部件添加到主屏幕的应用程序。该小部件适用于我的 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"
,就会创建小部件。如果我想使用配置 activity 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 中的这个 class:
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);
}
}
从我自己的三星设备上测试来看,问题似乎是如果结果 Intent
没有附加 App Widget ID,即使它是 RESULT_CANCELLED
,TouchWiz 也会卡住。
来自the App Widget developer page:
- The App Widget host calls the configuration Activity and the configuration Activity should always return a result. The result should include the App Widget ID passed by the Intent that launched the Activity (saved in the Intent extras as EXTRA_APPWIDGET_ID).
不清楚您希望最终如何处理结果,但在 onCreate()
中设置有效结果绝对是个好主意,以防用户退出配置 [=14] =].例如:
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);