2011-02-01 17 views
6

this ट्यूटोरियल के आधार पर मैंने एक विजेट बनाया जो समय दिखाना चाहिए। जावा रास्ता काम करता है, लेकिन सेवा का तरीका नहीं है।एंड्रॉइड विजेट अपडेट

HelloWidget.java:

public class HelloWidget extends AppWidgetProvider { 

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

    Intent intent = new Intent(context, UpdateService.class); 
    context.startService(intent); 
} 

UpdateService.java: एंड्रॉयड: updatePeriodMillis = "1000"

public final class UpdateService extends Service { 
@Override 
public void onStart(Intent intent, int startId) { 
    RemoteViews updateViews = new RemoteViews(this.getPackageName(), R.layout.main); 

    Date date = new Date(); 
    java.text.DateFormat format = SimpleDateFormat.getTimeInstance(
      SimpleDateFormat.MEDIUM, Locale.getDefault()); 
      updateViews.setTextViewText(R.id.widget_textview, "Current Time " + format.format(date)); 

    ComponentName thisWidget = new ComponentName(this, HelloWidget.class); 
    AppWidgetManager manager = AppWidgetManager.getInstance(this); 
    manager.updateAppWidget(thisWidget, updateViews); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 

}

hello_widget_provider.xml इस पंक्ति है समस्या: विजेट वर्तमान समय दिखाता है लेकिन यह अद्यतन नहीं कर रहा है (जावा-रास्ता है)।

मेरा मुख्य लक्ष्य विजेट को अपडेट करना है उदा। 18:56 हर दिन। Idk अगर यह अच्छा तरीका है, लेकिन मैं नीचे की तरह onUpdate विधि को संशोधित करने की कोशिश की है, लेकिन यह ALARM_SERVICE के साथ एक समस्या है: ALARM_SERVICE करने के लिए वैरिएबल

public class HelloWidget extends AppWidgetProvider { 

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

    AlarmManager alarmManager; 
    Intent intent = new Intent(context, AlarmReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, 
     intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.HOUR_OF_DAY, 18); 
    cal.set(Calendar.MINUTE, 56); 
    cal.set(Calendar.SECOND, 0); 
    cal.set(Calendar.MILLISECOND, 0); 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 86400, pendingIntent); 

} }

कोई हल नहीं किया जा सकता है मदद की सराहना की है।

उत्तर

15

उस प्रश्न को वापस देखकर मैंने पूछा कि यह प्रश्न मुझे पिछले 15 वर्षों में कितना सीखा है।

चूंकि मैं पिछले दो हफ्तों में एक विजेट के साथ काम कर रहा हूं और मुझे अभी यह अनुत्तरित प्रश्न मिला है, मैंने इसे हल करने का फैसला किया है। मुझे उम्मीद है कि यह दूसरों की मदद करेगा।

AppWidgetProvider इस तरह दिखना चाहिए:

public class MyWidget extends AppWidgetProvider { 

    public static String ACTION_WIDGET_CONFIGURE = "ConfigureWidget"; 
    public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget"; 
    private PendingIntent service = null; 

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


      final AlarmManager m = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

      final Calendar TIME = Calendar.getInstance(); 
      TIME.set(Calendar.MINUTE, 0); 
      TIME.set(Calendar.SECOND, 0); 
      TIME.set(Calendar.MILLISECOND, 0); 

      final Intent i = new Intent(context, MyService.class); 

      if (service == null) 
      { 
       service = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT); 
      } 

      m.setRepeating(AlarmManager.RTC, TIME.getTime().getTime(), 1000 * 1, service); 

    } 

     @Override 
     public void onDeleted(Context context, int[] appWidgetIds) { 
       super.onDeleted(context, appWidgetIds); 
     } 

     @Override 
     public void onDisabled(Context context) { 
       super.onDisabled(context); 

       final AlarmManager m = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
       if (service != null) 
       { 
        m.cancel(service); 
       } 
     } 

     @Override 
     public void onEnabled(Context context) { 
       super.onEnabled(context); 
     } 

     @Override 
     public void onReceive(Context context, Intent intent) { 

     super.onReceive(context, intent); 

     } 

} 

सेवा:

<receiver android:name="MyWidget" android:label="Tutorial_Widget 1x1"> 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
       <action android:name="com.something.MyWidget.ACTION_WIDGET_RECEIVER"/> 
      </intent-filter>  
      <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_info"/> 
     </receiver> 

     <service android:enabled="true" android:name=".MyService" /> 
+0

मुझे खेद है, लेकिन आप कहां सेट कर रहे हैं जिसे दोहराव अंतराल निर्धारित करना है? –

+1

'm.setRepeating (AlarmManager.RTC, TIME.getTime()। GetTime(), 1000 * 1, सेवा);' – erdomester

+0

हाँ, धन्यवाद, मैं इसके साथ आता हूं। मुझे यह भी रूचि है कि मैं विशिष्ट समय कैसे निर्धारित कर सकता हूं, जिस पर अद्यतन किया जाएगा। –

3

ALARM_SERVICE संदर्भ वर्ग का एक स्थिर क्षेत्र है। तो Context.ALARM_SERVICE टाइप करें या एक स्थिर आयात का उपयोग करें।

याद रखें कि जब आप अद्यतन पेरियोडमिलिस विशेषता मान सेट करते हैं तो यह उस अवधि के साथ आपकी ऑनडेट विधि को कॉल करने की गारंटी नहीं देता है।

+0

मैं इस कभी नहीं था:

public class MyService extends Service { @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { buildUpdate(); return super.onStartCommand(intent, flags, startId); } private void buildUpdate() { String lastUpdated = DateFormat.format("hh:mm:ss", new Date()).toString(); RemoteViews view = new RemoteViews(getPackageName(), R.layout.widget_layout); view.setTextViewText(R.id.btn_widget, lastUpdated); ComponentName thisWidget = new ComponentName(this, MyWidget.class); AppWidgetManager manager = AppWidgetManager.getInstance(this); manager.updateAppWidget(thisWidget, view); } @Override public IBinder onBind(Intent intent) { return null; } } 

इसके अलावा, प्रदाता और प्रकट में सेवा रजिस्टर अब तक समस्या जब मैंने टाइप किया था, तो टाइप सिस्टम सिस्टम के साथ एक समस्या है: "विधि getSystemService (स्ट्रिंग) हैलोविड्ज प्रकार के लिए अपरिभाषित है" – erdomester

+2

getSystemService (स्ट्रिंग) संदर्भ वर्ग का एक तरीका है। लेकिन विजेट प्रदाता संदर्भ नहीं हैं। वे प्रसारण प्राप्तकर्ता हैं और संदर्भ को उनके तरीकों में पैरामीटर के रूप में पुनर्प्राप्त करते हैं। तो आपको HelloWidget कोड में context.getSystemService (Context.ALARM_SERVICE) टाइप करना चाहिए। –

संबंधित मुद्दे