我有一个应用程序范围的实用程序类AppUtils,我可以在任何速度发布应用程序相关信息:
例如当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()
来记住参数。
是否有更优雅的方式来跟踪当前显示的活动或活动类?
答案 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获取当前活动。
但是,由于可能同时存在多个片段,因此无法获取当前片段。您可以使用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模式大大提高当前代码的可维护性。订阅感兴趣的视图,活动,服务等中的特定事件将允许您处理任何数量的通知,而无需明确跟踪其接收者。
这样的工作原理如下:
这种方法的优点在于灵活性 - 您可以随时在每个事件周围添加更多逻辑,而不会影响订阅它的其他组件。此外,您可以选择为每个组件单独订阅/取消订阅的最佳时间(例如,可以随时发出通知,但只有在活动可见并恢复时才会显示小吃栏。)
在您的应用中实施活动总线有多种不错的选择: