Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 电池电量小部件不更新_Java_Android_Widget - Fatal编程技术网

Java 电池电量小部件不更新

Java 电池电量小部件不更新,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

我需要在小部件中自动显示电池电量,我尝试了很多解决方案来解决这个问题,但不幸的是小部件没有更新

这是我的密码:

Manifest.xml

ScreenMonitorService.java

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));
}

  }