2010-05-31 66 views
1

我无法启动服务来更新我创建的AppWidget作为练习。我试图从DDMS中获取欺骗性位置数据的经度和纬度以显示在小部件中。该小部件使用一个服务来更新TextView,这可能稍微有点矫枉过正,但我​​想要遵循这个模板,这在AppWidgets中似乎很常见,可以完成更多工作(如预测小部件或维基文库小部件)。按钮点击无法启动Android应用程序小部件中的服务

现在,我没有收到任何错误消息或奇怪的行为;按下按钮时根本没有任何事情发生。对于什么可能是错误的,我有点神秘。任何人都可以指出我正确的方向吗?

另外,如果我的位置逻辑有问题,我也会喜欢这方面的建议。我查看了几个博客,Google示例和文档,但我对它的工作原理感到有些模糊。

这里是小工具的当前状态:

public class Widget extends AppWidgetProvider 
{ 
    static final String TAG = "Widget"; 
    /** 
    * {@inheritDoc} 
    */ 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
         int[] appWidgetIds) 
    { 
     // Create an intent to launch the service 
     Intent serviceIntent = new Intent(context, UpdateService.class); 

     // PendingIntent is required for the onClickPendingIntent that actually 
     // starts the service from a button click 
     PendingIntent pendingServiceIntent = 
      PendingIntent.getService(context, 0, serviceIntent, 0); 

     // Get the layout for the App Widget and attach a click listener to the 
     // button 
     RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main); 
     views.setOnClickPendingIntent(R.id.address_button, pendingServiceIntent); 
     super.onUpdate(context, appWidgetManager, appWidgetIds); 
    } 

    // To prevent any ANR timeouts, we perform the update in a service; 
    // really should have its own thread too 
    public static class UpdateService extends Service 
    { 
     static final String TAG = "UpdateService"; 
     private LocationManager locationManager; 
     private Location currentLocation; 
     private double latitude; 
     private double longitude; 

     public void onStart(Intent intent, int startId) 
     { 
      // Get a LocationManager from the system services 
      locationManager = 
       (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

      // Register for updates from spoofed GPS 
      locationManager.requestLocationUpdates("gps", 30000L, 0.0f, new LocationListener() 
      { 
       @Override 
       public void onLocationChanged(Location location) 
       { 
        currentLocation = location; 
       } 

       @Override 
       public void onProviderDisabled(String provider) {} 

       @Override 
       public void onProviderEnabled(String provider) {} 

       @Override 
       public void onStatusChanged(String provider, int status, 
         Bundle extras) {}  
      }); 
      // Get the last known location from GPS 
      currentLocation = 
       locationManager.getLastKnownLocation("gps"); 

      // Build the widget update 
      RemoteViews updateViews = buildUpdate(this); 

      // Push update for this widget to the home screen 
      ComponentName thisWidget = new ComponentName(this, Widget.class); 

      // AppWidgetManager updates AppWidget state; gets information about 
      // installed AppWidget providers and other AppWidget related state 
      AppWidgetManager manager = AppWidgetManager.getInstance(this); 

      // Updates the views based on the RemoteView returned from the 
      // buildUpdate method (stored in updateViews) 
      manager.updateAppWidget(thisWidget, updateViews); 
     } 

     public RemoteViews buildUpdate(Context context) 
     { 
      latitude = currentLocation.getLatitude(); 
      longitude = currentLocation.getLongitude(); 
      RemoteViews updateViews = 
       new RemoteViews(context.getPackageName(), R.layout.main); 
      updateViews.setTextViewText(R.id.latitude_text, "" + latitude); 
      updateViews.setTextViewText(R.id.longitude_text, "" + longitude); 
      return updateViews; 
     } 

     @Override 
     public IBinder onBind(Intent intent) { 
      // We don't need to bind to this service 
      return null; 
     } 
    } 

} 

回答

4

尝试设置的

PendingIntent.getService(context, 0, serviceIntent, 0); 

最后一个参数:

PendingIntent.getService(context, 0, serviceIntent, Intent.FLAG_ACTIVITY_NEW_TASK); 

而且有时你需要addData到您的意图让Android将它区分为新的东西,这有点不好意思,但似乎可以这样工作:

serviceIntent.setData(Uri.parse("uri::somethingrandomandunique"); 
0
PendingIntent pendingIntent = PendingIntent.getService(context, 0, startServiceIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    remoteViews.setOnClickPendingIntent(R.id.start_service_btn_widget, pendingIntent); 

appWidgetManager.updateAppWidget一定要打电话,或点击事件不响应

appWidgetManager.updateAppWidget(componentName, remoteViews); 
相关问题