gpt4 book ai didi

java - 如何知道我的 Activity 是否在服务中被破坏?

转载 作者:太空宇宙 更新时间:2023-11-04 09:35:43 24 4
gpt4 key购买 nike

我想要实现的是,当我从最近的应用程序中关闭我的应用程序时,我仍然可以通过通知控制我的应用程序。

一切正常,但是当我在应用程序仍在运行时单击通知中的关闭按钮时,我收到很多 NPE。

单击通知中的关闭按钮时执行的代码:

mMediaSessionCompat.setCallback(new MediaSessionCompat.Callback() {
@Override
public void onStop() {
super.onStop();
Main.unbindService(getApplicationContext());
stopSelf();
Log.d(TAG,"stop!");
}

现在,当我关闭我的应用程序,然后通过通知销毁我的服务时,一切正常。

所以我的问题是如何确定我的应用程序何时仍在运行(对用户可见或在后台(最近的应用程序))以及何时被销毁并且仅存在通知?

这样我就可以创建 if 语句,仅在应用程序被销毁时调用 stopSelf();,并且在应用程序仍在运行时不调用它。

最佳答案

也许 Application.registerActivityLifecycleCallbacks() 方法可能对您有用。您可以在应用程序的 onCreate() 方法中添加类似的内容:

registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
int activityCount = 0;

@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
activityCount++;
}

@Override
public void onActivityStarted(Activity activity) {}

@Override
public void onActivityResumed(Activity activity) {}

@Override
public void onActivityPaused(Activity activity) {}

@Override
public void onActivityStopped(Activity activity) {}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}

@Override
public void onActivityDestroyed(Activity activity) {
activityCount--;
}
});

并用它来跟踪您的任何 Activity 是否仍在运行。

编辑:好的,如果您想避免在调用 onDestroyed() 方法之前已完成的 Activity 保持挂起一段时间的情况,您可以使用更高级的方法,在 onActivityPausedonActivityStopped 中检查 Activity 是否已完成。所以你创建一个这样的类:

private class ActivityWatcher implements Application.ActivityLifecycleCallbacks {

//a set of currently running activities
private Set<Activity> activities = new HashSet<>();

@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
activities.add(activity);
}

@Override
public void onActivityStarted(Activity activity) {}

@Override
public void onActivityResumed(Activity activity) {}

@Override
public void onActivityPaused(Activity activity) {
if (activity.isFinishing()) {
activities.remove(activity);
}
}

@Override
public void onActivityStopped(Activity activity) {
if (activity.isFinishing()) {
activities.remove(activity);
}
}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}

@Override
public void onActivityDestroyed(Activity activity) {
activities.remove(activity);
}

public boolean isAnyActivityRunning() {
return !activities.isEmpty();
}
}

然后在您的应用程序类中创建一个实例并将其注册为 Activity 生命周期回调:

public class MyApplication extends Application {

private ActivityWatcher activityWatcher = new ActivityWatcher();

@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(activityWatcher);
}

public boolean isAppAlive() {
return activityWatcher.isAnyActivityRunning();
}
}

应该可以。

关于java - 如何知道我的 Activity 是否在服务中被破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56551520/

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