Ral*_*kum 9 android class view android-notifications android-snackbar
我有一个应用程序范围的实用程序类AppUtils,我可以在任何速度发布应用程序相关信息:
例如当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()来确定您的任何活动当前是否在前台.如果您需要对当前可见活动的引用,您也可以在此处理.