【问题标题】:Managing current View and Class<?> objects管理当前的 View 和 Class<?> 对象
【发布时间】:2016-10-26 15:43:09
【问题描述】:

我有一个应用范围的实用程序类 AppUtils,我可以在其中随时发布应用相关信息:

  1. 当我在应用程序中时,作为 SnackBar 使用
  2. 或通过通知管理器

例如,当消息作为 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(用于通知意图)。

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

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

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

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

有没有更优雅的方法来跟踪当前显示的 Activity 或活动的 Class ?

【问题讨论】:

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


    【解决方案1】:

    举个例子……创建一个在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() 来确定您的任何活动当前是否在前台。如果您需要对当前可见 Activity 的引用,您也可以在此处处理。

    【讨论】:

    • 这非常适合活动;很不错! Fragments 有类似的东西吗?
    • Android SDK 不为 Fragment 提供此功能,但您可以创建一个 Base Fragment,所有的 Fragment 都从该基础 Fragment 扩展而来。在该 Base Fragment 生命周期事件中,您将执行回调。您的 Application 类可以设置为这些回调的侦听器。
    • 是否有将应用程序设置为侦听器的片段生命周期回调的示例?
    【解决方案2】:

    您可以使用 ActivityManager 获取当前 Activity。

    This link explains how.

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

    getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
    

    【讨论】:

    • 是啊,那我反正要追踪对应的ID R.id.fragment_container。
    • 如果回答有帮助,请检查是否正确。
    • 不,不是。我不想跟踪容器
    【解决方案3】:

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

    这样工作:

    1. 您在每个感兴趣的组件完全初始化后订阅事件。
    2. 接收并处理事件,可选择取消事件,如果组件认为其他组件不需要它。
    3. 当组件不再需要事件时取消订阅(View 被隐藏/分离,Fragment 被销毁,Activity 被关闭/最小化)。

    这种方法的美妙之处在于灵活性——您始终可以围绕每个事件添加更多逻辑,而不会影响订阅它的其他组件。此外,您可以为每个组件单独选择订阅/取消订阅的最佳时间(例如,可以随时发出通知,但仅当 Activity 可见并恢复时才应显示snackbars)。

    在您的应用中实现事件总线有多种不错的选择:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2023-03-16
      • 2013-03-04
      相关资源
      最近更新 更多