6

我一直在處理這個問題已經三天了,我已經在這裏查看了每個問題的答案。我有一個小工具,上面有一個按鈕,我希望它每次點擊時都會啓動一項服務。問題是該按鈕隨機停止工作。我根本無法重新創建它,我不知道是什麼原因造成的。我的服務調用stopSelf();但是我也遇到過廣播接收機的問題,所以我認爲問題出現在小部件中,而不是服務中。這裏是代碼Android Widget隨機停止工作

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[]  appWidgetIds) 
{ 

Log.i("Widget", "onUpdate"); 

final int N = appWidgetIds.length; 

    for (int i=0; i<N; i++) 
    { 

     int appWidgetId = appWidgetIds[i]; 

     Log.i("Widget", "onUpdateLoop"); 


     Intent intent = new Intent(context, ServiceWidgetAction.class); 
     intent.setAction(Long.toString(System.currentTimeMillis())); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

     PendingIntent pendingIntent = PendingIntent 
       .getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

     RemoteViews views = new RemoteViews(context.getPackageName(), 
       R.layout.widget); 

     views.setOnClickPendingIntent(R.id.widgetButton, pendingIntent); 

     views.setTextViewText(
       R.id.widgetTextView, 
       "Some text"); 

     appWidgetManager.updateAppWidget(appWidgetId, views); 

    } 

} 

我已經檢查了這段代碼,我不知道它爲什麼這樣做。它在3個不同的手機上完成,我無法重新創建它。我嘗試過強制停止應用程序,從任務管理器中添加新的小部件等來清除它,以使小部件停止工作,但它不會。但是,當我今天早上醒來時,小部件不再起作用。任何幫助將不勝感激。

+0

當它發生時,您是否看到LogCat中的任何內容? – CaseyB

+0

logcat中沒有任何內容,就像在活動中有沒有onClick方法的按鈕一樣。我可以看到它被按下,但在應用程序或logcat中沒有任何反應。 –

回答

10

我最終搞清楚的問題。我正在更新應用程序中其他地方的小部件,我沒有完整的代碼。換句話說我的應用程序更新textviews在這樣

RemoteViews views = new RemoteViews(context.getPackageName(), 
      R.layout.widget); 

    views.setTextViewText(
      R.id.widgetTextView, 
      "Some text"); 

    appWidgetManager.updateAppWidget(appWidgetId, views); 

小部件,但其所需的全部代碼保持註冊這樣的按鈕:

Intent intent = new Intent(context, ServiceWidgetAction.class); 
    intent.setAction(Long.toString(System.currentTimeMillis())); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

    PendingIntent pendingIntent = PendingIntent 
      .getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

    RemoteViews views = new RemoteViews(context.getPackageName(), 
      R.layout.widget); 

    views.setOnClickPendingIntent(R.id.widgetButton, pendingIntent); 

    views.setTextViewText(
      R.id.widgetTextView, 
      "Some text"); 

    appWidgetManager.updateAppWidget(appWidgetId, views); 

所以,底線是,只要你更新插件從你的應用程序中,確保它看起來完全像小部件本身的代碼。不要留下任何東西。

+0

謝謝。在我的情況下,總是更新小部件的單個方法在某些情況下可能會拋出異常,並且部分代碼不會執行。 – Alireza

+0

這是黃金,不等 - 它的比特幣值得回答 - 10x隊友 – gor

0

您是否已將小部件安裝到SD卡中?

Google建議將所有窗口小部件,鬧鐘和接收器應用程序類型安裝到內部存儲中,因爲這樣的系統同步問題。

也許不是解決辦法,而是「一定要勾選」;)

android:installLocation="internalOnly" 
+0

我沒有想到這一點,因爲我確實啓用了應用程序到SD,但我只是檢查它,並將應用程序安裝到內部存儲器中。感謝您的輸入! –