管理当前的View和Class <?>对象

Ral*_*kum 9 android class view android-notifications android-snackbar

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

  1. 要么作为SnackBar,当我在应用程序中时
  2. 或通过通知经理

例如当mesaages作为Snackbar时,我需要跟踪当前显示的View容器以使用它Snackbar.make(view, text, length); 当我想通过发布该消息时NotificationManager.notify(int, Builder);,我需要这里的Class签名

Intent resultIntent = new Intent(this, ResultActivity.class);
Run Code Online (Sandbox Code Playgroud)

因此我在我的AppUtils中:

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

在我的项目中,我可以记住当前视图(对于Snackbar参数)和cls(对于Notification Intent).

接下来,我清除这些参数,例如当我将应用程序留在后台时:

public static void clearCurrentViewAndClass()
{
    view = null;
    cls = null;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 7

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

<application
        android:name=".MyApp"
        ...>
Run Code Online (Sandbox Code Playgroud)

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

registerActivityLifecycleCallbacks(new MyAppActivityLifecycleCallbacks());
Run Code Online (Sandbox Code Playgroud)

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

private static int mActivityCount = 0;

public static boolean isAppInForeground() {
    return mActivityCount != 0;
}
Run Code Online (Sandbox Code Playgroud)

最后设置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--;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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