0

我已經實現了一個App小部件來啓動我點擊時的活動。有時候從小部件啓動活動失敗有時

onUpdate()WidgetProvider方法:

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

    final int N = appWidgetIds.length; 
    for (int i=0; i<N; i++) { 
     int appWidgetId = appWidgetIds[i]; 

     RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.mywidgetprovider_layout); 
     // ....update updateViews here 
     appWidgetManager.updateAppWidget(appWidgetId, updateViews); 

     Intent onClickedIntent = new Intent(context,MyActivity.class); 
     PendingIntent pi = PendingIntent.getActivity(context, 0, onClickedIntent, 0); 
     updateViews.setOnClickPendingIntent(R.id.myView, pi); 

     appWidgetManager.updateAppWidget(appWidgetId, updateViews); 

    } 
} 

它如預期加主屏幕上的小部件之後。

但有時候,它不能再次啓動活動!我必須刪除小部件並再次添加。

我該如何解決?請幫忙。

回答

0

我會做這樣的:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.mywidgetprovider_layout);  
    Intent onClickedIntent = new Intent(context,MyActivity.class); 
    PendingIntent pi = PendingIntent.getActivity(context, 0, onClickedIntent, 0); 
    updateViews.setOnClickPendingIntent(R.id.myView, pi); 

    for (int i=0; i<appWidgetIds.length; i++) { 
     appWidgetManager.updateAppWidget(appWidgetIds[i], updateViews); 
    } 
} 

有一件事我不知道是上調用super.onUpdate()。我自己的小部件代碼沒有它,似乎工作正常...不知道是否需要或不。

我不知道這個重構是否能解決你的問題!

+0

Thx dave.c,對我來說這似乎很好。我認爲要點是將for循環外部的updateViews.setOnClickPendingIntent()代碼移出。 – chow 2011-02-04 13:16:58

0

我知道這很像晚了兩年,但是我也一直在努力,直到今天,當我想我知道我做錯了什麼。我認爲主要關鍵是關注RemoteViews類的使用。您將這些對象準備爲另一個要遵循的過程的指令集。將發送到updateAppWidget方法之前,必須先完成的設置,然後您首次調用該方法時不會爲您的「myView」對象填充點擊次數。您的代碼接下來會設置onClick觸發器並再次調用updateAppWidget。它看起來應該是一個人應該工作,但是有一個令人困惑的問題,關於兩個意圖是不同的還是模棱兩可的,你可能想了解一下,以瞭解你的代碼爲什麼不可預測地工作。如果我是對的,那麼外賣只是簡單地不首次調用updateAppWidget,然後在創建RemoteViews對象時始終確保設置onClick觸發器。無論如何,我希望如此。

相關問題