ようこそ皆さん
ユーザーがウィジェットを押すと、ウィジェットが停止し、ユーザーがもう一度押すと、ウィジェットが自分の機能をオンにしたい
この投稿のソリューションを使用して、ウィジェットで onClick を実現しています: Clickable widgets in android
このソリューションは、android 2.2 スマートフォンと android 4.1 スマートフォンでは正常に機能しますが、android 2.3.6 を搭載した Nexus One では機能しません。ウィジェットをクリックしても何も起こりません...
これは私の完全なウィジェットクラスです:
public class mWidgetProvider extends AppWidgetProvider{
public static String ACTION_WIDGET_CLICK = "ActionWidgetClick";
public static final String ACTION_AUTO_UPDATE = "AUTO_UPDATE";
DecimalFormatSymbols symbols;
DecimalFormat tempDecimalFormat;
int pMaxFreq=-1;
String cCurrentFreq=null;
int freq = 0;
float usage =-1;
BufferedReader freqBufferedReader;
PowerManager pm;
RemoteViews remoteViews;
ComponentName thisWidget;
WidgetAlarm widgetAlarm;
ActivityManager manager;
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
context.stopService(new Intent(context, UpdateService.class));
//stop alarm
widgetAlarm = new WidgetAlarm(context.getApplicationContext());
widgetAlarm.stopAlarm();
System.out.println("XXXXX onDISABLED");
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);
System.out.println("XXXXX onDELETED");
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
context.startService(new Intent(context, UpdateService.class));
remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
thisWidget = new ComponentName(context, mWidgetProvider.class );
//preparamos el evento para cuando el usuario presiona en el widget, ese evento será recibido en onReceive()
Intent active = new Intent(context, mWidgetProvider.class);
active.setAction(ACTION_WIDGET_CLICK);
PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, 0, active, 0);
remoteViews.setOnClickPendingIntent(R.id.fondo, actionPendingIntent);
AppWidgetManager.getInstance(context).updateAppWidget( thisWidget, remoteViews );
// start alarm
widgetAlarm = new WidgetAlarm(context.getApplicationContext());
widgetAlarm.startAlarm();
System.out.println("XXXXX onUPDATE");
}
@Override
public void onReceive(Context context, Intent intent){
if (intent.getAction().equals(ACTION_WIDGET_CLICK)){
switchWidget(context);
}else if(intent.getAction().equals(ACTION_AUTO_UPDATE)){
symbols = new DecimalFormatSymbols(Locale.GERMAN);
symbols.setDecimalSeparator('.');
tempDecimalFormat = new DecimalFormat("#.#", symbols);
pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
thisWidget = new ComponentName(context, mWidgetProvider.class );
if (pm.isScreenOn()){
/*
here i do some work to update the textviews of the widget
*/
AppWidgetManager.getInstance(context).updateAppWidget( thisWidget, remoteViews );
System.out.println("XXXXX UPDATING WIDGET");
}
}else{
super.onReceive(context, intent);
}
System.out.println("XXXXX onRECEIVE: "+intent.getAction());
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
System.out.println("XXXXX onENABLED");
}
public void switchWidget(Context context){
symbols = new DecimalFormatSymbols(Locale.GERMAN);
symbols.setDecimalSeparator('.');
tempDecimalFormat = new DecimalFormat("#.#", symbols);
remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
thisWidget = new ComponentName(context.getPackageName(), mWidgetProvider.class.getName());
widgetAlarm = new WidgetAlarm(context.getApplicationContext());
if (isMyServiceRunning(context)==true){ //si el widget está encendido la apagamos
context.stopService(new Intent(context, UpdateService.class));
widgetAlarm.stopAlarm();
remoteViews.setTextViewText(R.id.freq,"HERE I CHANGE THE VALUE");
}
else{ //si el widget está apagado lo encendemos
context.startService(new Intent(context, UpdateService.class));
widgetAlarm.startAlarm();
remoteViews.setTextViewText(R.id.freq,"HERE I CHANGE THE VALUE");
}
AppWidgetManager.getInstance(context).updateAppWidget(thisWidget,remoteViews);
}
private boolean isMyServiceRunning(Context context) {
manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (UpdateService.class.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
public void getpMaxFreq(){
int freq = 0;
try{
//HERE I DO SOME WORK
}
catch (Exception e){e.printStackTrace();}
}
}
PD: インテントをonEnabled()
関数に入れてみましたが、結果は同じでした... Android バージョン 2.3.6 の Nexus One では機能しませんでした
挨拶