单击按钮不会在Android App Widget中启动服务 [英] Button click does not start Service in Android App Widget

查看:271
本文介绍了单击按钮不会在Android App Widget中启动服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法启动服务来更新我作为练习创建的AppWidget.我正在尝试从DDMS获取欺骗性位置数据的纬度和经度以显示在小部件中.该小部件使用一项服务来更新TextView,这可能有点过大了,但是我想遵循在做更多工作的AppWidget中似乎很常见的模板(例如Forecast小部件或Wiktionary小部件).

I'm having trouble starting a Service to update an AppWidget that I'm creating as an exercise. I'm trying to get the latitude and longitude of spoofed location data from DDMS to display in the widget. The widget uses a service to update the TextView, which may be slightly overkill, but I wanted to follow the template that seems to be common in AppWidgets that do more work (like the Forecast widget or the Wiktionary widget).

现在,我没有收到任何错误消息或奇怪的行为;按下按钮时什么也没有发生.对于可能出什么问题,我有些迷惑.外面有人能指出我正确的方向吗?

Right now, I'm not getting any error messages or strange behavior; nothing at all happens when the button is pressed. I'm a bit mystified as to what might be wrong. Could anyone out there point me in the right direction?

此外,如果我的位置逻辑有误,我也很乐意就此提出建议.我看过几个博客,Google示例和文档,但是我对它的工作方式有点模糊.

Additionally, if my logic for location is faulty, I'd love recommendations on that too. I've looked at several blogs, the Google examples, and the documentation, but I feel a little fuzzy on how it works.

这是小部件的当前状态:

Here is the current state of the widget:

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;
        }
    }

}

推荐答案

尝试设置的最后一个参数

Try setting the last parameter of

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

收件人:

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

有时,您还需要向Android添加意图添加Data来将其区分为新的东西,这有点棘手,但似乎可以正常工作,所以请添加:

Also sometimes you need to addData to your intent for Android to distinguish it as something new, this is a bit hacky but seems to work so add:

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

这篇关于单击按钮不会在Android App Widget中启动服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆