Android小部件setOnClickPendingIntent与startService冲突

时间:2016-04-27 18:02:40

标签: android widget

我正在开发一个显示天气数据的Android小部件。该小部件有一个“更新按钮”,通过启动从Web获取数据并更新小部件的IntentService,在单击时更新数据。这项工作很好,但我希望小部件在创建窗口小部件时也直接更新数据,因为现在用户必须单击窗口小部件上的更新按钮才能显示数据(直到“更新”才会显示数据 - “点击”按钮。

我尝试使用startService()启动IntentService,但是问题是小部件上的“更新按钮”停止工作(单击它时没有任何反应)。我不能让这两个人一起工作..

现在,我正在为按钮设置on click侦听器,并在配置活动(如此处所述创建http://developer.android.com/guide/topics/appwidgets/index.html#Configuring)中为窗口小部件启动服务。我也试过广播到小部件(它扩展了AppWidgetProvider),这给了我同样的问题。

这是配置活动类

public class WeatherWidgetConfigure extends AppCompatActivity{

    private AppCompatActivity wwc;
    private int widgetID;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_weather_widget_configure);
        wwc = this; 

        /*For back press*/
        setResult(RESULT_CANCELED);

        /*Get the widget ID from the intent that launched the activity*/
        Intent intent = getIntent();
        Bundle extras = intent.getExtras();
        if (extras != null) {
            widgetID = extras.getInt(
                    AppWidgetManager.EXTRA_APPWIDGET_ID,
                    AppWidgetManager.INVALID_APPWIDGET_ID);
        }else{
            widgetID = extras.getInt(
                    AppWidgetManager.EXTRA_APPWIDGET_ID,
                    AppWidgetManager.INVALID_APPWIDGET_ID);
        }


         /*Set listener to ok button*/
        Button okButton  = (Button) findViewById(R.id.ok_button);
        okButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                /*Get value from city spinner*/
                Spinner citySpinner = (Spinner) findViewById(R.id.city_spinner);
                String cityString = citySpinner.getSelectedItem().toString();

                RemoteViews views = new RemoteViews(wwc.getPackageName(), R.layout.weather_widget);

                /*Get updated weather data when update button is clicked*/
                /*Create service intent*/
                Intent serviceIntent = new Intent(wwc, WeatherService.class);
                serviceIntent.putExtra("city", cityString);
                serviceIntent.putExtra("widgetID", widgetID);
                PendingIntent pendingServiceIntent = PendingIntent.getService(wwc, widgetID*2, serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT);
                /*Attach onClick listener*/
                views.setOnClickPendingIntent(R.id.update_button, pendingServiceIntent);

                // Push update for this widget to the home screen
                AppWidgetManager manager = AppWidgetManager.getInstance(wwc);
                manager.updateAppWidget(widgetID, views);


                /*When adding THIS the button listener stops working*/
                Intent startIntent = new Intent(wwc, WeatherService.class);
                serviceIntent.putExtra("city", cityString);
                serviceIntent.putExtra("widgetID", widgetID);
                wwc.startService(serviceIntent);


                /*Create return intent, finish activity*/
                Intent resultValue = new Intent();
                resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetID);
                setResult(RESULT_OK, resultValue);
                finish();
            }
        });
    }
}

这是IntentService类

public class WeatherService extends IntentService {


    public WeatherService() {
        super("WeatherService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {

        System.out.println("Service onHandleIntent");

        try{
            /*Here weather data is catched and saved to the variable wr*/

            /*Set city, start and stop time to widget*/
            RemoteViews views = new RemoteViews(this.getPackageName(), R.layout.weather_widget);
            views.setTextViewText(R.id.city, wr.getCity());
            views.setTextViewText(R.id.start_time, TimeUtils.getHHMM(wr.iterator().next().getStart()));
            views.setTextViewText(R.id.stop_time, TimeUtils.getHHMM(wr.iterator().next().getEnd()));
            /*Set weather image to widget*/
            if (Arrays.asList("Klarvær", "Lettskyet", "Delvis skyet").contains(wr.iterator().next().getWeatherName())){
                views.setImageViewResource(R.id.widget_fc_icon, R.drawable.sun);
            }
            else if (Arrays.asList("Skyet", "Tåke").contains(wr.iterator().next().getWeatherName())){
                views.setImageViewResource(R.id.widget_fc_icon, R.drawable.cloud);
            }
            else if (Arrays.asList("Lette regnbyger", "Regnbyger", "Kraftige regnbyger", "Lette regnbyger og torden", "Regnbyger og torden", "Kraftige regnbyger og torden", "Lette sluddbyger", "Sluddbyger", "Kraftige sluddbyger", "Lette sluddbyger og torden", "Sluddbyger og torden", "Kraftige sluddbyger og torden", "Lett regn", "Regn", "Kraftig regn", "Lett regn og torden", "Regn og torden", "Kraftig regn og torden", "Lett sludd", "Sludd", "Kraftig sludd", "Lett sludd og torden", "Sludd og torden", "Kraftig sludd og torden").contains(wr.iterator().next().getWeatherName())){
                views.setImageViewResource(R.id.widget_fc_icon, R.drawable.rain);
            }
            else if (Arrays.asList("Lette snøbyger", "Snøbyger", "Kraftige snøbyger", "Lette snøbyger og torden", "Snøbyger og torden", "Kraftige snøbyger og torden", "Lett snø", "Snø", "Kraftig snø", "Lett snø og torden", "Snø og torden", "Kraftig snø og torden").contains(wr.iterator().next().getWeatherName())){
                views.setImageViewResource(R.id.widget_fc_icon, R.drawable.snow);
            }
            else{
                views.setImageViewResource(R.id.widget_fc_icon, R.drawable.star);
            }

            // Push update for this widget to the home screen
            AppWidgetManager manager = AppWidgetManager.getInstance(this);
            int currentWidgetID = intent.getIntExtra("widgetID", -1);
            manager.updateAppWidget(currentWidgetID, views);

        }catch(MalformedURLException e){
            e.printStackTrace();
        }
    }
}

这是小部件类

public class WeatherWidget extends AppWidgetProvider {

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

        System.out.println("ONUPDATE CALLED");

    }
}

0 个答案:

没有答案