Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android活动如何与应用程序小部件(主屏幕小部件)交互?_Android_Android Widget_Android Activity - Fatal编程技术网

android活动如何与应用程序小部件(主屏幕小部件)交互?

android活动如何与应用程序小部件(主屏幕小部件)交互?,android,android-widget,android-activity,Android,Android Widget,Android Activity,如果我有一个活动,那么如何在android小部件中使用它的一些方法(功能)。我必须重新创造逻辑吗?互动的方式是什么?通过意图还是通过服务?请回复 更新:我有一个.java类,它实现了Parcelable并包含返回列表的方法。我想在我的小部件中列出该列表 public Stores getStoreListings() { Log.i("List val","mStoreListings"); return mStoreListings; } 我可以在我

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

更新:我有一个.java类,它实现了Parcelable并包含返回列表的方法。我想在我的小部件中列出该列表

public Stores getStoreListings() {
        Log.i("List val","mStoreListings");
        return mStoreListings;
    } 
我可以在我的应用程序小部件中使用Intent来获取此方法或变量吗?这不是一项活动


更新2:使用异步任务,它也不工作..我哪里出错了??请帮忙

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);
        }

    }
}
公共类ListViewWidget扩展了AppWidgetProvider{
@凌驾
公共void onUpdate(上下文上下文,AppWidgetManager AppWidgetManager,int[]AppWidgetId){
onUpdate(上下文、appWidgetManager、AppWidgetId);
RemoteViews updateViews=新的RemoteView(context.getPackageName(),R.layout.list\u layout);
ComponentName thisWidget=新的ComponentName(上下文,ListViewWidget.class);
字符串url=String.valueOf(“https://api.paypal.com/v1/stores?view=local&lat=37.3756096&lng=-121.9239449&radius=50&count=20&start\u id=1&country\u code=US”);
FetchTask FetchTask=新建FetchTask();
//fetchTask.appWidgetManager=appWidgetManager;
//onPostExecute(updateViews,上下文);
fetchTask.execute();
//startService(新意图(context,UpdateService.class));
}
公共静态类FetchTask扩展了AsyncTask{
字符串文本=空;
@凌驾
受保护的存储在后台(URL…arg0){
//TODO自动生成的方法存根
HttpClient HttpClient=新的DefaultHttpClient();
HttpContext localContext=新的BasicHttpContext();
HttpGet HttpGet=新的HttpGet(“https://api.paypal.com/v1/stores?view=local&lat=37.3756096&lng=-121.9239449&radius=50&count=20&start\u id=1&country\u code=US”);
Stores newList=新门店();
试一试{
HttpResponse response=httpClient.execute(httpGet,localContext);
HttpEntity=response.getEntity();
text=String.valueOf(实体);
//将列表指定给正确的实体类型
//新列表=。。;
Log.i(“使用Http调用更新时的内部”,“文本”+文本);
}
捕获(例外e){
e、 printStackTrace();
}
返回newList;
}
受保护的void onPostExecute(RemoteViews updateViews,上下文){
意向意向=新意向(“android.appwidget.action.appwidget_UPDATE”);
PendingEvent PendingEvent=PendingEvent.getBroadcast(上下文,0,意图,PendingEvent.FLAG_UPDATE_CURRENT);
updateViews.setTextViewText(R.id.text\u视图,text);
setonClickPendingEvent(R.id.next,PendingEvent);
//将此小部件的更新推送到主屏幕
ComponentName thisWidget=新的ComponentName(这个,ListViewWidget.class);
AppWidgetManager=AppWidgetManager.getInstance(此);
updateAppWidget(这个小部件,updateViews);
}
}
}

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

应用程序小部件在其生命周期中的工作方式不同。如果希望应用程序小部件定期更新,可以在应用程序小部件配置xml中进行设置。当需要更新数据时,Android会给你的提供商打电话

在这一点上,您将启动服务,在那里您可以重用逻辑来获取您需要的任何数据。唯一不同的是,一旦完成了数据的提取,就需要将数据发送给widget提供者,而不是活动


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

好的,您现在有活动和服务(或异步任务),对吗?athor想说的是-您的数据获取逻辑应该在服务或异步任务中。但根据AppWidget生命周期,您需要使用该服务按计划获取新数据并更新您的小部件视图(通过RemoteView)。 在这里,您可以重用数据获取逻辑—例如,如果您的活动中有AsyncTask—您可以在此新服务中使用相同AsyncTask的实例

UPD。
不可以。通常,您应该启动自己的服务类,该类派生自IntenService(例如),并带有来自小部件的intent。然后,在服务中,您只需以与以前相同的方式获取所有数据即可

选中此项:AppWidgetProvider扩展BroadcastReceiver类。 " BroadcastReceiver对象仅在onReceive调用期间有效(上下文、意图)。任何需要异步操作的操作都不可用,因为您需要从函数返回以处理异步操作,但此时BroadcastReceiver不再处于活动状态,因此系统可以在异步操作完成之前终止其进程

特别是,您不能在BroadcastReceiver中显示对话框或绑定到服务。对于前者,您应该使用NotificationManager API。对于后者,您可以使用Context.startService()向服务发送命令 "
有关

的更多详细信息您是否在谈论应用程序小部件(主屏幕小部件)?你到底想做什么?@athor我说的是应用程序小部件。所以我有一个活动,它使用服务来显示某些数据。其中一个就是从附近的地方到我的位置。现在我想为它创建一个小部件,那么我是否需要在小部件中实现整个逻辑,或者我是否可以通过一些回调方法、意图或服务重用小部件中的逻辑?我正在尝试创建一个类似于Flipboard(更新新闻)或google plus的小部件,用于在主页上更新您的最新通知