如果我有活动,那么如何在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);
}
}
}
答案 0 :(得分:1)
您可以使用相同的服务器端逻辑,但您可能希望将其复制并粘贴到新服务中。
App Widgets在生命周期中的工作方式不同。如果您希望应用程序小部件定期更新,请在app小部件config xml中进行设置。然后Android会在需要更新数据时致电您的提供商。
此时您将开始服务,在那里您可以重用逻辑来获取所需的任何数据。唯一不同的是,一旦完成数据的提取,就需要将其发送到小部件提供者而不是活动。
这是对小部件的基本概述,但为了回答您的问题,最好重新实现您的逻辑以适应应用小部件生命周期。
答案 1 :(得分: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
的更多详情