当前位置: 代码迷 >> Android >> 关于在AppWidget中开启一个service的有关问题
  详细解决方案

关于在AppWidget中开启一个service的有关问题

热度:96   发布时间:2016-05-01 22:08:20.0
关于在AppWidget中开启一个service的问题。
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 ...  

求解啊。。。。



------解决方案--------------------
探讨

引用:

public static class updateService extends Service {

注意是static


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