public class BatteryAppWidget extends AppWidgetProvider { private int level;
private int scale;
private int percent; @Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {

super.onUpdate(context, appWidgetManager, appWidgetIds);

Intent intentService = new Intent();
intentService.setClass(context, updateService.class);

context.startService(intentService);

System.out.println("AppWidget Update..");

Intent intent = new Intent(context,BatteryPluginActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.battery_layout);
remoteViews.setOnClickPendingIntent(R.id.imageView, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);

}
}
这是我的Appwidget代码 intentService.setClass(context, updateService.class); 这边启动一个Service
这个Service是这个AppWidget里的一个内部类。代码如下。监听电池的情况
public class updateService extends Service {


private BroadcastReceiver batteryReceiver = new BroadcastReceiver()  
        {  
            @Override  
            public void onReceive(Context context, Intent intent) {  
                // TODO Auto-generated method stub  
            
             System.out.println("Received ...");
            
             level = intent.getIntExtra("level", 0);
scale = intent.getIntExtra("scale", 100);
percent = (level * 100) / scale; 
System.out.println(level);
System.out.println(scale);
System.out.println(percent);
            }  
              
        };  

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

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);

System.out.println("service started");

registerReceiver(batteryReceiver, filter);

AppWidgetManager manager = AppWidgetManager.getInstance(this);

RemoteViews remoteView = new RemoteViews(getPackageName(), R.layout.battery_layout);

remoteView.setTextViewText(R.id.textView, percent + "%");

manager.updateAppWidget(new ComponentName(this, BatteryAppWidget.class), remoteView);

return super.onStartCommand(intent, flags, startId);
}




}
然后是Manifest里对appwidget和service的声明。代码如下<receiver android:name=".BatteryAppWidget">
         <intent-filter>
         <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
         </intent-filter>
         <meta-data android:name="android.appwidget.provider"
            android:resource="@xml/battery_info"/>
        </receiver>
        
        <service android:name=".BatteryAppWidget$updateService"></service>
程序启动Activity没问题。 可以一把AppWidget拉到home就出问题了。 问题是出在了启动这个Service的时候有问题。异常是 unable to instantiate service ...  求解啊。

解决方案 »

  1.   

    public static class updateService extends Service {注意是static
      

  2.   


    为什么要加个static.. 我后来把这个Service类单独创建了。不用内部类了。 成功了。。
      

  3.   


    因为是内部类。 你想在外部访问。  所以必须加static可以查查static 和内部类的用法
      

  4.   

    我觉得因为是内部类,所以widget必须创建后才能创建service,但onUpdate的时候估计widget还没初始化完