2013-06-03 79 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); 
    } 

//編輯Java文件

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,它會觸發您的AppWidgetProvideronUpdate()方法的調用。

或者,使用AlarmManager來觸發一個PendingIntent,它將調用您的一些代碼,以便在某個其他頻率上更新您的應用程序窗口小部件。

但是,我不建議每分鐘更新一次應用程序窗口小部件(設備睡眠時間更長),以降低功耗。

+0

我添加並修改了添加服務類的代碼。請看看我編輯的代碼。我收到錯誤「不幸的是服務已經停止」。 – Atihska

+0

@Atihska:檢查LogCat並查看與您的錯誤相關的堆棧跟蹤。 – CommonsWare