如何发现 Activity 在 Android 应用程序的前台?
How to discover what Activity is on the foreground in Android app?
我需要实现逻辑 - 如果用户在聊天 activity 那么我不需要显示新消息的推送通知。所以我需要知道屏幕上的 activity 是什么。为此,我找到了这个答案 How to get current foreground activity context in android? 但我不明白如何使用
public void registerActivityLifecycleCallbacks (Application.ActivityLifecycleCallbacks callback)
谁能给我一个完整的例子,说明如何发现屏幕上的 activity 是什么?
这是您需要执行的操作的基本结构:
public class AmpApplication extends Application implements
Application.ActivityLifecycleCallbacks {
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
}
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
// do nothing
}
@Override
public void onActivityStarted(Activity activity) {
// do nothing
}
@Override
public void onActivityResumed(Activity activity) {
if(activity instanceof ChatActivity) {
// chat activity is in foreground
}
}
@Override
public void onActivityPaused(Activity activity) {
// do nothing
}
@Override
public void onActivityStopped(Activity activity) {
// do nothing
}
}
您的推送通知由您应用中的服务 class 接收(我猜您对应用中的前景 activity 感兴趣,即相同的代码库)。
也许有更优雅、更智能的解决方案,但您也可以像这样做一个有点粗糙的解决方案:
向MyApplication extends Application
添加标志(static boolean doNotCreateNotification = false;
足以用于聊天activity禁止通知的简单场景)到MyApplication extends Application
class(添加新的,如果你不在你的项目中还有一个,确保你正确地重新配置项目以使用自定义 Application
class).
现在,对于您应用中 运行 的所有代码,包括所有活动 and/or 后台服务处理通知,此静态标志几乎 "global"。
Activity
生命周期保证onResume
在activity成为前台+活动时被调用,onPause
当activity离开这样的状态。因此,您可以在 onResume/onPause
方法中将这些中的全局标志更新为 true/false。
然后在服务处理接收到的通知中,您可以检查标志是否设置为 true
并丢弃通知数据而不在 OS.
中创建徽章
您必须实施 onActivityPaused
和 onActivityResumed()
public class YourApplication extends Application implements
Application.ActivityLifecycleCallbacks {
public static boolean isChatVisible=false;
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
}
@Override
public void onActivityCreated(Activity p0, Bundle p1) {
}
@Override
public void onActivityStarted(Activity p0) {
}
@Override
public void onActivityResumed(Activity p0) {
isChatVisible=p0 instanceof ChatActivity;
}
@Override
public void onActivityPaused(Activity p0) {
}
@Override
public void onActivityStopped(Activity p0) {
}
}
在构建通知之前,只需检查 YourApplication.isChatVisible()
我需要实现逻辑 - 如果用户在聊天 activity 那么我不需要显示新消息的推送通知。所以我需要知道屏幕上的 activity 是什么。为此,我找到了这个答案 How to get current foreground activity context in android? 但我不明白如何使用
public void registerActivityLifecycleCallbacks (Application.ActivityLifecycleCallbacks callback)
谁能给我一个完整的例子,说明如何发现屏幕上的 activity 是什么?
这是您需要执行的操作的基本结构:
public class AmpApplication extends Application implements
Application.ActivityLifecycleCallbacks {
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
}
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
// do nothing
}
@Override
public void onActivityStarted(Activity activity) {
// do nothing
}
@Override
public void onActivityResumed(Activity activity) {
if(activity instanceof ChatActivity) {
// chat activity is in foreground
}
}
@Override
public void onActivityPaused(Activity activity) {
// do nothing
}
@Override
public void onActivityStopped(Activity activity) {
// do nothing
}
}
您的推送通知由您应用中的服务 class 接收(我猜您对应用中的前景 activity 感兴趣,即相同的代码库)。
也许有更优雅、更智能的解决方案,但您也可以像这样做一个有点粗糙的解决方案:
向MyApplication extends Application
添加标志(static boolean doNotCreateNotification = false;
足以用于聊天activity禁止通知的简单场景)到MyApplication extends Application
class(添加新的,如果你不在你的项目中还有一个,确保你正确地重新配置项目以使用自定义 Application
class).
现在,对于您应用中 运行 的所有代码,包括所有活动 and/or 后台服务处理通知,此静态标志几乎 "global"。
Activity
生命周期保证onResume
在activity成为前台+活动时被调用,onPause
当activity离开这样的状态。因此,您可以在 onResume/onPause
方法中将这些中的全局标志更新为 true/false。
然后在服务处理接收到的通知中,您可以检查标志是否设置为 true
并丢弃通知数据而不在 OS.
您必须实施 onActivityPaused
和 onActivityResumed()
public class YourApplication extends Application implements
Application.ActivityLifecycleCallbacks {
public static boolean isChatVisible=false;
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
}
@Override
public void onActivityCreated(Activity p0, Bundle p1) {
}
@Override
public void onActivityStarted(Activity p0) {
}
@Override
public void onActivityResumed(Activity p0) {
isChatVisible=p0 instanceof ChatActivity;
}
@Override
public void onActivityPaused(Activity p0) {
}
@Override
public void onActivityStopped(Activity p0) {
}
}
在构建通知之前,只需检查 YourApplication.isChatVisible()