Нажатие кнопки не запускает службу в виджете приложения для Android - PullRequest
1 голос
/ 31 мая 2010

У меня проблемы с запуском Сервиса для обновления виджета AppWidget, который я создаю в качестве упражнения. Я пытаюсь получить широту и долготу поддельных данных о местоположении из DDMS для отображения в виджете. Виджет использует сервис для обновления TextView, что может быть немного излишним, но я хотел следовать шаблону, который, кажется, распространен в AppWidget, которые выполняют больше работы (например, виджет 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;
        }
    }

}

Ответы [ 2 ]

3 голосов
/ 02 июня 2010

Попробуйте установить последний параметр

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

до:

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

Также иногда вам нужно добавить данные в ваше намерение для Android, чтобы отличить их как нечто новое, это немного странно, но, похоже, работает, поэтому добавьте:

  serviceIntent.setData(Uri.parse("uri::somethingrandomandunique");
0 голосов
/ 15 марта 2016
 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); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...