【问题标题】:Android custom class - Hook into Activity LifecycleAndroid 自定义类 - 挂钩到 Activity 生命周期
【发布时间】:2017-06-07 08:48:18
【问题描述】:

我有一个想要监控电池寿命的活动。我想将电池寿命解耦到它自己的类中。我可以在活动中执行以下操作

onPause() {
  batteryChecker = new BatteryChecker();
}
onResume() {
   batteryChecker.kill();
}

我宁愿这样做:

onCreate() {
  bg = new BatteryChecker(this);
}

有什么方法可以让 BatteryChecker 响应附加活动的 onPause/onResume?

【问题讨论】:

  • 是的——你的第一个例子。没有全局 onPause/onResume 框架。这是一件好事,因为它很难与多个活动和服务一起使用。
  • 但是没有办法“挂钩”那些回调?
  • 不。您可以使用事件总线或可观察的或类似的东西构建一个。但是设置起来会很痛苦,并且处理多项活动可能具有挑战性。

标签: android android-activity lifecycle


【解决方案1】:

当您创建Application 类时,您的BatteryChecker 可以实现ActivityLifecycleCallbacks 并在onCreate 中调用registerActivityLifecycleCallbacks,在这种情况下,您的自定义类将接收所有活动生命周期回调。

在此处查看更多信息 - ActivityLifecycleCallbacks

这是有争议的好处,因为您仍然必须使用 Activity 事件,但是您可以在活动的 onCreate() 中附加到 Activity 生命周期,并在其 onDestroy() 事件中也从它分离。

从卫生角度来看,这可能会有所帮助,具体取决于您的代码在其现有生命周期块中的“繁忙程度”,但不一定是一种好的做法。

在您的BatteryChecker 班级中:

public class BatteryChecker implements Application.ActivityLifecycleCallbacks {
    private boolean paused = true ;
...
    @Override
    public void onActivityResumed(@NonNull Activity activity) {
        if (paused) doResumeStuff();
        paused = false;
    }

    @Override
    public void onActivityPaused(@NonNull Activity activity) {
        if (!paused) doPauseStuff();
        paused = true;
    }
}

在你的活动中:

private BatteryChecker batteryChecker = null;

@Override
public void onCreate(final Bundle savedInstanceState) {
   batteryChecker = new BatteryChecker();
   getApplication().registerActivityLifecycleCallbacks(batteryChecker);
}

@Override
public void onDestroy() {
   getApplication().unRegisterActivityLifecycleCallbacks(batteryChecker);
}

还应注意,您永远不会在 BatteryChecker 类中看到 onActivityDestroyed() 事件触发,因为它的范围在实际活动的生命周期范围内。

【讨论】:

  • 是的,我认为 ActivityLifecycleCallbacks 是我需要的,但是在 Application 类中调用 registerActivityLifecycleCallbacks 并没有帮助。我看不到为 BatteryChecker 类注册它的方法。
【解决方案2】:

你需要一个类扩展广播接收器

 public class PowerConnectionReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
            boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                                status == BatteryManager.BATTERY_STATUS_FULL;

            int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
            boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB;
            boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;
        }
    }

更多信息。 Monitoring Battery State

【讨论】:

  • 我知道使用广播接收器来监控电池,谢谢。问题是关于活动生命周期钩子。
猜你喜欢
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 2019-12-02
相关资源
最近更新 更多