Java 电池电量小部件不更新
我需要在小部件中自动显示电池电量,我尝试了很多解决方案来解决这个问题,但不幸的是小部件没有更新 这是我的密码: Manifest.xml ScreenMonitorService.javaJava 电池电量小部件不更新,java,android,widget,Java,Android,Widget,我需要在小部件中自动显示电池电量,我尝试了很多解决方案来解决这个问题,但不幸的是小部件没有更新 这是我的密码: Manifest.xml ScreenMonitorService.java public class BatteryWidget extends AppWidgetProvider { private static final String ACTION_BATTERY_UPDATE = "com.leenah.battery.action.UPDATE"; private in
public class BatteryWidget extends AppWidgetProvider {
private static
final String ACTION_BATTERY_UPDATE = "com.leenah.battery.action.UPDATE";
private int batteryLevel = 0;
public static void turnAlarmOnOff(Context context, boolean turnOn) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(ACTION_BATTERY_UPDATE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
if (turnOn) { // Add extra 1 sec because sometimes ACTION_BATTERY_CHANGED is called after the first alarm alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis() + 1000, 300 * 1000, pendingIntent); LogFile.log("Alarm set"); } else { alarmManager.cancel(pendingIntent); LogFile.log("Alarm disabled"); } }
@Override public void onEnabled (Context context){
super.onEnabled(context);
LogFile.log("onEnabled()");
turnAlarmOnOff(context, true); // context.startService(new Intent(context, ScreenMonitorService.class)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { context.startForegroundService(new Intent(context, ScreenMonitorService.class)); } else { context.startService(new Intent(context, ScreenMonitorService.class)); }
//
}
@Override public void onUpdate (Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds){
super.onUpdate(context, appWidgetManager, appWidgetIds);
LogFile.log("onUpdate()");
// Sometimes when the phone is booting, onUpdate method gets called before onEnabled() int currentLevel = calculateBatteryLevel(context); if (batteryChanged(currentLevel)) { batteryLevel = currentLevel; LogFile.log("Battery changed"); }
updateViews(context);
}
private boolean batteryChanged ( int currentLevelLeft){
return (batteryLevel != currentLevelLeft);
}
@Override public void onReceive (Context context, Intent intent){
super.onReceive(context, intent);
LogFile.log("onReceive() " + intent.getAction());
if (intent.getAction().equals(ACTION_BATTERY_UPDATE)) {
int currentLevel = calculateBatteryLevel(context);
if (batteryChanged(currentLevel)) {
LogFile.log("Battery changed");
batteryLevel = currentLevel;
updateViews(context);
}
} ///
}
@Override public void onDisabled (Context context){
super.onDisabled(context);
LogFile.log("onDisabled()");
turnAlarmOnOff(context, false);
context.stopService(new Intent(context, ScreenMonitorService.class));
}
private int calculateBatteryLevel (Context context){
LogFile.log("calculateBatteryLevel()");
Intent batteryIntent = context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
return level * 100 / scale;
}
private void updateViews (Context context){
LogFile.log("updateViews()");
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
views.setTextViewText(R.id.batteryText, batteryLevel + " %");
ComponentName componentName = new ComponentName(context, BatteryWidget.class);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
appWidgetManager.updateAppWidget(componentName, views);
////////////////
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(componentName);
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.batteryText);
}
}
因此,小部件仅在第一次正确显示,不再更新
请帮我解决这个问题,我会等待你的答案。
祝您度过愉快的一天您的警报
Intent
在Oreo及以上版本上不起作用,因为隐式Intent
s不再适用于清单注册接收者。无论如何,您应该始终使用明确的意图
——例如新意图(context,BatteryWidget.class)、setAction(ACTION\u BATTERY\u UPDATE)
——如果您正在Oreo或更高版本上进行测试,寻找该广播,这可能就是为什么它看起来对您不起作用的原因。除此之外,很难准确地说出您的代码是什么,因为在发布的代码中,似乎有几行代码无意中合并到了注释行中。@MikeM。非常感谢你!我已经使用了显式意图作为您的示例,它工作正常。请添加您的答案以便接受。
public class BatteryWidget extends AppWidgetProvider {
private static
final String ACTION_BATTERY_UPDATE = "com.leenah.battery.action.UPDATE";
private int batteryLevel = 0;
public static void turnAlarmOnOff(Context context, boolean turnOn) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(ACTION_BATTERY_UPDATE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
if (turnOn) { // Add extra 1 sec because sometimes ACTION_BATTERY_CHANGED is called after the first alarm alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis() + 1000, 300 * 1000, pendingIntent); LogFile.log("Alarm set"); } else { alarmManager.cancel(pendingIntent); LogFile.log("Alarm disabled"); } }
@Override public void onEnabled (Context context){
super.onEnabled(context);
LogFile.log("onEnabled()");
turnAlarmOnOff(context, true); // context.startService(new Intent(context, ScreenMonitorService.class)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { context.startForegroundService(new Intent(context, ScreenMonitorService.class)); } else { context.startService(new Intent(context, ScreenMonitorService.class)); }
//
}
@Override public void onUpdate (Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds){
super.onUpdate(context, appWidgetManager, appWidgetIds);
LogFile.log("onUpdate()");
// Sometimes when the phone is booting, onUpdate method gets called before onEnabled() int currentLevel = calculateBatteryLevel(context); if (batteryChanged(currentLevel)) { batteryLevel = currentLevel; LogFile.log("Battery changed"); }
updateViews(context);
}
private boolean batteryChanged ( int currentLevelLeft){
return (batteryLevel != currentLevelLeft);
}
@Override public void onReceive (Context context, Intent intent){
super.onReceive(context, intent);
LogFile.log("onReceive() " + intent.getAction());
if (intent.getAction().equals(ACTION_BATTERY_UPDATE)) {
int currentLevel = calculateBatteryLevel(context);
if (batteryChanged(currentLevel)) {
LogFile.log("Battery changed");
batteryLevel = currentLevel;
updateViews(context);
}
} ///
}
@Override public void onDisabled (Context context){
super.onDisabled(context);
LogFile.log("onDisabled()");
turnAlarmOnOff(context, false);
context.stopService(new Intent(context, ScreenMonitorService.class));
}
private int calculateBatteryLevel (Context context){
LogFile.log("calculateBatteryLevel()");
Intent batteryIntent = context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
return level * 100 / scale;
}
private void updateViews (Context context){
LogFile.log("updateViews()");
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
views.setTextViewText(R.id.batteryText, batteryLevel + " %");
ComponentName componentName = new ComponentName(context, BatteryWidget.class);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
appWidgetManager.updateAppWidget(componentName, views);
////////////////
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(componentName);
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.batteryText);
}
}
public class ScreenMonitorService extends Service {
private static BroadcastReceiver screenOffReceiver;
private static BroadcastReceiver screenOnReceiver;
private static BroadcastReceiver userPresentReceiver;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
registerScreenOffReceiver();
registerScreenOnReceiver();
registerUserPresentReceiver();
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(screenOffReceiver);
unregisterReceiver(screenOnReceiver);
unregisterReceiver(userPresentReceiver);
}
private void registerScreenOffReceiver() {
screenOffReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
LogFile.log(intent.getAction());
BatteryWidget.turnAlarmOnOff(context, false);
}
};
registerReceiver(screenOffReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));
}
private void registerScreenOnReceiver() {
screenOnReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
LogFile.log(intent.getAction());
KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
if (!keyguardManager.inKeyguardRestrictedInputMode())
BatteryWidget.turnAlarmOnOff(context, true);
}
};
registerReceiver(screenOnReceiver, new IntentFilter(Intent.ACTION_SCREEN_ON));
}
private void registerUserPresentReceiver() {
userPresentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
LogFile.log(intent.getAction());
BatteryWidget.turnAlarmOnOff(context, true);
}
};
registerReceiver(userPresentReceiver, new IntentFilter(Intent.ACTION_USER_PRESENT));
}
}