在不退出Activity,Android appwidget的情况下从服务刷新和重新加载活动

时间:2011-11-03 16:59:53

标签: android

美好的一天,我有一个活动,我使用待处理的Intent从appwidget上的图标导航到。一切都在服务类中完成。现在,活动有一个刷新按钮,当按下该按钮时,它会发送一个intent,该intent调用服务上的onStart()方法来更新自身并执行一些Web操作。如何在不暂时存在活动的情况下反映活动中服务可能发生的更改。

服务活动:

if(intent.getExtras()!= null){
      appWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);

      //if i get this action from my detailedinfo class add a boolean to it

      if(intent.getAction() == refresh_action){

     // boolean variable to hold condition
          my_action = true;
      }



Intent forecast = new Intent(this,detailedInfo.class );
    forecast.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
        forecast.putExtra("cityname", city);

 PendingIntent forecastIntent = PendingIntent.getActivity(this, 0, forecast, 0);

        /*onclick to go to detailedInfo class*/
        remoteView.setOnClickPendingIntent(R.id.city_image_id, forecastIntent);


        if(my_action == true){          
            //Log.d(TAG, "my_action is true, performing pending intent");

            try {
                forecastIntent.send(this, 0, forecast);
            } catch (CanceledException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

在Activity类中:

Intent service = new Intent(this, cityService.class);
        service.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        service.setAction(refresh_action);
        Uri data = Uri.withAppendedPath(Uri.parse(CityWidgetProvider.URI_SCHEME + "://widget/id/"), String.valueOf(appWidgetId));
        service.setData(data);
               startService(service);

我尝试将setAction()方法添加到调用服务的intent,然后使用相同的pendingIntent(尽管我认为是一个很长的镜头),但它们似乎被忽略了。请问我该怎么做以及我可能做错了什么。像往常一样,任何帮助都非常感谢。谢谢。

1 个答案:

答案 0 :(得分:1)

我不是100%清楚你要做什么,但最简单的方法是在你的Activity onResume中注册一个BroadcastReceiver(在onPause中删除它)。当服务完成它需要做的任何事情时,广播该信息。

在活动中

public static final String ACTION_STRING = "THE_BIG_ACTION";
private BroadcastReceiver receiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            // Do whatever you want here
            Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT);

        }
    };

    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(receiver, new IntentFilter(ACTION_STRING));
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(receiver);
    }

在服务中,当你完成后,只需致电...

sendBroadcast(new Intent(YourActivityClass.ACTION_STRING));

如果您想要包含一些数据,只需将其置于意图中,就像启动活动时一样。

如果服务完成时您的活动已关闭,并且用户返回该活动,您将错过通知。这是一个需要解决的不同问题。