管理当前视图和类<! - ? - >对象

时间:2016-10-26 15:43:09

标签: android class view android-notifications android-snackbar

我有一个应用程序范围的实用程序类AppUtils,我可以在任何速度发布应用程序相关信息:

  1. 作为SnackBar,当我在应用程序时
  2. 或通过通知管理员
  3. 例如当mesaages作为Snackbar时,我需要跟踪当前显示的View容器以在Snackbar.make(view, text, length);中使用它 当我想通过NotificationManager.notify(int, Builder);发布该消息时,我需要here中的类签名

    Intent resultIntent = new Intent(this, ResultActivity.class);
    

    因此,我有我的AppUtils:

    public static void setCurrentViewAndClass(View v, Class<?> c)
    {
        view = v; // view is static
        cls = c;  // cls is static
    }
    

    我可以在项目中的任何地方记住当前视图(对于Snackbar参数)和cls(对于Notification Intent)。

    此外,我清除了这些参数,例如:当我将应用程序留在后台时:

    public static void clearCurrentViewAndClass()
    {
        view = null;
        cls = null;
    }
    

    一个。当这些参数为 NOT null 时,我知道我的应用程序具有相应视图的焦点,我可以将相关消息显示为Snackbar。 B.当这些参数 null 时,我知道我的应用程序在后台,我想将相关消息显示为通知

    因此,无论何时创建或恢复片段/活动,我都会在每个setClassAndview()中调用onResume()来记住参数。

    是否有更优雅的方式来跟踪当前显示的活动或活动类?

3 个答案:

答案 0 :(得分:7)

作为示例...创建在AndroidManifest中注册的Application类(MyApp):

<application
        android:name=".MyApp"
        ...>

在MyApp应用程序类.onCreate()中设置:

registerActivityLifecycleCallbacks(new MyAppActivityLifecycleCallbacks());

在MyApp中,创建一个包含可见活动计数的静态字段,以及确定应用程序是否在前台的方法:

private static int mActivityCount = 0;

public static boolean isAppInForeground() {
    return mActivityCount != 0;
}

最后设置ActivityLifecycleCallbacks类以保持可见活动的计数:

private static final class MyAppActivityLifecycleCallbacks implements ActivityLifecycleCallbacks {

        public void onActivityCreated(Activity activity, Bundle bundle) {
            // No operations
        }

        public void onActivityDestroyed(Activity activity) {
            // No operations
        }

        public void onActivityPaused(Activity activity) {
            // No operations
        }

        public void onActivityResumed(Activity activity) {
            // No operations
        }

        public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
            // No operations
        }

        public void onActivityStarted(Activity activity) {
            mActivityCount++;
        }

        public void onActivityStopped(Activity activity) {
            mActivityCount--;
        }
    }

现在您应该能够调用MyApp.isAppInForeground()来确定您的任何活动当前是否在前台。如果您需要对当前可见活动的引用,您也可以在此处理。

答案 1 :(得分:2)

您可以使用ActivityManager获取当前活动。

This link explains how.

但是,由于可能同时存在多个片段,因此无法获取当前片段。您可以使用FragmentManager在特定ViewGroup上找到当前片段。

There were 1864443476.0% negative numbers.
There were 204178000.0% numbers equal to zero.
There were 0.0% numbers greater than zero.

答案 2 :(得分:0)

这并不是您要求的,但您可以使用event bus模式大大提高当前代码的可维护性。订阅感兴趣的视图,活动,服务等中的特定事件将允许您处理任何数量的通知,而无需明确跟踪其接收者。

这样的工作原理如下:

  1. 在完全初始化后,您可以订阅每个感兴趣组件中的事件。
  2. 接收并处理事件,如果组件认为,可选择取消事件,其他组件不需要它。
  3. 当组件不再需要事件时取消订阅(隐藏/分离视图,销毁片段,关闭/最小化活动)。
  4. 这种方法的优点在于灵活性 - 您可以随时在每个事件周围添加更多逻辑,而不会影响订阅它的其他组件。此外,您可以选择为每个组件单独订阅/取消订阅的最佳时间(例如,可以随时发出通知,但只有在活动可见并恢复时才会显示小吃栏。)

    在您的应用中实施活动总线有多种不错的选择:

    1. Global Android broadcasts:当您有多个对常见事件感兴趣的高阶组件(活动,服务,广播接收器)时最适合。您可以使用意图过滤器优先级和有序广播来取消事件处理中途。
    2. LocalBroadcastManager。死简单,功能很少,但也很容易使用熟悉的API。
    3. Various specialized event bus libraries,选择你喜欢的。
    4. 可以用作事件总线的各种API,即使这不是它们的主要目的:RxJava(我建议阅读this article),PendingIntents,ContentResolver.notifyUri等。