gpt4 book ai didi

android - 单击按钮不会启动 Android App Widget 中的服务

转载 作者:搜寻专家 更新时间:2023-11-01 09:18:19 26 4
gpt4 key购买 nike

我在启动服务来更新我作为练习创建的 AppWidget 时遇到了问题。我正在尝试从 DDMS 获取欺骗位置数据的纬度和经度以显示在小部件中。该小部件使用服务来更新 TextView,这可能有点矫枉过正,但我​​想遵循在 AppWidgets 中似乎很常见的模板,它可以完成更多工作(例如 Forecast 小部件或 Wiktionary 小部件)。

现在,我没有收到任何错误消息或奇怪的行为;按下按钮时什么也没有发生。我对可能出了什么问题感到有点困惑。那里的任何人都可以指出我正确的方向吗?

此外,如果我的位置逻辑有误,我也很乐意就此提出建议。我查看了几篇博客、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;
}
}

}

最佳答案

尝试设置最后一个参数

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

到:

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

此外,有时您需要将 addData 添加到您的 Intent 中,以便 Android 将其区分为新事物,这有点 hacky 但似乎有效,因此添加:

  serviceIntent.setData(Uri.parse("uri::somethingrandomandunique");

关于android - 单击按钮不会启动 Android App Widget 中的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2941951/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com