2016-11-20 49 views
1

我构建了一个应用程序,可将小部件添加到主屏幕。该小工具正在与我的Nexus 6P和摩托罗拉Moto G3一起工作。使用三星手机(经过S3 mini(4.1.2),S5,S6(6.0.1)测试),根本没有添加Widget或者TouchWiz崩溃。Android - 三星:创建配置活动失败的小工具

有了另一个启动器(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); 
    } 
} 
+0

只是抬起头来:我注意到一些奇怪的行为,我认为是来自我运行的测试,导致TouchWiz崩溃。重新启动后,似乎TouchWiz以某种方式保留了从未实际进入主屏幕的小部件的引用,并开始为它们播放更新。我刚刚注意到,因为我用一个预先存在的小部件项目运行测试,这个小部件项目更新频率较高,并且每次都显示一个“Toast”。您可能希望在您测试的任何设备上完成卸载,以便在继续测试之前将其清除。 –

回答

2

从我自己的三星设备上进行测试,看起来问题在于,如果结果Intent没有附加App Widget ID,则TouchWiz会窒息,即使它是RESULT_CANCELLED

the App Widget developer page

  • 应用程序的Widget主机调用配置Activity和配置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); 
相关问题