2012-10-09 3 views
0

여러 위젯이 있습니다. 각 업데이트에 나는 서비스 서비스 코드를 시작여러 개의 AppWidget을 업데이트하는 모호성

for (int widgetId : allWidgetIds) { 

// Register an onClickListener for DisplayActivity 
      Intent clickIntentUpdate1 = new Intent(
        this.getApplicationContext(), DisplayActivity.class); 
      clickIntentUpdate1.putExtra("widgetid", widgetId); 
      clickIntentUpdate1.putExtra(DisplayActivity.WHAT, what); 
      clickIntentUpdate1.putExtra(DisplayActivity.WHAT_COLOR, prefs 
        .getString(QuoteConfigure.PREF_PREFIX_KEY_QUOTE_COLOR 
          + widgetId, "Transparent")); 
      clickIntentUpdate1.putExtra(DisplayActivity.WHO, who); 
      clickIntentUpdate1.putExtra(DisplayActivity.WHO_COLOR, prefs 
        .getString(
          QuoteConfigure.PREF_PREFIX_KEY_QUOTE_BY_COLOR 
            + widgetId, "Transparent")); 
      clickIntentUpdate1.putExtra(
        DisplayActivity.BG_COLOR, 
        prefs.getString(QuoteConfigure.PREF_PREFIX_KEY_QUOTE_BG 
          + widgetId, "Transparent")); 
      PendingIntent pendingIntentUpdate1 = PendingIntent.getActivity(
        getApplicationContext(), 0, clickIntentUpdate1, 
        PendingIntent.FLAG_UPDATE_CURRENT); 
      remoteViews.setOnClickPendingIntent(R.id.what, 
        pendingIntentUpdate1); 
      Log.d("quoteSERVICE", what + " -> " + who); 
      Log.d("quoteSERVICE", "what inside intent:"+clickIntentUpdate1.getExtras().getString(DisplayActivity.WHAT)); 
      Log.d("quoteSERVICE", "widgetid:"+widgetId); 
      Log.d("quoteSERVICE", "--------------------"); 

      // Register an onClickListener for Who search 
      Intent clickIntentSearch = new Intent(Intent.ACTION_VIEW); 
      clickIntentSearch.setData(Uri 
        .parse("http://www.google.com/search?q=" + who)); 
      PendingIntent pendingIntentSearch = PendingIntent.getActivity(
        getApplicationContext(), 0, clickIntentSearch, 0); 
      remoteViews.setOnClickPendingIntent(R.id.who, 
        pendingIntentSearch); 

      appWidgetManager.updateAppWidget(widgetId, remoteViews); 
} 
stopSelf(); 

이제 문제는 다음과 같습니다

나는 두 개의 위젯을 가지고 있고이 R.id.who 의도를 업데이트 할 때이 예정대로 발사한다 필요한 데이터가 있어야합니다. 그러나 R.id.what 사건은 그것이 예정되어있는대로 해고되지 않습니다. 이 이벤트에 전송 된 데이터가 전송 무엇의 마지막 값입니다 (마지막 위젯 즉 사람을 업데이트 할 수 있습니다.)

답변

0

내가 틀릴 수도 있지만, IIRC 안드로이드는이 버그/특질/동일한 미완료 PendingIntents가 여러 개있는 것을 허용하지 않는 기능.

즉, 보류중인 인스트럭션을 추가로 만들면 첫 번째 것은 잊어 버리고 인 텐트가 실행되면 설정 한 마지막 인 텐트를 보냅니다.

사용하지 않는 동안 안드로이드가 두 가지 의도가 동일하지 않다고 생각하면서 가짜 "액션"을 설정하여 구분할 수 있다고 생각합니다. 그러면 코드가 예상대로 작동합니다.

아래에서이 문장을 삽입 해보고 문제가 해결되는지 확인할 수 있습니까?

Intent clickIntentUpdate1 = new Intent(
       this.getApplicationContext(), DisplayActivity.class); 

clickIndentUpdate1.setAction("foobar" + String.valueOf(widgetId)); //NEW LINE 

자체가 문제가되지 않는 경우의 조치 문자열은, 당신은 단지 의도가 결합되지 않도록하는 독특한 문자열을 각 appwidget의 의도를해야합니다.

+0

작동했습니다. 당신의 대답에서 언급했듯이, 위젯과 관련된 더 이상 버그가 있습니까? 그러나, 나는 아직도 문제를 이해하지 못한다. 왜 첫 번째 의도는 잊혀져 버리는가? – harshit

+0

PendingIntents가 고유한지 여부를 결정할 때 Android가 추가 콘텐츠의 콘텐츠를 보지 않는 것으로 보입니다.따라서 두 번째 의도를 만드는 것을 보았을 때 "이 사실은 기존의 PendingIntent와 정확히 동일한 의도입니까? 예? 그렇다면이 경우 모두 사용하십시오." 왜 이런 식으로하는지 모르겠습니다. @harshit – Tim

+0

하지만 사실은 그렇지 않습니다. 나는 지나가는 엑스트라가 다르다는 것을 의미한다. 또한 Google 쿼리 URI를 전달하는 다른 의도에 대해서도 작동합니다. 어째서? – harshit

0

PendingIntents를 구별 할 필요가 있다는 점에 대한 팀의 대답은 정확합니다. 고유성 요구 사항은 의도적으로 설계된 것이며 버그가 아닌 기능입니다. 고유하지 않은 경우 Android에서 다시 사용합니다.

PendingIntent는 적어도 중 하나가 다른 PendingIntents와 다른 경우 고유합니다. 코드에서 그들은이 같은 매개 변수와 함께 시작되기 때문에

PendingIntent pendingIntentUpdate1 = PendingIntent.getActivity(
        getApplicationContext(), 0, clickIntentUpdate1, 
        PendingIntent.FLAG_UPDATE_CURRENT); 

당신의 PendingIntents는 동일하며, 예, 여분의 다른 내용이 포함되지 않는 것 같다. Tim의 솔루션은 각 위젯 인스턴스에 대해 "foobar1", "foobar2"등의 다른 작업을 전송하기 때문에 작동합니다. 이는 각 인 텐트를 구별합니다.

캘린더 위젯의 각 날짜에 대해 PendingIntents를 차별화하려는 경우이 사실을 발견했습니다. 일주일에 6 주 7 일이 있었고 여러 위젯 인스턴스가있을 수 있으므로 위젯 # 1의 일자 i, j의 위젯 # 2, 위젯 # 2의 가능한 각 항목에 대해 고유 한 탭을 만들어야했습니다. 42 조합.

는 I 각 리소스 식별자 (날짜)에 다른 requestCode (2 파라미터)를 할당하여이를 해결 :

Intent dateTapIntent = new Intent(Consts.WIDGET_CLICK_DATE) 
        .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, awId) 
        .putExtra(Consts.SELECTED_DATE_EXTRA, getSelectedDate(awId, i-1, j-1)); 
int request = awId * 100 + i * 10 + j; 
rv.setOnClickPendingIntent(identifier, 
     PendingIntent.getBroadcast(mContext, request, 
            dateTapIntent, PendingIntent.FLAG_UPDATE_CURRENT)); 

수식 awId * 100 + i * 10 + j 모든 위젯 인스턴스 사이 각 날짜에 대한 고유성을 제공하는 것이다.

관련 문제