2011-11-27 2 views
2

방금 ​​Android를 배우기 시작했습니다. 매초마다 카운터를 업데이트하는 위젯을 작성하려고하지만, 어딘가에 누락되었습니다. 화면에 1이 표시됩니다. Android 4 에뮬레이터를 사용하고 있습니다.x 시간 후 Android 위젯 업데이트

package com.ibluekey; 

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Locale; 
import com.ibluekey.R; 

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

public class WidgetActivity extends AppWidgetProvider { 
    public static WidgetActivity Widgetke = null; 
    public static Context context; 
    public static AppWidgetManager appWidgetManager; 
    public static int appWidgetIds[]; 
    private Handler mHandler = new Handler(); 
    private static int count=0; 
    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {  
     if (null == context) context = WidgetActivity.context; 
     if (null == appWidgetManager) appWidgetManager = WidgetActivity.appWidgetManager; 
     if (null == appWidgetIds) appWidgetIds = WidgetActivity.appWidgetIds; 

     WidgetActivity.Widgetke = this; 
     WidgetActivity.context = context; 
     WidgetActivity.appWidgetManager = appWidgetManager; 
     WidgetActivity.appWidgetIds = appWidgetIds; 

     Log.d("PXR", "onUpdate"); 

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

      updateAppWidget(context,appWidgetManager, appWidgetId);    
     } 

    } 


    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, 
      int appWidgetId) { 

     count++; 

     /*Intent intent = new Intent(context, UpdateService.class); 
     PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); 

     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); 
     remoteViews.setOnClickPendingIntent(R.id.mainlayout, pendingIntent); 

     remoteViews.setTextViewText(R.id.test_out, ""+count); 

     // Tell the widget manager 
     appWidgetManager.updateAppWidget(appWidgetId, remoteViews);*/ 

     RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget); 
     views.setTextViewText(R.id.test_out, count+""); 
     appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 



    public static class UpdateService extends Service { 
     @Override 
     public void onStart(Intent intent, int startId) { 
      //WidgetActivity.Widgetke.onUpdate(context, appWidgetManager, appWidgetIds); 
      //Toast.makeText(context, "Update Widget", Toast.LENGTH_SHORT).show(); 

      WidgetActivity.Widgetke.mHandler.removeCallbacks(WidgetActivity.Widgetke.mUpdateTimeTask); 
      WidgetActivity.Widgetke.mHandler.postDelayed(WidgetActivity.Widgetke.mUpdateTimeTask, 100); 
     } 

     @Override 
     public IBinder onBind(Intent arg0) { 
      return null; 
     } 
    } 

    private Runnable mUpdateTimeTask = new Runnable() { 
      public void run() {   

       WidgetActivity.Widgetke.onUpdate(context, appWidgetManager, appWidgetIds);    
       WidgetActivity.Widgetke.mHandler.postAtTime(this, 1000); 

      } 
     }; 
} 

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.ibluekey" 
     android:versionCode="1" 
     android:versionName="1.0"> 


    <uses-sdk android:minSdkVersion="4" /> 

    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true"> 
     <receiver android:name=".Reciever" android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="MyTestIntent" /> 
      </intent-filter> 
     </receiver> 
     <receiver android:name="com.ibluekey.WidgetActivity" android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
      </intent-filter> 
      <meta-data     
       android:name="android.appwidget.provider" 
       android:resource="@xml/widgetprovider" /> 
     </receiver> 

     <service android:name="com.ibluekey.WidgetActivity$UpdateService" /> 
    </application> 

</manifest> 

답변

2

다음은 Android에서 위젯을 만들고 간격을두고 업데이트하는 훌륭한 자습서 시리즈입니다. http://android-er.blogspot.com/2010/10/simple-home-screen-app-widget-with.html

을 그리고 반복 타이머/알람 여기서 끝 : 그것은 여기에서 시작 http://android-er.blogspot.com/2010/10/app-widget-using-alarm-manager.html

는 기본적으로 위젯을 업데이트하는 방송 의도를 수신하도록 설정에 매니페스트의 몇 가지가 필요합니다. 또한 위젯에 대한 구성 활동을 작성하는 방법을 보여줍니다.

알람 또는 반복 이벤트를 만들려면 AlarmManager 클래스를 사용할 수도 있습니다.

1

appWidgetManager.updateAppWidget(appWidgetId, views); 

후에는이

super.onUpdate(context, appWidgetManager, appWidgetId); 

내가이 문제를 해결할 것으로 예상 추가