2016-11-20 85 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);