2010-12-12 5 views
8

저는 간단한 appwidget을 보유하고 있으며, 작업 (동일한 앱에서)에서 작업이 발생하면 업데이트하려고합니다. onUpdate()에서 즉시 작동하는 위젯을 업데이트합니다. 내 활동에서 뷰를 업데이트하려면 onUpdate()에서 호출 된 내 appwidget에서 동일한 정적 업데이트 메서드를 호출합니다. 위젯이 업데이트되지 않습니다.android appwidget이 활동에서 업데이트되지 않습니다.

코드를 AppWidgetManager.updateAppWidget() 메소드로 바로 추적 할 수 있습니다.이 모든 것이 좋지만 위젯은 업데이트되지 않습니다.

내가 볼 수있는 유일한 차이점은 액티비티의 컨텍스트와 appwidget의 onUpdate() 메소드의 컨텍스트에서 호출 될 때 내 정적 업데이트 메소드에 전달 된 컨텍스트 개체가 다른 것입니다. 그러나이 예제에는 웹에 많은 예제가 있으므로 작동해야한다고 생각합니다.

답변

19

당신의 코드를 보지 않고 나는 당신이 그것을하려는 방법을 100 % 확신하지 못하지만, 여기 제가 사용하는 방법이 있습니다. 내 Activity 내에서 나는 다음과 같은 방법이 있습니다 MyWidget가 appwidget의 클래스입니다

private void updateAllWidgets(){ 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); 
    int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(this, MyWidget.class)); 
    if (appWidgetIds.length > 0) { 
     new MyWidget().onUpdate(this, appWidgetManager, appWidgetIds); 
    } 
} 

. 내 내의 모든 곳에서이 메소드를 호출하여 모든 appwidgets를 업데이트 할 수 있습니다.

+1

의 수신기 태그 내부 전화, 그래서 문제는 내가이 업데이트되지 않았 음을해야합니다 올바른 ID. 그 위젯은 ID로 Onclick 인 텐트를 설정하고,이 ID는 활동에 의해 수신되고, 그러면 위젯이 자신을 업데이트하도록 지시합니다. –

+0

onUpdate 메서드를 호출하는 것이 올바른 방법이라고 생각하지 않습니다. AppWidgetManager.ACTION_APPWIDGET_UPDATE에 대한 브로드 캐스트를 보내야합니다. – midhunhk

+0

@silverback "올바르게하고있다"는 접근 방식에서, 나는 당신에게 동의합니다. 올바른 방법은 방송을 보내는 것입니다. "그냥 만들어라"접근 방식에서, 위의 그림은 앱 위젯이 더러워 지지만 기능적으로 업데이트됩니다. –

9

정적 메서드를 사용하는 대신 위젯이 이미 브로드 캐스트 리시버이며 매니페스트에 업데이트 인 텐트를 등록한다는 점을 활용하십시오. 당신이 활동에서 업데이트해야 할 때마다 그럼 그냥

//in your activity 
sendBroadcast(new Intent(MyWidget.ACTION_UPDATE).putExtra(whatever)); 



//In widget class 
public static final String ACTION_UPDATE = "com.example.UPDATE_MY_WIDGET"; 

과 사물이 작동했다 매니페스트 파일

<intent-filter> 
    <action android:name="com.example.UPDATE_MY_WIDGET"/> 
</intent-filter> 
+0

나는 이것을하고 있었지만 위젯이 의도 된 서비스를 시작하도록 변경했다. 왜? 위젯은 잠재적으로 long-ish 실행 조작을 수행합니다. onUpdate()가 즉시 반환하지 않았을 때 위젯에서 ANR을 얻었습니다. 이것이 내 문제와 관련이 있는지 확실하지 않습니다. –

+0

예 긴 작업은 IntentService, AsyncTask 또는 다른 유형의 스레딩을 사용해야합니다. 내 대답은 내가 위젯에 작업 시작 시간을 알려주는 것입니다. 또는 작업이 완료되었고 상태를 업데이트해야한다고 위젯에 알리는 것입니다. – schwiz

+0

@schwiz 오래 전에도 여전히 긴 작업을 수행하려면 onUpdate()에서 서비스를 시작해야합니다. 내가 생각하는 수신기는 약 5 초를 실행합니다. AsyncTask를 작성하는 것은 수신자가 파손될 경우에도 사라지기 때문에 비현실적입니다. – HGPB

관련 문제