Widget在Android 5.1中工作不好,但在4.1、4.4等中非常完美
几年前我开发了一个小部件。到目前为止,这个小部件工作得很好。它在安卓5.1.1设备中工作不好,但在安卓4.4及更低版本中工作完美。小部件显示操作系统给出的三个数值。这些值是正确获得的,因为我可以在测试应用程序的这个小部件之外显示它们,并且它们在那个测试非小部件应用程序中得到更新 在android 5.1.1中,widgets菜单中没有显示图标,而是显示默认的android图标。另外,小部件没有被更新!!!我不知道怎么了。我需要一个小部件,必须在4.1,4.4和5.1设备上工作 Android 5.1.1小部件中发生了一些必须实现的变化?我在文档中找不到任何不同之处 这是我的小部件: 清单:Widget在Android 5.1中工作不好,但在4.1、4.4等中非常完美,android,widget,android-widget,android-appwidget,appwidgetprovider,Android,Widget,Android Widget,Android Appwidget,Appwidgetprovider,几年前我开发了一个小部件。到目前为止,这个小部件工作得很好。它在安卓5.1.1设备中工作不好,但在安卓4.4及更低版本中工作完美。小部件显示操作系统给出的三个数值。这些值是正确获得的,因为我可以在测试应用程序的这个小部件之外显示它们,并且它们在那个测试非小部件应用程序中得到更新 在android 5.1.1中,widgets菜单中没有显示图标,而是显示默认的android图标。另外,小部件没有被更新!!!我不知道怎么了。我需要一个小部件,必须在4.1,4.4和5.1设备上工作 Android 5
<receiver android:name="com.myapp.CPUWidgetProvider" android:label="@string/app_name" android:icon="@drawable/icon128">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<intent-filter>
<action android:name="AUTO_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_provider" />
</receiver>
<service android:name="com.myapp.UpdateService"/>
我的更新服务:
public class UpdateService extends Service implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mTempSensor;
double auxBatteryTemp;
String systemTemp=null;
String systemTempFarenheit=null;
String batteryTemp="25";
String batteryTempFarenheit="80";
int processorMaxFreq=-1;
DecimalFormatSymbols symbols;
DecimalFormat tempDecimalFormat;
boolean serviceDestroyed=false;
Context ctx;
PowerManager pm;
RemoteViews remoteViews;
ComponentName thisWidget;
private BroadcastReceiver mBatInfoReceiver; //Broadcast receiver for the battery temperature
private BroadcastReceiver screenoffReceiver; //Broadcast receiver for stop the alarm when the screen is off
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//System.out.println("XXXXX SERVICE START COMMAND");
/* receivers */
mBatInfoReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent intent) {
try {
auxBatteryTemp = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 0);
batteryTemp = ""+(int) (auxBatteryTemp / 10);
auxBatteryTemp=auxBatteryTemp/10;
batteryTempFarenheit = ""+(int)(((auxBatteryTemp*((float)9/5))+32));
updateTemperatures();
} catch (Exception e) {e.printStackTrace();}
}
};
screenoffReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
WidgetAlarm widgetAlarm = new WidgetAlarm(context.getApplicationContext());
widgetAlarm.stopAlarm();
}
else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
WidgetAlarm widgetAlarm = new WidgetAlarm(context.getApplicationContext());
widgetAlarm.startAlarm();
}
return;
}
};
symbols = new DecimalFormatSymbols(Locale.GERMAN);
symbols.setDecimalSeparator('.');
tempDecimalFormat = new DecimalFormat("#.#", symbols);
this.ctx = this;
pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
remoteViews = new RemoteViews(ctx.getPackageName(), R.layout.widget_layout);
thisWidget = new ComponentName( ctx, CPUWidgetProvider.class );
//Temperature sensors
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
if (Build.VERSION.SDK_INT >= 14)
mTempSensor = mSensorManager.getDefaultSensor(13); //13 = Sensor.TYPE_AMBIENT_TEMPERATURE //this constant required Android 4.0
else
mTempSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_TEMPERATURE);
mSensorManager.registerListener(this, mTempSensor, SensorManager.SENSOR_DELAY_FASTEST);
//adding receivers
registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(screenoffReceiver, filter);
//return super.onStartCommand(intent, flags, startId);
return Service.START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
try {
mSensorManager.unregisterListener(this);
unregisterReceiver(this.mBatInfoReceiver);
unregisterReceiver(this.screenoffReceiver);
serviceDestroyed=true;
} catch (Exception e) {e.printStackTrace();}
//System.out.println("XXXXX SERVICE DESTROY");
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
@Override
public void onSensorChanged(SensorEvent event) {
if (Build.VERSION.SDK_INT >= 14){
if (event.sensor.getType() == 13) { //13 = Sensor.TYPE_AMBIENT_TEMPERATURE //this constant required Android 4.0
getTemperature(event);
}
}else{
if (event.sensor.getType() == Sensor.TYPE_TEMPERATURE) {
getTemperature(event);
}
}
}
public void getTemperature(SensorEvent event){
float values[] = event.values;
if (values.length>0){
systemTemp = ""+(int)values[0];
systemTempFarenheit = ""+(int)((values[0]*((float)9/5))+32);
updateTemperatures();
}
}
public void updateTemperatures(){
if (pm.isScreenOn() && serviceDestroyed==false){
//si hemos podido obtener la temperatura del sistema, la mostramos, si no, mostramos la temperatura de la bateria.
if (systemTemp!=null){
remoteViews.setTextViewText(R.id.temp,systemTemp+"ºC"+" "+systemTempFarenheit+"ºF");
}
else{
remoteViews.setTextViewText(R.id.temp,batteryTemp+"ºC"+" "+batteryTempFarenheit+"ºF");
}
AppWidgetManager.getInstance( ctx).updateAppWidget( thisWidget, remoteViews );
//System.out.println("XXXXX SERVICE UPDATE TEMPERATURES");
}
}
}
我的应用程序小部件提供商:
public class CPUWidgetProvider extends AppWidgetProvider{
public static final String ACTION_WIDGET_CLICK = "ActionWidgetClick";
public static final String ACTION_AUTO_UPDATE = "AUTO_UPDATE";
DecimalFormatSymbols symbols;
DecimalFormat tempDecimalFormat;
int processorMaxFreq=-1;
String cpuCurrentFreq=null;
int freq = 0;
float usage =-1;
BufferedReader freqBufferedReader;
PowerManager pm;
RemoteViews remoteViews;
ComponentName thisWidget;
WidgetAlarm widgetAlarm;
ActivityManager manager;
Intent active;
PendingIntent actionPendingIntent;
@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 onEnabled(Context context) {
super.onEnabled(context);
//System.out.println("XXXXX onENABLED");
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
if (isMyServiceRunning(context)==false){
context.startService(new Intent(context, UpdateService.class));
}
remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
thisWidget = new ComponentName(context, CPUWidgetProvider.class );
//preparamos el evento para cuando el usuario presiona en el widget, ese evento será recibido en onReceive()
active = new Intent(context, CPUWidgetProvider.class);
active.setAction(ACTION_WIDGET_CLICK);
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, CPUWidgetProvider.class );
if (pm.isScreenOn()){
try{
freqBufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"))));
freq = Integer.valueOf(freqBufferedReader.readLine()).intValue();
freqBufferedReader.close();
freqBufferedReader = null;
cpuCurrentFreq=freq / 1000 + " Mhz";
}
catch (Exception Exception){
cpuCurrentFreq=null;
}
remoteViews.setTextViewText(R.id.freq,cpuCurrentFreq);
if (processorMaxFreq==-1)
getProcessorMaxFreq();
usage=(float) (freq/processorMaxFreq);
remoteViews.setTextViewText(R.id.usage,tempDecimalFormat.format(usage / 10.0D)+" %");
//preparamos el evento para cuando el usuario presiona en el widget, ese evento será recibido en onReceive()
active = new Intent(context, CPUWidgetProvider.class);
active.setAction(ACTION_WIDGET_CLICK);
actionPendingIntent = PendingIntent.getBroadcast(context, 0, active, 0);
remoteViews.setOnClickPendingIntent(R.id.fondo, actionPendingIntent);
AppWidgetManager.getInstance(context).updateAppWidget( thisWidget, remoteViews );
//System.out.println("XXXXX UPDATING WIDGET");
}
}else{
super.onReceive(context, intent);
}
//System.out.println("XXXXX onRECEIVE: "+intent.getAction());
}
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(), CPUWidgetProvider.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,"");
remoteViews.setTextViewText(R.id.usage,"OFF");
remoteViews.setTextViewText(R.id.temp,"");
}
else{ //si el widget está apagado lo encendemos
context.startService(new Intent(context, UpdateService.class));
widgetAlarm.startAlarm();
remoteViews.setTextViewText(R.id.freq,"-----");
remoteViews.setTextViewText(R.id.usage,"--");
remoteViews.setTextViewText(R.id.temp,"");
}
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 getProcessorMaxFreq(){
int freq = 0;
try{
freqBufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq"))));
freq = Integer.valueOf(freqBufferedReader.readLine()).intValue();
freqBufferedReader.close();
freqBufferedReader=null;
processorMaxFreq=(freq / 1000);
}
catch (Exception e){e.printStackTrace();}
}
}
Per和:
低轮询周期四舍五入至60000ms(一分钟)
您将看到一条logcat消息,大意是:
可疑的短间隔5000毫秒;扩展到60秒
当被问及替代方案时,缔约国说:
如果您尝试运行的频率超过每5秒一次,则报警是错误的方式。唤醒对电池寿命极为不利的设备。如果您有需要不断更新的实时UI,请使用wakelock,然后在处理程序上安排您的活动。这实际上比每秒设置一次警报更节省电池
记住,小部件只是偶尔运行;操作系统提供的最小更新周期是30分钟
Per和:
低轮询周期四舍五入至60000ms(一分钟)
您将看到一条logcat消息,大意是:
可疑的短间隔5000毫秒;扩展到60秒
当被问及替代方案时,缔约国说:
如果您尝试运行的频率超过每5秒一次,则报警是错误的方式。唤醒对电池寿命极为不利的设备。如果您有需要不断更新的实时UI,请使用wakelock,然后在处理程序上安排您的活动。这实际上比每秒设置一次警报更节省电池
记住,小部件只是偶尔运行;操作系统提供的最小更新周期是30分钟
Per和:
低轮询周期四舍五入至60000ms(一分钟)
您将看到一条logcat消息,大意是:
可疑的短间隔5000毫秒;扩展到60秒
当被问及替代方案时,缔约国说:
如果您尝试运行的频率超过每5秒一次,则报警是错误的方式。唤醒对电池寿命极为不利的设备。如果您有需要不断更新的实时UI,请使用wakelock,然后在处理程序上安排您的活动。这实际上比每秒设置一次警报更节省电池
记住,小部件只是偶尔运行;操作系统提供的最小更新周期是30分钟
Per和:
低轮询周期四舍五入至60000ms(一分钟)
您将看到一条logcat消息,大意是:
可疑的短间隔5000毫秒;扩展到60秒
当被问及替代方案时,缔约国说:
如果您尝试运行的频率超过每5秒一次,则报警是错误的方式。唤醒对电池寿命极为不利的设备。如果您有需要不断更新的实时UI,请使用wakelock,然后在处理程序上安排您的活动。这实际上比每秒设置一次警报更节省电池
记住,小部件只是偶尔运行;操作系统提供的最小更新周期是30分钟
小部件菜单由单个启动器控制:不绑定到Android版本。您不提供预览图像的原因是什么?当你说“不更新”是指你的
UpdateService
根本不运行吗?或者它运行但小部件不更新?我尝试使用previewImage和不使用previewImage。它们都不起作用。我的意思是没有收到任何更新,或者至少很低,每X分钟一次。在安卓4.4及更低版本中,它工作完美,每5秒或10秒更新一次。小部件菜单由单独的启动器控制:与安卓版本无关。您不提供预览图像的原因是什么?当你说“不更新”是指你的UpdateService
根本不运行吗?或者它运行但小部件不更新?我尝试使用previewImage和不使用previewImage。它们都不起作用。我的意思是没有收到任何更新,或者至少很低,每X分钟一次。在安卓4.4及更低版本中,它工作完美,每5秒或10秒更新一次。小部件菜单由单独的启动器控制:与安卓版本无关。您不提供预览图像的原因是什么?当你说“不更新”是指你的UpdateService
根本不运行吗?或者它运行但小部件不更新?我尝试使用previewImage和不使用previewImage。它们都不起作用。我的意思是没有收到任何更新,或者至少很低,每X分钟一次。在安卓4.4及更低版本中,它工作完美,每5秒或10秒更新一次。小部件菜单由单独的启动器控制:与安卓版本无关。您不提供预览图像的原因是什么?当你说“不更新”是指你的UpdateService
根本不运行吗?或者它运行但小部件不更新?我尝试使用previewImage和不使用previewImage。它们都不起作用。我的意思是没有更新
public class WidgetAlarm{
private final int ALARM_ID = 0;
private final int INTERVAL_MILLIS = 5000;
private Context mContext;
public WidgetAlarm(Context context){
mContext = context;
}
public void startAlarm(){
Intent alarmIntent = new Intent(CPUWidgetProvider.ACTION_AUTO_UPDATE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, ALARM_ID, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), INTERVAL_MILLIS, pendingIntent); // RTC does not wake the device up
}
public void stopAlarm(){
Intent alarmIntent = new Intent(CPUWidgetProvider.ACTION_AUTO_UPDATE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, ALARM_ID, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
}
}
public class UpdateService extends Service implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mTempSensor;
double auxBatteryTemp;
String systemTemp=null;
String systemTempFarenheit=null;
String batteryTemp="25";
String batteryTempFarenheit="80";
int processorMaxFreq=-1;
DecimalFormatSymbols symbols;
DecimalFormat tempDecimalFormat;
boolean serviceDestroyed=false;
Context ctx;
PowerManager pm;
RemoteViews remoteViews;
ComponentName thisWidget;
private BroadcastReceiver mBatInfoReceiver; //Broadcast receiver for the battery temperature
private BroadcastReceiver screenoffReceiver; //Broadcast receiver for stop the alarm when the screen is off
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//System.out.println("XXXXX SERVICE START COMMAND");
/* receivers */
mBatInfoReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent intent) {
try {
auxBatteryTemp = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 0);
batteryTemp = ""+(int) (auxBatteryTemp / 10);
auxBatteryTemp=auxBatteryTemp/10;
batteryTempFarenheit = ""+(int)(((auxBatteryTemp*((float)9/5))+32));
updateTemperatures();
} catch (Exception e) {e.printStackTrace();}
}
};
screenoffReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
WidgetAlarm widgetAlarm = new WidgetAlarm(context.getApplicationContext());
widgetAlarm.stopAlarm();
}
else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
WidgetAlarm widgetAlarm = new WidgetAlarm(context.getApplicationContext());
widgetAlarm.startAlarm();
}
return;
}
};
symbols = new DecimalFormatSymbols(Locale.GERMAN);
symbols.setDecimalSeparator('.');
tempDecimalFormat = new DecimalFormat("#.#", symbols);
this.ctx = this;
pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
remoteViews = new RemoteViews(ctx.getPackageName(), R.layout.widget_layout);
thisWidget = new ComponentName( ctx, CPUWidgetProvider.class );
//Temperature sensors
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
if (Build.VERSION.SDK_INT >= 14)
mTempSensor = mSensorManager.getDefaultSensor(13); //13 = Sensor.TYPE_AMBIENT_TEMPERATURE //this constant required Android 4.0
else
mTempSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_TEMPERATURE);
mSensorManager.registerListener(this, mTempSensor, SensorManager.SENSOR_DELAY_FASTEST);
//adding receivers
registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(screenoffReceiver, filter);
//return super.onStartCommand(intent, flags, startId);
return Service.START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
try {
mSensorManager.unregisterListener(this);
unregisterReceiver(this.mBatInfoReceiver);
unregisterReceiver(this.screenoffReceiver);
serviceDestroyed=true;
} catch (Exception e) {e.printStackTrace();}
//System.out.println("XXXXX SERVICE DESTROY");
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
@Override
public void onSensorChanged(SensorEvent event) {
if (Build.VERSION.SDK_INT >= 14){
if (event.sensor.getType() == 13) { //13 = Sensor.TYPE_AMBIENT_TEMPERATURE //this constant required Android 4.0
getTemperature(event);
}
}else{
if (event.sensor.getType() == Sensor.TYPE_TEMPERATURE) {
getTemperature(event);
}
}
}
public void getTemperature(SensorEvent event){
float values[] = event.values;
if (values.length>0){
systemTemp = ""+(int)values[0];
systemTempFarenheit = ""+(int)((values[0]*((float)9/5))+32);
updateTemperatures();
}
}
public void updateTemperatures(){
if (pm.isScreenOn() && serviceDestroyed==false){
//si hemos podido obtener la temperatura del sistema, la mostramos, si no, mostramos la temperatura de la bateria.
if (systemTemp!=null){
remoteViews.setTextViewText(R.id.temp,systemTemp+"ºC"+" "+systemTempFarenheit+"ºF");
}
else{
remoteViews.setTextViewText(R.id.temp,batteryTemp+"ºC"+" "+batteryTempFarenheit+"ºF");
}
AppWidgetManager.getInstance( ctx).updateAppWidget( thisWidget, remoteViews );
//System.out.println("XXXXX SERVICE UPDATE TEMPERATURES");
}
}
}
public class CPUWidgetProvider extends AppWidgetProvider{
public static final String ACTION_WIDGET_CLICK = "ActionWidgetClick";
public static final String ACTION_AUTO_UPDATE = "AUTO_UPDATE";
DecimalFormatSymbols symbols;
DecimalFormat tempDecimalFormat;
int processorMaxFreq=-1;
String cpuCurrentFreq=null;
int freq = 0;
float usage =-1;
BufferedReader freqBufferedReader;
PowerManager pm;
RemoteViews remoteViews;
ComponentName thisWidget;
WidgetAlarm widgetAlarm;
ActivityManager manager;
Intent active;
PendingIntent actionPendingIntent;
@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 onEnabled(Context context) {
super.onEnabled(context);
//System.out.println("XXXXX onENABLED");
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
if (isMyServiceRunning(context)==false){
context.startService(new Intent(context, UpdateService.class));
}
remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
thisWidget = new ComponentName(context, CPUWidgetProvider.class );
//preparamos el evento para cuando el usuario presiona en el widget, ese evento será recibido en onReceive()
active = new Intent(context, CPUWidgetProvider.class);
active.setAction(ACTION_WIDGET_CLICK);
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, CPUWidgetProvider.class );
if (pm.isScreenOn()){
try{
freqBufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"))));
freq = Integer.valueOf(freqBufferedReader.readLine()).intValue();
freqBufferedReader.close();
freqBufferedReader = null;
cpuCurrentFreq=freq / 1000 + " Mhz";
}
catch (Exception Exception){
cpuCurrentFreq=null;
}
remoteViews.setTextViewText(R.id.freq,cpuCurrentFreq);
if (processorMaxFreq==-1)
getProcessorMaxFreq();
usage=(float) (freq/processorMaxFreq);
remoteViews.setTextViewText(R.id.usage,tempDecimalFormat.format(usage / 10.0D)+" %");
//preparamos el evento para cuando el usuario presiona en el widget, ese evento será recibido en onReceive()
active = new Intent(context, CPUWidgetProvider.class);
active.setAction(ACTION_WIDGET_CLICK);
actionPendingIntent = PendingIntent.getBroadcast(context, 0, active, 0);
remoteViews.setOnClickPendingIntent(R.id.fondo, actionPendingIntent);
AppWidgetManager.getInstance(context).updateAppWidget( thisWidget, remoteViews );
//System.out.println("XXXXX UPDATING WIDGET");
}
}else{
super.onReceive(context, intent);
}
//System.out.println("XXXXX onRECEIVE: "+intent.getAction());
}
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(), CPUWidgetProvider.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,"");
remoteViews.setTextViewText(R.id.usage,"OFF");
remoteViews.setTextViewText(R.id.temp,"");
}
else{ //si el widget está apagado lo encendemos
context.startService(new Intent(context, UpdateService.class));
widgetAlarm.startAlarm();
remoteViews.setTextViewText(R.id.freq,"-----");
remoteViews.setTextViewText(R.id.usage,"--");
remoteViews.setTextViewText(R.id.temp,"");
}
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 getProcessorMaxFreq(){
int freq = 0;
try{
freqBufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq"))));
freq = Integer.valueOf(freqBufferedReader.readLine()).intValue();
freqBufferedReader.close();
freqBufferedReader=null;
processorMaxFreq=(freq / 1000);
}
catch (Exception e){e.printStackTrace();}
}
}