2011-08-17 111 views
0

我制作了用于阅读新闻项的小部件。如果我在主屏幕上放置一个小部件,一切都很好。但是,如果我在主屏幕上放置了一个后缀,并将其删除,则该小部件的服务将停止。因此,如果小部件进入更新方法,则会发生错误。无法在Android中启动服务

java.lang.RuntimeException: Unable to start service [email protected] with Intent { flg=0x10000000 cmp=news/.WidgetActivity$UpdateService bnds=[26,97][79,151] }: java.lang.NullPointerException 

一个空指针是在这一行:

RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); 

下面的代码:

public static class UpdateService extends Service { 
    @Override 
    public void onStart(Intent intent, int startId) { 

     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); 

     remoteViews.setViewVisibility(R.id.WidgetRefresh_btn, View.GONE); 
     remoteViews.setViewVisibility(R.id.progressWidget, View.VISIBLE); 

     appWidgetManager.updateAppWidget(appWidgetId, remoteViews); 

     WidgetActivity.Widget.onUpdate(context, appWidgetManager, appWidgetIds); 

    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 
} 

回答

2

context对象可能是空。由于您的服务范围是Context,因此您最好使用this.getPackageName()或仅使用getPackageName()

+0

Tnx!恩......认为问题是固定的。但是现在我又遇到了另一个问题:如果我有两个小部件,并且按下第一个小部件上的按钮,则第二个小部件会更新他的自定义。这与WidgetIdd有什么关系? – Johan

+0

这取决于您设置为第一个小部件的意图。如果它触发appwidgets的更新机制,它可能会更新第二个。但是,如果没有整个更新代码,很难说清楚。如果你无法弄清楚,我建议开一个新的问题。该id仅是每个appwidget实例的唯一引用。不应该被分配到这两个小部件,所以我猜它与它无关。 – 2011-08-17 19:51:27