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 ... 求解啊。
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 ... 求解啊。
为什么要加个static.. 我后来把这个Service类单独创建了。不用内部类了。 成功了。。
因为是内部类。 你想在外部访问。 所以必须加static可以查查static 和内部类的用法