gpt4 book ai didi

Android:仅在离开应用程序时显示状态栏通知

转载 作者:太空宇宙 更新时间:2023-11-03 12:58:52 24 4
gpt4 key购买 nike

我有一个包含四个 Activity 的应用程序,在应用程序中,用户会发现自己不断浏览这 4 个 Activity 。该应用程序还在后台有一个正在进行的服务,该服务显示一个状态栏通知,并监听随后将出现在通知上的内容的变化。

目前,只要用户启动需要显示通知的操作,该服务就会显示通知,因此,即使您仍在使用该应用程序,也会显示通知。理想的场景是仅当用户导航出应用程序时才显示通知。

我试图像这样覆盖生命周期方法:

    @Override
protected void onPause() {
Intent intent = new Intent();
intent.setAction(MyService.ACTION_DISPLAY_PENDING_NOTIFICATION);
sendBroadcast(intent);
super.onPause();
}

@Override
protected void onResume() {
super.onResume();
Intent intent = new Intent();
intent.setAction(MyService.ACTION_CANCEL_NOTIFICATION);
sendBroadcast(intent);
}

服务是这样的:

@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();

if (action.equals(ACTION_DISPLAY_PENDING_NOTIFICATION)) {
showNotification();
}

else if (action.equals(ACTION_CANCEL_NOTIFICATION)) {
mNotificationManager.cancel(mNotId);
}
}

这行得通。但是,由于 随时 发送了 Intent ,用户离开 activity 时,当用户浏览 4 个 Activity 时,我遇到了不希望的行为和轻微的性能影响。即使从 Activity A 转到 Activiy B,或 4 个 Activity 中的任意组合,该服务也会尝试显示通知。

通知会立即取消,因为当新的 Activity B 启动时,它会在 onResume 期间调用 mNotificationManager.cancel(mNotifId),但通知已建立并显示了几分之一秒服务在离开 Activity A 时被告知这样做。这是我想要解决的行为,而不是不必要地构建和显示此通知,

有什么方法可以让我知道用户何时将 Activity 留给另一个应用,即主页等;但不在应用程序本身内?

编辑:

澄清一下, Activity 在 onPause 方法期间必须检查两件事,

a) 前台有没有之前的 Activity ?为什么?因为用户可以通过按返回键导航出 Activity ,这意味着将显示堆栈中的最后一个 Activity 。为了检查这一点,DennisDrew 的答案是可行的,我们可以这样检查:

if(!ForegroundHelper.activityExistsInForeground()){
//show your notification
}

但这不是用户导航出 Activity 的唯一方式,用户还可以按下 HomeKey,在这种情况下,无论 activityExistsInForeground() 评估为 true 还是 false,通知应该显示。

b) 用户是否要去应用程序中的另一个 Activity ?例如,用户在 Activity A 上,A 是目前在前台的唯一 Activity,用户单击启动 Activity B 的 UI 元素。尽管有 activityExistsInForeground()评估为 false,用户没有离开应用程序,他正在启动一个以前不在 freground 上的 Activity 的新实例。

我尝试添加标志,例如 private boolean launchingNewActivity = false 作为默认值,并在我知道我要去另一个 Activity 时将标志设置为 true,例如,在我的 ListView 中单击某个项目时:

litview.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
launchingNewActivity = true
startActivity2(arg2);
}
});

然后在 onPause 期间检查:

@Override
protected void onPause() {
if(!ForegroundHelper.activityExistsInForeground() && launchingNewActivity){
//show your notification
}

但是这样做,它从不显示通知,不知何故双重检查总是默认为 false。

最佳答案

如果您使用单例引用怎么办?你可以创建一个类:

public static class ForegroundHelper {
public static boolean[] activityStates = new boolean{false, false, false, false};
public static final int ACTIVITY_A = 0;
public static final int ACTIVITY_B = 1;
public static final int ACTIVITY_C = 2;
public static final int ACTIVITY_D = 3;

public static boolean activityExistsInForeground(){
for(boolean b : activityStates){
if(b)
return true;
}

return false;
}
}

然后,在每个 Activity 的 onResume() 中执行:

//For your first activity (Activity A)
ForegroundHelper.activityStates[ForegroundHelper.ACTIVITY_A] = true;

并且在每个 Activity 的 onPause() 中执行:

ForegroundHelper.activityStates[ForegroundHelper.ACTIVITY_A] = false;

然后在每个 Activity 的 onStop() 中执行:

if(!ForegroundHelper.activityExistsInForeground()){
//show your notification
}

顺便说一句,我从来没有做过这样的事情,所以我不知道它是否会完全按照我编写的代码工作......但如果这有帮助,请告诉我。

关于Android:仅在离开应用程序时显示状态栏通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14662644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com