2013-06-03 2 views
3

나는 일련의 이미지를 넘겨주는 간단한 버튼 위젯을 가지고 있습니다. 이제 버튼 클릭 대신 시간의 일정한 간격 후에 이미지가 뒤집히는 것이 좋습니다. 그것을 위해 서비스 클래스가 필요합니다. 누구든지 내 코드에 포함시키는 방법을 알려줄 수 있습니까? 서비스에 대해별로 생각하지 않습니다. 여기 android 서비스를 사용하여 위젯 업데이트

내 코드입니다 : //widgetprovider.java

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

     //Log.i("Tag","In onUpdate method"); 
     System.out.println("Tag In onUpdate method"); 
     RemoteViews views=new RemoteViews(context.getPackageName(),R.layout.widget_layout); 
     views.setOnClickPendingIntent(R.id.widget_button, buildButtonPendingIntent(context)); 
     Log.i("Tag","Context value after setOnClickPI before pushWIDGET:"+context); 

     pushWidgetUpdate(context,views); 
     Log.i("Tag","after pushwidget update:"+context); 
    } 

    public static PendingIntent buildButtonPendingIntent(Context context){ 

     Intent intent=new Intent(); 
     intent.setAction("com.example.android.intent.action.CHANGE_PICTURE"); 

     Log.i("Tag","intent's action:"+intent); 
     return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    } 

    public static void pushWidgetUpdate(Context context,RemoteViews views){ 

     System.out.println("Inside pushwidget"); 
     ComponentName myWidget=new ComponentName(context, MyWidgetProvider.class); 
     AppWidgetManager manager=AppWidgetManager.getInstance(context); 
     manager.updateAppWidget(myWidget, views); 
    } 

//IntentReceiver.java

public void onReceive(Context context, Intent intent) { 

     // Log.i("Tag1","In onReceive:"+intent); 
     System.out.println("In onReceive()"); 

     if (intent.getAction().equals(
       "com.example.android.intent.action.CHANGE_PICTURE")) { 
      updateWidgetPictureAndButtonListener(context); 
     } 
    } 

    private void updateWidgetPictureAndButtonListener(Context context) { 

     RemoteViews views = new RemoteViews(context.getPackageName(), 
       R.layout.widget_layout); 
     views.setImageViewResource(R.id.widget_image, getImageToSet()); 

     System.out.println("in updateWidgetPicture method"); 
     // Log.i("Tag","in updaeWIdgetPicture method"); 
     // remember to set ur button click listeners 
     views.setOnClickPendingIntent(R.id.widget_button, 
       MyWidgetProvider.buildButtonPendingIntent(context)); 

     MyWidgetProvider.pushWidgetUpdate(context.getApplicationContext(), 
       views); 
    } 

// 편집 자바 파일

package com.example.pictureappservice; 

import android.app.PendingIntent; 
import android.app.Service; 
import android.appwidget.AppWidgetManager; 
import android.appwidget.AppWidgetProvider; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.os.IBinder; 
import android.util.Log; 
import android.widget.RemoteViews; 


// this works without service 
public class MyWidgetProvider extends AppWidgetProvider { 

    private static int clickCount = 0; 
    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds){ 

     Log.i("onUpdate method call","Called"); 
     ComponentName thisWidget=new ComponentName(context, MyWidgetProvider.class); 
     int []allWidgetIds=appWidgetManager.getAppWidgetIds(thisWidget); 

     //built intent to call service 
     Intent intent=new Intent(context.getApplicationContext(),UpdateService.class); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,allWidgetIds); 

     Log.i("LOG","before service"); 
     //update widget via service 
     context.startService(new Intent(context,UpdateService.class)); 
    } 

    public static class UpdateService extends Service{ 

     public void onStart(Intent intent, int startId){ 

      AppWidgetManager appWidgetManager=AppWidgetManager.getInstance(this.getApplicationContext()); 
      int []allWidgetIds=intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); 

      ComponentName thisWidget=new ComponentName(getApplicationContext(),MyWidgetProvider.class); 
      int []allWidgetIds2=appWidgetManager.getAppWidgetIds(thisWidget); 

      Log.i("LOG","From Intent" + String.valueOf(allWidgetIds.length)); 
      Log.i("LOG","Direct" + String.valueOf(allWidgetIds2.length)); 

      for(int widgetId:allWidgetIds){ 

       // logic 
       Log.i("LOG","intent's action"+intent.getAction()); 
       //if (intent.getAction().equals("com.example.android.intent.action.CHANGE_PICTURE")) { 

        RemoteViews views=new RemoteViews(this.getApplicationContext().getPackageName(),R.layout.widget_layout);  
        views.setImageViewResource(R.id.widget_image, getImageToSet()); 

        //intent 
        Intent clickIntent=new Intent(this.getApplicationContext(),MyWidgetProvider.class); 
        clickIntent.setAction("AppWidgetManager.ACTION_APPWIDGET_UPDATE"); 
        //clickIntent.setAction("com.example.android.intent.action.CHANGE_PICTURE"); 
        clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds); 

        Log.i("Tag","intent's action:"+intent); 

        PendingIntent pendingIntent=PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
        views.setOnClickPendingIntent(R.id.widget_image, pendingIntent); 
        appWidgetManager.updateAppWidget(widgetId,views); 
       //} 
      } 
      stopSelf(); 
      super.onStart(intent, startId); 
     } 

     private int getImageToSet() { 
      clickCount++; 
      Log.i("Tag", "in getImageToSet()" + clickCount); 

      return clickCount % 2 == 0 ? R.drawable.paypal_logo : R.drawable.paypaldonation; 
     } 
     @Override 
     public IBinder onBind(Intent intent) { 
      // We don't need to bind to this service 
      return null; 
     } 
    } 

    public static void pushWidgetUpdate(Context context,RemoteViews views){ 

     System.out.println("Inside pushwidget"); 
     ComponentName myWidget=new ComponentName(context, MyWidgetProvider.class); 
     AppWidgetManager manager=AppWidgetManager.getInstance(context); 
     manager.updateAppWidget(myWidget, views); 
    } 
} 

답변

3

경우 " 특정 시간 간격 "이 15 분 이상인 경우 앱 위젯에서 android:updatePeriodMillis을 사용하십시오. adata를 입력하면 AppWidgetProvider에있는 onUpdate() 방법에 대한 호출이 트리거됩니다.

AlarmManager을 사용하면 다른 주파수로 앱 위젯을 업데이트 할 코드를 호출하는 PendingIntent을 트리거 할 수 있습니다.

그러나 전력 소모를 줄이기 위해 앱 위젯을 분당 한 번 이상 (기기가 잠 들어있을 때까지 더 길게) 업데이트하는 것은 좋지 않습니다.

+0

서비스 클래스를 추가하기위한 코드가 추가 및 수정되었습니다. 제 편집 된 코드를보십시오. "불행히도 서비스가 중지되었습니다"라는 오류가 나타납니다. – Atihska

+0

@Atihska : LogCat을 검사하여 오류와 관련된 스택 추적을보십시오. – CommonsWare

관련 문제