读书人

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

发布时间: 2012-03-14 12:01:12 作者: rapoo

关于在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类单独创建了。不用内部类了。 成功了。。

读书人网 >Android

热点推荐