0

如果我有一个活动,那么如何在 android 小部件中使用它的一些方法(功能)。我必须重新创建逻辑吗?交互方式有哪些?通过意图还是通过服务?请回复。

更新:我有一个实现 Parcelable 并包含返回列表的方法的 .java 类。我想要我的小部件中的那个列表。

public Stores getStoreListings() {
        Log.i("List val","mStoreListings");
        return mStoreListings;
    } 

我可以在我的应用小部件中使用 Intent 来获取此方法或变量吗?这不是活动。。


UPDATE2:使用异步任务,它也不起作用..我哪里出错了?请帮忙..

public class ListViewWidget extends AppWidgetProvider{

    @Override
    public void onUpdate(Context context,AppWidgetManager appWidgetManager, int []appWidgetIds){
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.list_layout);
        ComponentName thisWidget = new ComponentName(context,ListViewWidget.class);

        String url=String.valueOf("https://api.paypal.com/v1/stores?view=local&lat=37.3756096&lng=-121.9239449&radius=50&count=20&start_id=1&country_code=US");

        FetchTask fetchTask=new FetchTask();
        //fetchTask.appWidgetManager=appWidgetManager;
        //fetchTask.onPostExecute(updateViews,context);
        fetchTask.execute();
        //context.startService(new Intent(context,UpdateService.class));
    }
    public static class FetchTask extends AsyncTask<URL,Integer,Stores>{

        String text=null;
        @Override
        protected Stores doInBackground(URL... arg0) {
            // TODO Auto-generated method stub
            HttpClient httpClient=new DefaultHttpClient();
            HttpContext localContext=new BasicHttpContext();
            HttpGet httpGet=new HttpGet("https://api.paypal.com/v1/stores?view=local&lat=37.3756096&lng=-121.9239449&radius=50&count=20&start_id=1&country_code=US");

            Stores newList=new Stores();
            try{

                HttpResponse response=httpClient.execute(httpGet,localContext);
                HttpEntity entity=response.getEntity();
                text=String.valueOf(entity);


                //assign the list to the the correct entity type
                //newList=..;
                Log.i("Inside on update with Http call","Text"+text);
            }
            catch(Exception e){
                e.printStackTrace();
            }


            return newList;
        }

        protected void onPostExecute(RemoteViews updateViews,Context context){

            Intent intent=new Intent("android.appwidget.action.APPWIDGET_UPDATE");

            PendingIntent pendingIntent=PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            updateViews.setTextViewText(R.id.text_view, text);
            updateViews.setOnClickPendingIntent(R.id.next, pendingIntent);

            // Push update for this widget to the home screen
            ComponentName thisWidget = new ComponentName(this, ListViewWidget.class);
            AppWidgetManager manager = AppWidgetManager.getInstance(this);
            manager.updateAppWidget(thisWidget, updateViews);
        }

    }
}
4

2 回答 2

1

您可以使用相同的服务器端逻辑,但您可能希望将其复制并粘贴到新服务中。

App Widgets 在其生命周期中的工作方式不同。如果您希望您的应用小部件定期更新,您可以在应用小部件配置 xml 中进行设置。然后,Android 将在需要更新数据时调用您的提供程序。

那时您将启动您的服务,您可以重用逻辑来获取您需要的任何数据。唯一不同的是,一旦数据的获取完成,它需要被发送到小部件提供者而不是活动。

这是小部件的基本概述,但要回答您的问题,最好重新实现您的逻辑以适应应用小部件的生命周期。

于 2013-06-11T01:54:52.530 回答
1

好的,你现在有活动和服务(或 AsyncTask),对吧?athor 想说什么 - 您的数据获取逻辑应该在 Service 或 AsyncTask 中。但是根据 AppWidget 生命周期,您需要使用 Service 按计划获取新数据并更新您的小部件视图(通过 RemoteViews)。这就是您可以重用数据获取逻辑的地方 - 例如,如果您的活动中有 AsyncTask - 您可以在这个新服务中使用相同 AsyncTask 的实例。

UPD。不。通常,您应该从您的小部件中启动您自己的从 IntenService 派生的服务类(例如)。然后在服务中,您可以像以前一样简单地获取所有数据。

检查这一点:AppWidgetProvider 扩展了 BroadcastReceiver 类。" BroadcastReceiver 对象仅在调用 onReceive(Context, Intent) 期间有效。任何需要异步操作的东西都不可用,因为您需要从函数返回来处理异步操作,但此时BroadcastReceiver 不再处于活动状态,因此系统可以在异步操作完成之前自由地终止其进程。

特别是,您可能不会在 BroadcastReceiver 中显示对话框或绑定到服务。对于前者,您应该改用 NotificationManager API。对于后者,您可以使用 Context.startService() 向服务发送命令“有关http://developer.android.com/reference/android/content/BroadcastReceiver.html的 更多详细信息

于 2013-06-11T13:21:42.283 回答